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/10/24 08:51:32 UTC

[isis] 01/06: ISIS-2158: major(!) ... remove static reference to MetaModelContext

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

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

commit 7b8f58918402bc8a983f1b37f8ba31e6ebe905f5
Author: Andi Huber <ah...@apache.org>
AuthorDate: Sat Oct 19 19:56:16 2019 +0200

    ISIS-2158: major(!) ... remove static reference to MetaModelContext
---
 .../applib/services/command/CommandContext.java    |   4 +-
 .../applib/services/registry/ServiceRegistry.java  |   9 +-
 .../jaxbadapters/PersistentEntityAdapter.java      |  18 +-
 .../isis/commons/internal/base/_Strings.java       |  25 +
 .../apache/isis/commons/internal/base/_With.java   |   3 +-
 .../isis/commons/internal/collections/_Lists.java  |   2 +-
 .../commons/internal/collections/_Multimaps.java   |  17 +
 .../environment/IsisSystemEnvironment.java         |  39 +-
 .../isis/commons/internal/ioc/IocContainer.java    |  78 ++
 .../internal/ioc/spring/IocContainerSpring.java    | 124 +++
 .../isis/commons/internal/ioc/spring/_Spring.java  | 175 ++---
 .../org/apache/isis/config/IsisConfigModule.java   |   5 +-
 .../org/apache/isis/config/IsisConfiguration.java  |   9 -
 .../isis/config/IsisConfigurationLegacy.java       |   4 +-
 .../facets/object/mixin/MixinIntendedAs.java       |  22 +-
 .../facets/param/name/ParameterNameFacetTest.java  |  10 +-
 .../ServiceInjectorTestUsingCodegenPlugin.java     |  13 +-
 .../apache/isis/metamodel/IsisMetamodelModule.java |   7 +-
 .../apache/isis/metamodel/MetaModelContext.java    |  47 +-
 ...modelModule.java => MetaModelContextAware.java} |   8 +-
 .../isis/metamodel/MetaModelContext_usingCDI.java  | 173 -----
 ...gSpring.java => MetaModelContext_usingIoc.java} |  58 +-
 .../apache/isis/metamodel/MetaModelContexts.java   |  19 +-
 .../isis/metamodel/adapter/ObjectAdapter.java      |   2 +-
 .../standard/AuthorizationFacetFactory.java        |   5 +-
 .../isis/metamodel/facetapi/FacetAbstract.java     |  13 +-
 .../isis/metamodel/facetapi/FacetHolder.java       |   7 +-
 .../isis/metamodel/facetapi/FacetHolderImpl.java   |  10 +-
 .../isis/metamodel/facets/CollectionUtils.java     |  17 +-
 .../metamodel/facets/FacetFactoryAbstract.java     |  30 +-
 .../action/ActionAnnotationFacetFactory.java       |  29 +-
 .../ActionDefaultsFacetViaMethodFactory.java       |   8 +-
 .../actions/layout/ActionLayoutFacetFactory.java   |  33 +-
 .../semantics/ActionSemanticsFacetAbstract.java    |   4 +-
 .../ActionValidationFacetViaMethodFactory.java     |   5 +-
 .../facets/all/i18n/TranslationFacetFactory.java   |  27 +-
 .../CollectionAccessorFacetViaAccessorFactory.java |   5 +-
 .../clear/CollectionClearFacetFactory.java         |   5 +-
 .../CollectionAnnotationFacetFactory.java          |  16 +-
 ...cetOnCollectionDerivedFromImmutableFactory.java |   3 +-
 .../layout/CollectionLayoutFacetFactory.java       |  27 +-
 ...tionAddToRemoveFromAndValidateFacetFactory.java |  11 +-
 .../facets/fallback/FallbackFacetFactory.java      |  46 +-
 .../metamodel/facets/jaxb/JaxbFacetFactory.java    |   9 +-
 ...assFacetOnActionFromConfiguredRegexFactory.java |   5 +-
 .../annotprop/CssClassFaFacetOnMemberFactory.java  |   8 +-
 .../annotprop/DescribedAsFacetOnMemberFactory.java |   3 +-
 .../DisableForSessionFacetViaMethodFactory.java    |   7 +-
 .../DisableForContextFacetViaMethodFactory.java    |   3 +-
 .../forsession/HideForSessionFacetAbstract.java    |   3 +-
 .../ViewModelSemanticCheckingFacetFactory.java     |   7 +
 .../BookmarkPolicyFacetFallbackFactory.java        |   5 +-
 .../callbacks/CreatedCallbackFacetFactory.java     |   8 +-
 .../object/callbacks/LoadCallbackFacetFactory.java |   9 +-
 .../choices/ChoicesFacetFromBoundedAbstract.java   |   3 +-
 ...ingValueFacetUsingSemanticsProviderFactory.java |   3 +-
 .../method/CssClassFacetMethodFactory.java         |   3 +-
 ...tedFacetAnnotationElseConfigurationFactory.java |   3 +-
 .../DomainObjectAnnotationFacetFactory.java        |  46 +-
 .../DomainObjectLayoutFacetFactory.java            |  45 +-
 .../DomainServiceFacetAnnotationFactory.java       |  12 +-
 .../DomainServiceLayoutFacetFactory.java           |   5 +-
 .../facets/object/grid/GridFacetFactory.java       |   3 +-
 .../facets/object/layout/LayoutFacetFactory.java   |   3 +-
 .../NavigableParentAnnotationFacetFactory.java     |   3 +-
 .../ObjectValidPropertiesFacetImplFactory.java     |   3 +-
 ...CollectionDerivedFromViewModelFacetFactory.java |   3 +-
 ...tyDerivedFromRecreatableObjectFacetFactory.java |   3 +-
 .../annotation/TitleFacetViaTitleAnnotation.java   |   8 +-
 .../title/methods/TitleFacetViaTitleMethod.java    |   8 +-
 ...cationFromMustSatisfyAnnotationOnTypeFacet.java |  84 ---
 ...ValueFacetAnnotationOrConfigurationFactory.java |   6 +-
 .../mandatory/MandatoryFacetAbstract.java          |  18 +-
 ...ParameterAutoCompleteFacetViaMethodFactory.java |   3 +-
 ...ameterFromJavaxValidationAnnotationFactory.java |   3 +-
 ...ChoicesFacetDerivedFromChoicesFacetFactory.java |   3 +-
 .../method/ActionChoicesFacetViaMethodFactory.java |   4 +-
 ...ctionParameterChoicesFacetViaMethodFactory.java |   5 +-
 ...arameterDefaultFacetDerivedFromTypeFactory.java |   3 +-
 ...tionParameterDefaultsFacetViaMethodFactory.java |   5 +-
 ...tionParameterDisabledFacetViaMethodFactory.java |   3 +-
 ...ActionParameterHiddenFacetViaMethodFactory.java |   5 +-
 .../param/layout/ParameterLayoutFacetFactory.java  |  15 +-
 .../MandatoryFacetOnParametersDefaultFactory.java  |   3 +-
 .../parameter/ParameterAnnotationFacetFactory.java |  25 +-
 ...onParameterValidationFacetViaMethodFactory.java |   3 +-
 .../accessor/PropertyAccessorFacetViaAccessor.java |   4 +-
 ...FromJavaxValidationDigitsAnnotationFactory.java |   3 +-
 ...ChoicesFacetDerivedFromChoicesFacetFactory.java |   3 +-
 ...FacetOnPropertyDerivedFromImmutableFactory.java |   3 +-
 .../property/PropertyAnnotationFacetFactory.java   |  39 +-
 .../propertylayout/PropertyLayoutFacetFactory.java |  37 +-
 .../dflt/PropertyValidateFacetDefaultFactory.java  |   5 +-
 .../PropertyValidateFacetViaMethodFactory.java     |   3 +-
 .../JodaLocalTimeValueFacetSimpleFactory.java      |   3 +-
 .../metamodel/interactions/InteractionUtils.java   |   4 +-
 .../param/DeriveFacetsPostProcessor.java           |  58 +-
 .../progmodel/ProgrammingModelAbstract.java        |  58 +-
 .../services/grid/GridSystemServiceAbstract.java   |   3 +-
 .../services/registry/ServiceRegistryDefault.java  |  16 +-
 .../apache/isis/metamodel/spec/ManagedObject.java  |  29 +-
 .../isis/metamodel/spec/feature/ObjectAction.java  |  22 +-
 .../isis/metamodel/spec/feature/ObjectMember.java  |  20 +-
 .../specloader/ProgrammingModelServiceDefault.java |   4 +-
 .../specloader/SpecificationLoaderDefault.java     |  42 +-
 .../specloader/facetprocessor/FacetProcessor.java  |  16 +-
 .../specloader/specimpl/FacetedMethodsBuilder.java |  11 +-
 .../specimpl/FacetedMethodsBuilderContext.java     |  34 -
 .../specimpl/ObjectActionContributee.java          |   2 +-
 .../specloader/specimpl/ObjectActionDefault.java   |   6 +-
 .../specloader/specimpl/ObjectActionMixedIn.java   |   2 +-
 .../specimpl/ObjectActionParameterAbstract.java    |   8 +-
 .../specloader/specimpl/ObjectMemberAbstract.java  |  10 +-
 .../specimpl/ObjectSpecificationAbstract.java      |  16 +-
 .../specimpl/OneToManyAssociationContributee.java  |  12 +-
 .../specimpl/OneToManyAssociationDefault.java      |   3 +-
 .../specimpl/OneToManyAssociationMixedIn.java      |  16 +-
 .../specimpl/OneToOneAssociationDefault.java       |   3 +-
 .../specimpl/dflt/ObjectSpecificationDefault.java  |  10 +-
 .../validator/MetaModelValidatorAbstract.java      |  10 +-
 ...etaModelValidatorForConflictingOptionality.java |   3 -
 .../MetaModelValidatorForDeprecatedAbstract.java   |   3 +-
 .../MetaModelValidatorForDeprecatedAnnotation.java |   3 +-
 ...etaModelValidatorForDeprecatedMethodPrefix.java |   3 +-
 .../MetaModelValidatorForValidationFailures.java   |  10 -
 .../validator/MetaModelValidatorVisiting.java      | 127 ++--
 .../isis/metamodel/util/snapshot/XmlSnapshot.java  |  11 +-
 .../metamodel/MetaModelContext_configTest.java     |   8 +-
 .../metamodel/MetaModelContext_forTesting.java     |  92 ++-
 .../isis/metamodel/ServiceInjector_forTesting.java |   7 +-
 .../isis/metamodel/ServiceRegistry_forTesting.java |  23 +-
 .../facets/AbstractFacetFactoryJUnit4TestCase.java |  65 +-
 .../metamodel/facets/AbstractFacetFactoryTest.java |  13 +-
 .../actions/ActionMethodsFacetFactoryTest.java     |  41 +-
 .../action/ActionAnnotationFacetFactoryTest.java   |  16 +-
 ...nnotationFacetFactoryTest_ActionInvocation.java |  16 +-
 .../ActionAnnotationFacetFactoryTest_Hidden.java   |  10 +-
 ...ctionAnnotationFacetFactoryTest_Invocation.java |   8 +-
 .../PrototypeFacetAnnotationFactoryTest.java       |   1 +
 ...tionLayoutAnnotationFacetFactoryJunit4Test.java |   1 +
 ...nLayoutXmlLayoutAnnotationFacetFactoryTest.java |   1 +
 ...etDerivedFromDomainServiceFacetFactoryTest.java |   1 +
 ...etDerivedFromDomainServiceFacetFactoryTest.java |   2 +
 .../CollectionFieldMethodsFacetFactoryTest.java    |  69 +-
 .../collections/JavaCollectionFacetTest.java       |  22 +-
 ...ollectionAnnotationFacetFactoryTest_typeOf.java |   1 +
 ...etForCollectionLayoutAnnotationFactoryTest.java |   8 +-
 .../ViewModelSemanticCheckingFacetFactoryTest.java |  14 +-
 .../object/defaults/DefaultedFacetFactoryTest.java |   1 +
 .../ObjectDisabledMethodFacetFactoryTest.java      |   1 +
 .../DomainObjectAnnotationFacetFactoryTest.java    |  24 +-
 .../DomainObjectLayoutFactoryTest.java             |   1 +
 .../ident/title/TitleFacetViaMethodTest.java       |  11 +
 .../title/TitleFacetViaMethodsFactoryTest.java     |   1 +
 .../TitleFacetViaTitleAnnotationTest.java          |  27 +-
 .../parseable/ParseableFacetUsingParserTest.java   |  52 +-
 .../ObjectValidMethodFacetFactoryTest.java         |   1 +
 ...eFacetAnnotationOrConfigurationFactoryTest.java |   1 +
 .../MemberOrderAnnotationFacetFactoryTest.java     |   1 +
 .../ParameterAnnotationFacetFactoryTest.java       |   7 +-
 ...RegExAnnotationOnParameterFacetFactoryTest.java |   1 +
 .../PropertyMethodsFacetFactoryTest.java           |  84 ++-
 .../PropertyAnnotationFacetFactoryTest.java        |   7 +-
 ...SpecificationValidatingInteractionMoreTest.java | 147 ----
 ...isfySpecificationValidatingInteractionTest.java | 141 ----
 .../BigDecimalValueSemanticsProviderTest.java      |   2 +
 .../value/BigIntValueSemanticsProviderTest.java    |   3 +
 .../value/ByteValueSemanticsProviderTest.java      |   2 +
 .../value/DoubleValueSemanticsProviderTest.java    |   2 +
 .../value/FloatValueSemanticsProviderTest.java     |   3 +
 .../value/IntValueSemanticsProviderTest.java       |   3 +
 .../JavaSqlDateValueSemanticsProviderTest.java     |   3 +
 .../JavaSqlTimeValueSemanticsProviderTest.java     |   3 +
 .../JavaUtilDateValueSemanticsProviderTest.java    |   3 +
 .../value/LongValueSemanticsProviderTest.java      |   2 +
 .../value/MoneyValueSemanticsProviderTest.java     |   3 +
 .../PercentageValueSemanticsProviderTest.java      |   2 +
 .../value/ShortValueSemanticsProviderTest.java     |   2 +
 .../ValueSemanticsProviderAbstractTestCase.java    |  33 +-
 ...odaLocalDateTimeValueSemanticsProviderTest.java |  23 +-
 ...erviceInjectorDefaultTest_validateServices.java |   4 -
 .../SpecificationLoaderTestAbstract.java           |  47 +-
 core/plugins/jaxrs-resteasy-4/pom.xml              |  62 +-
 .../conneg/RestfulObjectsJaxbWriterForXml.java     |  48 +-
 .../service/JdoPersistenceLifecycleService.java    |   5 +-
 .../isis/jdo/entities/JdoEntityTypeRegistry.java   |   6 -
 .../JdoStoreLifecycleListenerForIsis.java          |  17 +-
 .../query/JdoQueryAnnotationFacetFactory.java      |   5 +-
 ...DerivedFromJdoColumnAnnotationFacetFactory.java |   5 +-
 .../JdoPrimaryKeyAnnotationFacetFactory.java       |   7 +-
 .../persistence/IsisPersistenceSessionJdoBase.java |  21 +-
 .../isis/jdo/persistence/IsisTransactionJdo.java   |   4 +-
 .../jdo/persistence/IsisTransactionManagerJdo.java |  10 +-
 ...AnnotationFacetFactoryTest_refineMetaModel.java |  10 +-
 .../jdo/datanucleus/JDOStateManagerForIsis.java    |  20 +-
 .../PersistenceQueryFindAllInstancesProcessor.java |  20 +-
 ...sistenceQueryFindUsingApplibQueryProcessor.java |  29 +-
 .../queries/PersistenceQueryProcessorAbstract.java |   6 +-
 .../persistence/spi/JdoObjectIdSerializer.java     |  33 +-
 .../isis/jdo/jdosupport/IsisJdoSupportDN5.java     |   6 +-
 .../DataNucleusApplicationComponents5.java         |  39 +-
 .../isis/jdo/persistence/PersistenceSession5.java  |  22 +-
 .../persistence/PersistenceSessionFactory5.java    |  47 +-
 .../runtime/system/ObjectMemberAbstractTest.java   |  51 +-
 .../WrapperFactoryDefaultTest_wrappedObject.java   |  71 +-
 ...FactoryDefaultTest_wrappedObject_transient.java |  60 +-
 .../org/apache/isis/runtime/spring/IsisBoot.java   |   6 +-
 .../org/apache/isis/wrapper/AsyncWrapDefault.java  |  15 +-
 .../apache/isis/wrapper/WrapperFactoryDefault.java |  13 +-
 .../AbstractCollectionInvocationHandler.java       |   6 +-
 .../handlers/CollectionInvocationHandler.java      |   1 +
 .../DelegatingInvocationHandlerDefault.java        |   4 +-
 .../handlers/DomainObjectInvocationHandler.java    |  22 +-
 .../isis/wrapper/handlers/ProxyContextHandler.java |   4 +-
 .../AuthenticationSessionProviderDefault.java      |  12 +-
 .../background/BackgroundCommandExecution.java     |  13 +-
 .../background/CommandExecutionAbstract.java       |   4 +-
 .../background/CommandExecutorServiceDefault.java  |   3 +-
 .../command/CommandDtoServiceInternalDefault.java  |  17 +-
 .../homepage/HomePageResolverServiceDefault.java   |  19 +-
 .../services/i18n/po/TranslationServicePo.java     |  10 +-
 .../menubars/bootstrap3/MenuBarsServiceBS3.java    |   3 +-
 .../services/xmlsnapshot/XmlSnapshotBuilder.java   |  14 +-
 .../xmlsnapshot/XmlSnapshotServiceDefault.java     |  16 +-
 core/runtime-web/pom.xml                           |   7 +
 .../isis/webapp/IsisWebAppContextListener.java     |  38 +-
 .../org/apache/isis/webapp/IsisWebAppUtils.java}   |  23 +-
 .../AuthenticationSessionStrategyAbstract.java     |  24 +-
 .../AuthenticationSessionStrategyBasicAuth.java    |   3 +-
 .../auth/AuthenticationSessionStrategyDefault.java |   2 +-
 .../webapp/context/IsisWebAppCommonContext.java    | 136 ++++
 .../org/apache/isis/webapp/modules/WebModule.java  |   8 +-
 .../isis/webapp/modules/WebModuleContext.java      |   7 +-
 .../java/org/apache/isis/runtime/memento/Data.java |   7 -
 .../org/apache/isis/runtime/memento/Memento.java   |  28 +-
 .../isis/runtime/memento/ObjectAdapterMemento.java |  52 +-
 ...nGood.java => ObjectAdapterMementoDefault.java} | 166 ++---
 .../memento/ObjectAdapterMementoSupport.java       |  15 +-
 ... ObjectAdapterMementoSupport_usingDefault.java} |  35 +-
 .../memento/ObjectAdapterMementoUsingSupport.java  |  88 ---
 .../isis/runtime/memento/StandaloneData.java       |  19 +-
 .../AbstractIsisSessionTemplate.java               |  23 +-
 .../isis/runtime/system/context/IsisContext.java   | 130 +---
 .../system/context/session/RuntimeContext.java     |   3 +
 .../system/context/session/RuntimeContextBase.java |  55 +-
 .../persistence/PersistenceSessionFactory.java     |   3 +-
 .../adaptermanager/ObjectAdapterContext.java       |  22 +-
 .../ObjectAdapterContext_MementoSupport.java       |   8 +-
 .../runtime/system/session/IsisRequestCycle.java   |   4 +-
 .../isis/runtime/system/session/IsisSession.java   |  25 +-
 .../system/session/IsisSessionFactoryDefault.java  |  25 +-
 .../system/ObjectActionLayoutXmlDefaultTest.java   |  18 +-
 .../system/OneToManyAssociationDefaultTest.java    |  43 +-
 .../fixtures/LogonFixtureAuthenticator.java        |  50 --
 .../fixture/LogonFixtureAuthenticatorTest.java     |  71 --
 .../apache/isis/security/shiro/WebModuleShiro.java |   1 -
 .../ExceptionRecognizerTranslate.java              |  20 +-
 .../validate/ValidateDomainModel.java              |   8 +-
 .../jmocking/JUnitRuleMockery2.java                |   6 +-
 .../applib/domainobjects/DomainRepresentation.java |   4 +-
 .../viewer/restfulobjects/rendering/OidUtils.java  |   3 +-
 .../rendering/ReprRendererAbstract.java            |  20 +-
 .../viewer/restfulobjects/rendering/Responses.java |  32 +-
 .../AbstractObjectMemberReprRenderer.java          |   3 +-
 .../domainobjects/DomainObjectReprRenderer.java    |  20 +-
 .../rendering/domainobjects/JsonValueEncoder.java  | 830 +++------------------
 ...coder.java => JsonValueEncoder_Converters.java} | 401 +++-------
 .../domainobjects/ObjectActionReprRenderer.java    |  10 +-
 .../domainobjects/ObjectPropertyReprRenderer.java  |  23 +-
 .../domainobjects/ScalarValueReprRenderer.java     |   2 +-
 ...entNegotiationServiceForRestfulObjectsV1_0.java |  16 +-
 .../rendering/util/JsonWriterUtil.java             |  19 +-
 .../JsonValueEncoderTest_appendValueAndFormat.java |  84 ++-
 .../JsonValueEncoderTest_asAdapter.java            |  62 +-
 .../JsonValueEncoderTest_asObject.java             |  46 +-
 core/viewer-restfulobjects/server/pom.xml          |   8 +
 .../IsisRestfulObjectsSessionFilter.java           |  17 +-
 .../restfulobjects/WebModuleRestfulObjects.java    |   6 +-
 .../restfulobjects/server/ResourceContext.java     |   6 +-
 .../server/RestfulObjectsApplicationException.java |  37 -
 .../server/resources/DomainResourceHelper.java     |   6 +
 .../resources/DomainServiceResourceServerside.java |   3 +-
 .../server/resources/HealthResourceServerside.java |  13 +-
 .../server/resources/HomePageReprRenderer.java     |   3 +-
 .../server/resources/JsonParserHelper.java         |  10 +-
 .../server/resources/ResourceAbstract.java         |   6 +-
 .../server/resources/SwaggerSpecResource.java      |  35 +-
 .../IsisTransactionFilterForRestfulObjects.java    |  13 +-
 .../server/ResourceContextTest_getArg.java         |  61 +-
 ..._ensureCompatibleAcceptHeader_ContractTest.java |  43 +-
 core/viewer-wicket/impl/pom.xml                    |   9 +-
 .../wicket/viewer/IsisWicketApplication.java       | 403 +++++-----
 ...rgetRespondListenerToResetQueryResultCache.java |  11 +-
 .../imagecache/ImageResourceCacheClassPath.java    |   5 +-
 .../wicket/AnonymousWebSessionForIsis.java         |  15 +-
 .../wicket/AuthenticatedWebSessionForIsis.java     |  48 +-
 .../wicket/ConverterForObjectAdapter.java          |  11 +-
 .../wicket/ConverterForObjectAdapterMemento.java   |   8 +-
 .../integration/wicket/LocalizerForIsis.java       |  18 +-
 .../integration/wicket/WebRequestCycleForIsis.java | 531 +++++++------
 .../ObjectAdapterMementoSupportUsingSpring.java    | 224 ------
 .../ComponentFactoryRegistrarDefault.java          |   8 +-
 .../ComponentFactoryRegistryDefault.java           |  58 +-
 .../registries/pages/PageClassRegistryDefault.java |   5 +-
 .../services/EmailNotificationServiceWicket.java   |  61 --
 .../services/HintStoreUsingWicketSession.java      |   5 +-
 .../services/TranslationsResolverWicket.java       |  46 +-
 .../settings/WicketViewerSettingsDefault.java      |  14 +-
 ...uthenticatedWebSessionForIsis_Authenticate.java |  54 +-
 .../AuthenticatedWebSessionForIsis_SignIn.java     |  43 +-
 ...thenticatedWebSessionForIsis_TestAbstract.java} |  69 +-
 .../services/TranslationsResolverWicketTest.java   |   4 +-
 core/viewer-wicket/model/pom.xml                   |   2 +-
 .../wicket/model/mementos/CollectionMemento.java   |   8 +-
 .../wicket/model/mementos/PropertyMemento.java     |   7 +-
 .../viewer/wicket/model/models/AboutModel.java     |   6 +-
 .../viewer/wicket/model/models/ActionModel.java    |  91 ++-
 .../wicket/model/models/BookmarkableModel.java     |  10 +-
 .../wicket/model/models/BookmarkedPagesModel.java  |  19 +-
 .../wicket/model/models/EntityCollectionModel.java | 236 +++---
 .../viewer/wicket/model/models/EntityModel.java    | 119 +--
 .../model/models/EntityModelForReference.java      |  13 +-
 .../wicket/model/models/FormExecutorContext.java   |  14 +-
 .../model/models/HintPageParameterSerializer.java  |  80 +-
 .../viewer/wicket/model/models/ModelAbstract.java  |  42 +-
 .../viewer/wicket/model/models/ScalarModel.java    |  50 +-
 .../wicket/model/models/ServiceActionsModel.java   |  16 +-
 .../viewer/wicket/model/models/ValueModel.java     |   6 +-
 .../isis/viewer/wicket/model/models/VoidModel.java |   4 +-
 .../viewer/wicket/model/models/WelcomeModel.java   |   5 +-
 .../models/whereami/WhereAmIModelDefault.java      |  23 +-
 .../viewer/wicket/model/util/ComponentHintKey.java |  42 +-
 .../wicket/model/models/EntityModel_hintsTest.java |  33 +-
 .../ScalarModel_isScalarSubtypingAnyOf_Test.java   |  51 +-
 core/viewer-wicket/ui/pom.xml                      |  25 +-
 .../viewer/wicket/ui/ComponentFactoryAbstract.java |  18 +-
 .../ActionResultResponseHandlingStrategy.java      |  31 +-
 .../actionresponse/ActionResultResponseType.java   |  24 +-
 .../ui/app/registry/ComponentFactoryRegistrar.java |  10 +-
 .../wicket/ui/components/about/AboutPanel.java     |   8 +-
 .../ui/components/about/JarManifestModel.java      |  23 +-
 .../ui/components/actionlink/ActionLinkPanel.java  |  12 -
 .../components/actionmenu/CssClassFaBehavior.java  |   2 +
 .../actionmenu/serviceactions/CssMenuItem.java     |  10 -
 .../serviceactions/ServiceActionUtil.java          |  40 +-
 .../serviceactions/ServiceActionsPanel.java        |  10 +-
 .../serviceactions/ServiceActionsPanelFactory.java |  17 +-
 .../serviceactions/TertiaryActionsPanel.java       |   9 +-
 .../serviceactions/TertiaryMenuPanelFactory.java   |  24 +-
 .../actionprompt/ActionPromptHeaderPanel.java      |   9 +-
 .../actions/ActionFormExecutorStrategy.java        |  15 +-
 .../components/actions/ActionParametersForm.java   |   4 +-
 .../components/actions/ActionParametersPanel.java  |  14 +-
 .../bookmarkedpages/BookmarkedPagesPanel.java      |  14 +-
 .../collection/AssociatedWithActionsHelper.java    |   9 +-
 .../ui/components/collection/CollectionPanel.java  |   8 +-
 .../CollectionContentsAsAjaxTablePanel.java        |  11 +-
 .../CollectionContentsSortableDataProvider.java    |  75 +-
 .../ajaxtable/IsisAjaxNavigationToolbar.java       |  16 +-
 .../ajaxtable/IsisTotalRecordsToolbar.java         |  10 +-
 .../ajaxtable/PrototypingMessageProvider.java      |   7 +-
 .../ajaxtable/columns/ColumnAbstract.java          |  14 +-
 .../columns/ObjectAdapterPropertyColumn.java       |  21 +-
 .../columns/ObjectAdapterTitleColumn.java          |  11 +-
 .../columns/ObjectAdapterToggleboxColumn.java      |  13 +-
 .../icons/CollectionContentsAsIconsPanel.java      |   3 +-
 ...ollectionContentsMultipleViewsPanelFactory.java |   3 +-
 .../summary/CollectionContentsAsSummary.java       |  11 +-
 .../entity/EntityComponentFactoryAbstract.java     |  11 +-
 .../components/entity/fieldset/PropertyGroup.java  |  31 +-
 .../entity/icontitle/EntityIconAndTitlePanel.java  |  47 +-
 .../icontitle/EntityIconAndTitlePanelFactory.java  |  11 +-
 .../selector/links/EntityLinksSelectorPanel.java   |  12 +-
 .../wicket/ui/components/footer/FooterPanel.java   |   8 +-
 .../wicket/ui/components/header/HeaderPanel.java   |  21 +-
 .../wicket/ui/components/layout/bs3/col/Col.java   |  27 +-
 .../components/layout/bs3/tabs/TabGroupPanel.java  |  18 +-
 .../ui/components/property/PropertyEditPanel.java  |  16 +-
 .../property/PropertyFormExecutorStrategy.java     |   2 +-
 .../PropertyEditPromptHeaderPanel.java             |   5 +-
 .../scalars/ComponentFactoryScalarAbstract.java    |   5 +-
 .../ui/components/scalars/ScalarPanelAbstract.java |   3 -
 .../components/scalars/ScalarPanelAbstract2.java   |  18 +-
 .../scalars/ScalarPanelSelect2Abstract.java        |   6 +-
 .../scalars/ScalarPanelTextFieldAbstract.java      |  17 +-
 .../ScalarPanelTextFieldDatePickerAbstract.java    |  18 +-
 .../scalars/ScalarPanelTextFieldNumeric.java       |  12 +-
 .../ui/components/scalars/TextFieldValueModel.java |  13 +-
 .../datepicker/TextFieldWithDateTimePicker.java    |  39 +-
 .../scalars/isisapplib/IsisClobPanel.java          |   5 +-
 .../scalars/jdk8time/Jdk8LocalDateTimePanel.java   |   2 +-
 .../scalars/jdk8time/Jdk8OffsetDateTimePanel.java  |   2 +-
 .../scalars/jdkmath/JavaMathBigIntegerPanel.java   |   1 -
 .../scalars/jodatime/JodaDateTimePanel.java        |   2 +-
 .../scalars/jodatime/JodaLocalDateTimePanel.java   |   2 +-
 .../scalars/reference/ReferencePanel.java          |  24 +-
 .../scalars/string/StringPanelFactory.java         |   4 +-
 .../valuechoices/ValueChoicesSelect2Panel.java     |   9 +-
 .../components/tree/IsisToWicketTreeAdapter.java   |  63 +-
 .../ui/components/welcome/WelcomePanelFactory.java |  11 +-
 .../ui/components/widgets/bootstrap/FormGroup.java |   2 +
 .../components/widgets/bootstrap/ModalDialog.java  |   2 +
 .../widgets/breadcrumbs/BreadcrumbModel.java       |  24 +-
 .../breadcrumbs/BreadcrumbModelProvider.java       |   1 -
 .../widgets/breadcrumbs/BreadcrumbPanel.java       |  21 +-
 .../widgets/linkandlabel/ActionLink.java           |  28 +-
 .../linkandlabel/ActionLinkFactoryAbstract.java    |  37 +-
 .../ObjectAdapterMementoProviderAbstract.java      |  43 +-
 ...tAdapterMementoProviderForReferenceChoices.java |  18 +-
 ...entoProviderForReferenceObjectAutoComplete.java |  22 +-
 ...derForReferenceParamOrPropertyAutoComplete.java |  27 +-
 ...bjectAdapterMementoProviderForValueChoices.java |  17 +-
 .../themepicker/IsisWicketThemeSupport.java        |  16 +-
 .../themepicker/IsisWicketThemeSupportDefault.java |  19 +-
 .../widgets/themepicker/ThemeChooser.java          |  21 +-
 .../widgets/zclip/ZeroClipboardPanel.java          |  12 +-
 .../viewer/wicket/ui/errors/ExceptionModel.java    |  43 +-
 .../wicket/ui/errors/ExceptionStackTracePanel.java |   3 +-
 .../viewer/wicket/ui/errors/JGrowlBehaviour.java   |  14 +-
 .../BootstrapOverridesCssResourceReference.java    |   2 +
 .../isis/viewer/wicket/ui/pages/PageAbstract.java  | 145 ++--
 .../isis/viewer/wicket/ui/pages/WebPageBase.java   |  62 ++
 .../ui/pages/accmngt/AccountConfirmationMap.java   |   1 +
 .../accmngt/AccountManagementPageAbstract.java     |  39 +-
 .../ui/pages/accmngt/EmailAvailableValidator.java  |  38 +-
 .../pages/accmngt/UsernameAvailableValidator.java  |  35 +-
 .../password_reset/PasswordResetEmailPanel.java    |  11 +-
 .../accmngt/password_reset/PasswordResetPage.java  |   3 +-
 .../accmngt/password_reset/PasswordResetPanel.java |  18 +-
 .../ui/pages/accmngt/register/RegisterPage.java    |   2 +
 .../ui/pages/accmngt/register/RegisterPanel.java   |  58 +-
 .../pages/accmngt/signup/RegistrationFormPage.java |   1 -
 .../accmngt/signup/RegistrationFormPanel.java      |   8 +-
 .../ui/pages/actionprompt/ActionPromptPage.java    |  34 +-
 .../viewer/wicket/ui/pages/entity/EntityPage.java  |  41 +-
 .../viewer/wicket/ui/pages/error/ErrorPage.java    |   6 +-
 .../isis/viewer/wicket/ui/pages/home/HomePage.java |   4 +-
 .../wicket/ui/pages/mmverror/MmvErrorPage.java     |  23 +-
 .../isis/viewer/wicket/ui/panels/FormAbstract.java |  23 +-
 .../wicket/ui/panels/FormExecutorDefault.java      |  49 +-
 .../viewer/wicket/ui/panels/PanelAbstract.java     | 117 +--
 .../isis/viewer/wicket/ui/panels/PanelBase.java    |  92 +++
 .../isis/viewer/wicket/ui/panels/PanelUtil.java    |   9 +-
 .../wicket/ui/panels/PromptFormAbstract.java       |   5 +-
 .../wicket/ui/panels/PromptFormPanelAbstract.java  |  13 +-
 .../viewer/wicket/ui/util/CssClassRemover.java     |  13 +-
 .../apache/isis/viewer/wicket/ui/util/Links.java   |  47 +-
 .../wicket/ui/validation/ValidatorBase.java}       |  36 +-
 .../ui/ComponentFactoryAbstractTest_init.java      |  21 +-
 ...ollectionContentsSelectorDropdownPanelTest.java |  26 +-
 ...tAdapterMementoProviderForValueChoicesTest.java |  48 +-
 .../domainapp/dom/types/blob/DemoBlobStore.java    |  10 +-
 .../bdd/specs/SimpleObjectsStepDef.java            |   6 +-
 .../integtests/mml/DomainModel_IntegTest.java      |   7 +-
 ...stService.java => RestEndpointTestService.java} |   2 +-
 .../testdomain/auditing/AuditerServiceTest.java    |   6 +-
 .../bootstrapping/AutoConfigurationTest.java       |  11 +-
 .../SpringServiceProvisioningTest.java             |   7 +-
 .../DomainModelTest_usingBadDomain.java            |  12 +-
 .../DomainModelTest_usingGoodDomain.java           |  12 +-
 .../publishing/PublisherServiceTest.java           |   6 +-
 .../isis/testdomain/rest/RestServiceTest.java      |   4 +-
 .../isis/testdomain/shiro/AbstractShiroTest.java   |  40 +-
 .../isis/testdomain/shiro/ShiroLdapTest.java       |  20 +-
 .../isis/testdomain/shiro/ShiroSecmanLdapTest.java |  30 +-
 .../shiro/ShiroSecmanLdap_restfulStressTest.java   |  42 +-
 .../isis/testdomain/shiro/ShiroSecmanTest.java     |  31 +-
 .../isis/testdomain/shiro/ShiroSimpleTest.java     |   9 +-
 .../bootstrapping/builtin-singleton.list           |   1 -
 .../extensions/fixtures/FixturesEventService.java  |  63 --
 .../isis/extensions/fixtures/IsisBootFixtures.java |   1 -
 .../fixtures/fixturescripts/FixtureScript.java     |   5 +-
 .../facets/TenantedAuthorizationFacetFactory.java  |   3 +-
 .../secman/shiro/IsisModuleSecurityRealm.java      |  16 +-
 .../shiro/SecurityRealmServiceUsingShiro.java      |  11 +-
 .../specsupport/ObjectFactoryForIntegration.java   |  12 +-
 .../extensions/sse/services/SseServiceDefault.java |   4 +-
 .../sse/webapp/ServerSentEventsServlet.java        |  17 +-
 .../excel/CollectionContentsAsExcelFactory.java    |   4 +-
 479 files changed, 5521 insertions(+), 6918 deletions(-)

diff --git a/core/applib/src/main/java/org/apache/isis/applib/services/command/CommandContext.java b/core/applib/src/main/java/org/apache/isis/applib/services/command/CommandContext.java
index 25878b0..b207ff0 100644
--- a/core/applib/src/main/java/org/apache/isis/applib/services/command/CommandContext.java
+++ b/core/applib/src/main/java/org/apache/isis/applib/services/command/CommandContext.java
@@ -20,7 +20,7 @@ package org.apache.isis.applib.services.command;
 
 import javax.enterprise.context.RequestScoped;
 
-import org.springframework.stereotype.Service;
+import org.springframework.stereotype.Component;
 
 /**
  * This service (API and implementation) provides access to context information about any {@link Command}.
@@ -29,7 +29,7 @@ import org.springframework.stereotype.Service;
  * {@link org.apache.isis.applib.annotation.DomainService}.  This means that it is automatically registered and
  * available for use; no further configuration is required.
  */
-@RequestScoped @Service 
+@Component @RequestScoped  
 public class CommandContext {
 
     private Command command;
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 1a2741d..77d8a2c 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
@@ -32,7 +32,6 @@ import org.apache.isis.commons.internal._Constants;
 import org.apache.isis.commons.internal.base._Reduction;
 import org.apache.isis.commons.internal.exceptions._Exceptions;
 import org.apache.isis.commons.internal.ioc.ManagedBeanAdapter;
-import org.apache.isis.commons.internal.ioc.spring._Spring;
 import org.apache.isis.commons.internal.reflection._Reflect;
 
 import lombok.val;
@@ -53,13 +52,7 @@ public interface ServiceRegistry {
      * @return non-null
      * 
      */
-    default public <T> Bin<T> select(
-            final Class<T> type, Annotation[] qualifiers){
-
-        //CDI variant, just keep comment as a reference
-        //return _CDI.select(type, _CDI.filterQualifiers(qualifiers)); 
-        return _Spring.select(type, _Spring.filterQualifiers(qualifiers));
-    }
+    public <T> Bin<T> select(Class<T> type, Annotation[] qualifiers);
 
     /**
      * Obtains a Bin container containing any matching instances for the given required type. 
diff --git a/core/applib/src/main/java/org/apache/isis/schema/utils/jaxbadapters/PersistentEntityAdapter.java b/core/applib/src/main/java/org/apache/isis/schema/utils/jaxbadapters/PersistentEntityAdapter.java
index 6684457..c0821aa 100644
--- a/core/applib/src/main/java/org/apache/isis/schema/utils/jaxbadapters/PersistentEntityAdapter.java
+++ b/core/applib/src/main/java/org/apache/isis/schema/utils/jaxbadapters/PersistentEntityAdapter.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.
@@ -23,12 +23,16 @@ import org.apache.isis.applib.services.bookmark.Bookmark;
 import org.apache.isis.applib.services.bookmark.BookmarkService;
 import org.apache.isis.schema.common.v1.OidDto;
 
+import lombok.val;
+
 public class PersistentEntityAdapter extends XmlAdapter<OidDto, Object> {
 
+    @Inject private BookmarkService bookmarkService;
+    
     @Override
     public Object unmarshal(final OidDto oidDto) throws Exception {
 
-        final Bookmark bookmark = Bookmark.from(oidDto);
+        val bookmark = Bookmark.from(oidDto);
 
         return bookmarkService.lookup(bookmark, BookmarkService.FieldResetPolicy.DONT_REFRESH);
     }
@@ -38,15 +42,9 @@ public class PersistentEntityAdapter extends XmlAdapter<OidDto, Object> {
         if(domainObject == null) {
             return null;
         }
-        final Bookmark bookmark = getBookmarkService().bookmarkFor(domainObject);
+        val bookmark = bookmarkService.bookmarkFor(domainObject);
         return bookmark.toOidDto();
     }
 
-
-
-    protected BookmarkService getBookmarkService() {
-        return bookmarkService;
-    }
-
-    @Inject BookmarkService bookmarkService;
+    
 }
diff --git a/core/commons/src/main/java/org/apache/isis/commons/internal/base/_Strings.java b/core/commons/src/main/java/org/apache/isis/commons/internal/base/_Strings.java
index 22828de..ba83deb 100644
--- a/core/commons/src/main/java/org/apache/isis/commons/internal/base/_Strings.java
+++ b/core/commons/src/main/java/org/apache/isis/commons/internal/base/_Strings.java
@@ -19,9 +19,15 @@
 
 package org.apache.isis.commons.internal.base;
 
+import java.io.BufferedReader;
+import java.io.IOException;
 import java.io.InputStream;
+import java.io.InputStreamReader;
 import java.nio.charset.Charset;
+import java.util.ArrayList;
 import java.util.Arrays;
+import java.util.Collections;
+import java.util.List;
 import java.util.Map;
 import java.util.Optional;
 import java.util.Scanner;
@@ -437,6 +443,23 @@ public final class _Strings {
             return scanner.hasNext() ? scanner.next() : "";
         }
     }
+    
+    public static List<String> readAllLines(@Nullable final InputStream input, Charset charset) throws IOException {
+        requires(charset, "charset");
+        if(input==null) {
+            return Collections.emptyList();
+        }
+        try (BufferedReader reader = new BufferedReader(new InputStreamReader(input))) {
+            List<String> result = new ArrayList<>();
+            for (;;) {
+                String line = reader.readLine();
+                if (line == null)
+                    break;
+                result.add(line);
+            }
+            return result;
+        }
+    }
 
     // -- BYTE ARRAY CONVERSION
 
@@ -553,4 +576,6 @@ public final class _Strings {
                 .filter(not(String::isEmpty));
     }
 
+
+
 }
diff --git a/core/commons/src/main/java/org/apache/isis/commons/internal/base/_With.java b/core/commons/src/main/java/org/apache/isis/commons/internal/base/_With.java
index fa5fffb..2607220 100644
--- a/core/commons/src/main/java/org/apache/isis/commons/internal/base/_With.java
+++ b/core/commons/src/main/java/org/apache/isis/commons/internal/base/_With.java
@@ -218,7 +218,8 @@ public final class _With<T> {
      */
     public static <T> T requires(@Nullable T obj, String paramName) {
         if (obj == null) {
-            throw new NullPointerException(String.format("Parameter/Field '%s' is required to be present (not null).", paramName));
+            val msg = String.format("Parameter/Field '%s' is required to be present (not null).", paramName);
+            throw new IllegalArgumentException(msg);
         }
         return obj;
     }
diff --git a/core/commons/src/main/java/org/apache/isis/commons/internal/collections/_Lists.java b/core/commons/src/main/java/org/apache/isis/commons/internal/collections/_Lists.java
index 8f734ac..985385b 100644
--- a/core/commons/src/main/java/org/apache/isis/commons/internal/collections/_Lists.java
+++ b/core/commons/src/main/java/org/apache/isis/commons/internal/collections/_Lists.java
@@ -182,7 +182,7 @@ public final class _Lists {
         return transform(input, stream->stream.map(mapper));
     }
 
-    public static <T> List<T> filter(@Nullable Collection<T> input, Predicate<T> filter) {
+    public static <T> List<T> filter(@Nullable Collection<T> input, Predicate<? super T> filter) {
         return transform(input, stream->stream.filter(filter));
     }
 
diff --git a/core/commons/src/main/java/org/apache/isis/commons/internal/collections/_Multimaps.java b/core/commons/src/main/java/org/apache/isis/commons/internal/collections/_Multimaps.java
index b6eab50..67bffff 100644
--- a/core/commons/src/main/java/org/apache/isis/commons/internal/collections/_Multimaps.java
+++ b/core/commons/src/main/java/org/apache/isis/commons/internal/collections/_Multimaps.java
@@ -35,6 +35,7 @@ import java.util.TreeSet;
 import java.util.concurrent.ConcurrentHashMap;
 import java.util.concurrent.CopyOnWriteArrayList;
 import java.util.function.Supplier;
+import java.util.stream.Stream;
 
 import javax.annotation.Nullable;
 
@@ -92,6 +93,11 @@ public class _Multimaps {
             return getOrDefault(key, Collections.emptyList());
         }
         
+        default public Stream<V> streamElements() {
+            return values().stream()
+                    .flatMap(Collection::stream);
+        }
+        
     }
 
     /**
@@ -127,6 +133,11 @@ public class _Multimaps {
         default public Set<V> getOrElseEmpty(K key) {
             return getOrDefault(key, Collections.emptySet());
         }
+        
+        default public Stream<V> streamElements() {
+            return values().stream()
+                    .flatMap(Collection::stream);
+        }
     }
 
     /**
@@ -173,6 +184,12 @@ public class _Multimaps {
         default public Map<K2, V> getOrElseEmpty(K1 key) {
             return getOrDefault(key, Collections.emptyMap());
         }
+        
+        default public Stream<V> streamElements() {
+            return values().stream()
+                    .map(Map::values)
+                    .flatMap(Collection::stream);
+        }
     }
 
     public static <K, V> ListMultimap<K, V> newListMultimap(
diff --git a/core/commons/src/main/java/org/apache/isis/commons/internal/environment/IsisSystemEnvironment.java b/core/commons/src/main/java/org/apache/isis/commons/internal/environment/IsisSystemEnvironment.java
index 9de0d2c..0f07d34 100644
--- a/core/commons/src/main/java/org/apache/isis/commons/internal/environment/IsisSystemEnvironment.java
+++ b/core/commons/src/main/java/org/apache/isis/commons/internal/environment/IsisSystemEnvironment.java
@@ -20,17 +20,20 @@ package org.apache.isis.commons.internal.environment;
 
 import javax.annotation.PostConstruct;
 import javax.annotation.PreDestroy;
+import javax.inject.Inject;
 import javax.inject.Singleton;
 
-import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.context.ApplicationContext;
 import org.springframework.context.event.ContextClosedEvent;
+import org.springframework.context.event.ContextRefreshedEvent;
 import org.springframework.context.event.EventListener;
 import org.springframework.stereotype.Service;
 
 import org.apache.isis.commons.internal.context._Context;
-import org.apache.isis.commons.internal.ioc.spring._Spring;
+import org.apache.isis.commons.internal.ioc.IocContainer;
+import org.apache.isis.commons.internal.ioc.spring.IocContainerSpring;
 
+import lombok.Getter;
 import lombok.val;
 import lombok.extern.log4j.Log4j2;
 
@@ -43,25 +46,18 @@ import lombok.extern.log4j.Log4j2;
 @Service @Singleton @Log4j2
 public class IsisSystemEnvironment {
     
-    @Autowired 
-    private ApplicationContext springContext;
-
-    /**
-     * @deprecated - this is provided only as a stepping stone for code that currently uses static method calls
-     *               rather than having this bean injected.
-     */
-    @Deprecated
-    public static IsisSystemEnvironment get() {
-        return _Context.computeIfAbsent(IsisSystemEnvironment.class, IsisSystemEnvironment::new);
-    }
+    @Inject private ApplicationContext springContext;
+    
+    @Getter private IocContainer iocContainer; 
 
     // -- LIFE-CYCLE
     
     @PostConstruct
     public void postConstruct() {
         
+        this.iocContainer = IocContainerSpring.of(springContext);
         
-        _Spring.reinit(springContext);
+        System.err.println("####### IsisSystemEnvironment postconst " + this.hashCode());    
         
         // when NOT bootstrapped with Spring, postConstruct() never gets called
         
@@ -76,8 +72,6 @@ public class IsisSystemEnvironment {
         }
         _Context.putSingleton(IsisSystemEnvironment.class, this);
         
-        System.err.println("####### IsisSystemEnvironment postconst " + this.hashCode());
-        
     }
     
     @PreDestroy
@@ -85,15 +79,28 @@ public class IsisSystemEnvironment {
         System.err.println("####### IsisSystemEnvironment destroy " + this.hashCode());
     }
     
+    @EventListener(ContextRefreshedEvent.class)
+    public void onContextRefreshed(ContextRefreshedEvent event) {
+        // happens after all @PostConstruct
+        log.info("Context was refreshed.");
+    }
+    
     @EventListener(ContextClosedEvent.class)
     public void onContextAboutToClose(ContextClosedEvent event) {
         // happens before any @PostConstruct
         // as a consequence, no managed bean should touch the _Context during its post-construct phase
         // as it has already been cleared here
         log.info("Context about to close.");
+        this.iocContainer = null;
         _Context.clear();
     }
     
+    // -- SHORTCUTS
+    
+    public IocContainer ioc() {
+        return getIocContainer();
+    }
+    
     // -- SETUP
     
     /**
diff --git a/core/commons/src/main/java/org/apache/isis/commons/internal/ioc/IocContainer.java b/core/commons/src/main/java/org/apache/isis/commons/internal/ioc/IocContainer.java
new file mode 100644
index 0000000..7fda149
--- /dev/null
+++ b/core/commons/src/main/java/org/apache/isis/commons/internal/ioc/IocContainer.java
@@ -0,0 +1,78 @@
+/*
+ *  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.ioc;
+
+import java.lang.annotation.Annotation;
+import java.util.Map;
+import java.util.NoSuchElementException;
+import java.util.Optional;
+import java.util.Set;
+import java.util.stream.Stream;
+
+import javax.annotation.Nullable;
+
+import org.springframework.core.env.ConfigurableEnvironment;
+
+import org.apache.isis.commons.collections.Bin;
+import org.apache.isis.commons.internal.exceptions._Exceptions;
+
+/**
+ * 
+ * @since 2.0
+ *
+ */
+public interface IocContainer {
+
+    /**
+     * Returns a key/value pair copy of Spring's environment
+     * @see {@linkplain <a href="https://jira.spring.io/browse/SPR-10241">https://jira.spring.io/browse/SPR-10241</a>}
+     * @param configurableEnvironment
+     * @deprecated alternative solution {@linkplain <a href="https://stackoverflow.com/a/53950574/56880">stack-overflow</a>}
+     */
+    Map<String, String> copyEnvironmentToMap(ConfigurableEnvironment configurableEnvironment);
+
+    Stream<ManagedBeanAdapter> streamAllBeans();
+
+    <T> Bin<T> select(Class<T> requiredType);
+    
+    <T> Bin<T> select(Class<T> requiredType, Set<Annotation> qualifiersRequired);
+
+    /**
+     * @return IoC managed singleton wrapped in an Optional
+     */
+    public default <T> Optional<T> getSingleton(@Nullable Class<T> type) {
+        if(type==null) {
+            return Optional.empty();
+        }
+        return select(type).getSingleton();
+    }
+
+    /**
+     * @return IoC managed singleton
+     * @throws NoSuchElementException - if the singleton is not resolvable
+     */
+    public default <T> T getSingletonElseFail(@Nullable Class<T> type) {
+        return getSingleton(type)
+                .orElseThrow(()->_Exceptions.noSuchElement("Cannot resolve singleton '%s'", type));
+
+    }
+
+
+
+}
diff --git a/core/commons/src/main/java/org/apache/isis/commons/internal/ioc/spring/IocContainerSpring.java b/core/commons/src/main/java/org/apache/isis/commons/internal/ioc/spring/IocContainerSpring.java
new file mode 100644
index 0000000..f50aede
--- /dev/null
+++ b/core/commons/src/main/java/org/apache/isis/commons/internal/ioc/spring/IocContainerSpring.java
@@ -0,0 +1,124 @@
+/*
+ *  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.ioc.spring;
+
+import java.lang.annotation.Annotation;
+import java.util.Map;
+import java.util.NoSuchElementException;
+import java.util.Optional;
+import java.util.Set;
+import java.util.function.Predicate;
+import java.util.stream.Stream;
+
+import javax.annotation.Nullable;
+
+import org.springframework.context.ApplicationContext;
+import org.springframework.core.ResolvableType;
+import org.springframework.core.env.ConfigurableEnvironment;
+
+import org.apache.isis.commons.collections.Bin;
+import org.apache.isis.commons.internal.base._NullSafe;
+import org.apache.isis.commons.internal.collections._Sets;
+import org.apache.isis.commons.internal.exceptions._Exceptions;
+import org.apache.isis.commons.internal.ioc.IocContainer;
+import org.apache.isis.commons.internal.ioc.ManagedBeanAdapter;
+
+import static org.apache.isis.commons.internal.base._With.requires;
+
+import lombok.NonNull;
+import lombok.RequiredArgsConstructor;
+import lombok.val;
+
+/**
+ * 
+ * @since 2.0
+ *
+ */
+@RequiredArgsConstructor(staticName = "of")
+public class IocContainerSpring implements IocContainer {
+    
+    @NonNull private final ApplicationContext springContext;
+
+
+    @Override
+    public Map<String, String> copyEnvironmentToMap(
+            ConfigurableEnvironment configurableEnvironment) {
+        
+        // TODO Auto-generated method stub
+        return _Spring.copySpringEnvironmentToMap(configurableEnvironment);
+    }
+    
+    @Override
+    public Stream<ManagedBeanAdapter> streamAllBeans() {
+
+        val context = springContext;
+
+        return Stream.of(context.getBeanDefinitionNames())
+                .map(name->{
+
+                    val type = context.getType(name);
+                    val id = name; // just reuse the bean's name
+
+                    //val scope = beanFactory.getBeanDefinition(name).getScope();
+
+                    val resolvableType = ResolvableType.forClass(type);
+                    val bean = context.getBeanProvider(resolvableType);
+
+                    val beanAdapter = BeanAdapterSpring.of(id, type, bean);
+
+                    return beanAdapter;
+                });
+
+
+    }
+    
+    @Override
+    public <T> Bin<T> select(final Class<T> requiredType) {
+        requires(requiredType, "requiredType");
+
+        val allMatchingBeans = springContext.getBeanProvider(requiredType).orderedStream();
+        return Bin.ofStream(allMatchingBeans);
+    }
+
+    @Override
+    public <T> Bin<T> select(
+            final Class<T> requiredType, 
+            @Nullable Set<Annotation> qualifiersRequired) {
+
+        requires(requiredType, "requiredType");
+
+        val allMatchingBeans = springContext.getBeanProvider(requiredType)
+                .orderedStream();
+
+        if(_NullSafe.isEmpty(qualifiersRequired)) {
+            return Bin.ofStream(allMatchingBeans);
+        }
+
+        final Predicate<T> hasAllQualifiers = t -> {
+            val qualifiersPresent = _Sets.of(t.getClass().getAnnotations());
+            return qualifiersPresent.containsAll(qualifiersRequired);
+        };
+
+        return Bin.ofStream(allMatchingBeans
+                .filter(hasAllQualifiers));
+    }
+    
+    
+
+}
diff --git a/core/commons/src/main/java/org/apache/isis/commons/internal/ioc/spring/_Spring.java b/core/commons/src/main/java/org/apache/isis/commons/internal/ioc/spring/_Spring.java
index 38d844f..b2ea841 100644
--- a/core/commons/src/main/java/org/apache/isis/commons/internal/ioc/spring/_Spring.java
+++ b/core/commons/src/main/java/org/apache/isis/commons/internal/ioc/spring/_Spring.java
@@ -22,36 +22,24 @@ import java.lang.annotation.Annotation;
 import java.util.Collections;
 import java.util.Iterator;
 import java.util.Map;
-import java.util.NoSuchElementException;
-import java.util.Optional;
 import java.util.Set;
-import java.util.function.Predicate;
 import java.util.stream.Collectors;
-import java.util.stream.Stream;
 
 import javax.annotation.Nullable;
 import javax.enterprise.event.Event;
 import javax.inject.Qualifier;
 
-import org.springframework.context.ApplicationContext;
 import org.springframework.context.ApplicationEventPublisher;
 import org.springframework.context.annotation.Primary;
-import org.springframework.core.ResolvableType;
 import org.springframework.core.env.ConfigurableEnvironment;
 import org.springframework.core.env.EnumerablePropertySource;
 import org.springframework.core.env.MapPropertySource;
 import org.springframework.core.env.PropertySource;
 
-import org.apache.isis.commons.collections.Bin;
 import org.apache.isis.commons.internal.base._NullSafe;
 import org.apache.isis.commons.internal.collections._Maps;
-import org.apache.isis.commons.internal.collections._Sets;
-import org.apache.isis.commons.internal.context._Context;
-import org.apache.isis.commons.internal.exceptions._Exceptions;
-import org.apache.isis.commons.internal.ioc.ManagedBeanAdapter;
 
 import static org.apache.isis.commons.internal.base._NullSafe.stream;
-import static org.apache.isis.commons.internal.base._With.requires;
 
 import lombok.val;
 import lombok.extern.log4j.Log4j2;
@@ -69,101 +57,74 @@ import lombok.extern.log4j.Log4j2;
 @Log4j2
 public class _Spring {
 
-    public static boolean isContextAvailable() {
-        return _Context.getIfAny(ApplicationContext.class)!=null;
-    }
-
-    public static void init(ApplicationContext context) {
-        _Context.putSingleton(ApplicationContext.class, context);
-    }
-    
-    /** JUnit support */
-    public static void reinit(ApplicationContext applicationContext) {
-        _Context.remove(ApplicationContext.class);
-        _Spring.init(applicationContext);
-    }
-
-    public static ApplicationContext context() {
-        return _Context.getElseFail(ApplicationContext.class);
-    }
-
-    public static <T> Bin<T> select(final Class<T> requiredType) {
-        requires(requiredType, "requiredType");
-
-        val allMatchingBeans = context().getBeanProvider(requiredType).orderedStream();
-        return Bin.ofStream(allMatchingBeans);
-    }
-
-    public static <T> Bin<T> select(
-            final Class<T> requiredType, 
-            @Nullable Set<Annotation> qualifiersRequired) {
-
-        requires(requiredType, "requiredType");
-
-        val allMatchingBeans = context().getBeanProvider(requiredType)
-                .orderedStream();
-
-        if(_NullSafe.isEmpty(qualifiersRequired)) {
-            return Bin.ofStream(allMatchingBeans);
-        }
-
-        final Predicate<T> hasAllQualifiers = t -> {
-            val qualifiersPresent = _Sets.of(t.getClass().getAnnotations());
-            return qualifiersPresent.containsAll(qualifiersRequired);
-        };
-
-        return Bin.ofStream(allMatchingBeans
-                .filter(hasAllQualifiers));
-    }
-
-    /**
-     * 
-     * @param classifier
-     * @return
-     */
-    public static Stream<ManagedBeanAdapter> streamAllBeans() {
-
-        val context = context();
-        //val beanFactory = ((ConfigurableApplicationContext)context).getBeanFactory();
-
-        return Stream.of(context.getBeanDefinitionNames())
-                .map(name->{
-
-                    val type = context.getType(name);
-                    val id = name; // just reuse the bean's name
-
-                    //val scope = beanFactory.getBeanDefinition(name).getScope();
-
-                    val resolvableType = ResolvableType.forClass(type);
-                    val bean = context.getBeanProvider(resolvableType);
-
-                    val beanAdapter = BeanAdapterSpring.of(id, type, bean);
-
-                    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));
-
-    }
+//    public static boolean isContextAvailable() {
+//        return _Context.getIfAny(ApplicationContext.class)!=null;
+//    }
+//
+//    public static void init(ApplicationContext context) {
+//        _Context.putSingleton(ApplicationContext.class, context);
+//    }
+//    
+//    /** JUnit support */
+//    public static void reinit(ApplicationContext applicationContext) {
+//        _Context.remove(ApplicationContext.class);
+//        _Spring.init(applicationContext);
+//    }
+
+//    public static ApplicationContext context() {
+//        return _Context.getElseFail(ApplicationContext.class);
+//    }
+
+//    public static <T> Bin<T> select(final Class<T> requiredType) {
+//        requires(requiredType, "requiredType");
+//
+//        val allMatchingBeans = context().getBeanProvider(requiredType).orderedStream();
+//        return Bin.ofStream(allMatchingBeans);
+//    }
+//
+//    public static <T> Bin<T> select(
+//            final Class<T> requiredType, 
+//            @Nullable Set<Annotation> qualifiersRequired) {
+//
+//        requires(requiredType, "requiredType");
+//
+//        val allMatchingBeans = context().getBeanProvider(requiredType)
+//                .orderedStream();
+//
+//        if(_NullSafe.isEmpty(qualifiersRequired)) {
+//            return Bin.ofStream(allMatchingBeans);
+//        }
+//
+//        final Predicate<T> hasAllQualifiers = t -> {
+//            val qualifiersPresent = _Sets.of(t.getClass().getAnnotations());
+//            return qualifiersPresent.containsAll(qualifiersRequired);
+//        };
+//
+//        return Bin.ofStream(allMatchingBeans
+//                .filter(hasAllQualifiers));
+//    }
+
+
+
+//    /**
+//     * @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));
+//
+//    }
 
     public static <T> Event<T> event(ApplicationEventPublisher publisher) {
         return new EventSpring<T>(publisher);
diff --git a/core/config/src/main/java/org/apache/isis/config/IsisConfigModule.java b/core/config/src/main/java/org/apache/isis/config/IsisConfigModule.java
index a577d4a..bd1b3e3 100644
--- a/core/config/src/main/java/org/apache/isis/config/IsisConfigModule.java
+++ b/core/config/src/main/java/org/apache/isis/config/IsisConfigModule.java
@@ -52,14 +52,15 @@ public class IsisConfigModule {
         
         _Config.clear();
         
-        val rawKeyValueMap = _Spring.copySpringEnvironmentToMap(configurableEnvironment);
+        val rawKeyValueMap = isisSystemEnvironment.getIocContainer()
+                .copyEnvironmentToMap(configurableEnvironment);
         _Config.putAll(rawKeyValueMap);
 
         log.info("Spring's context was passed over to Isis");
 
         // dump config to log
         if(log.isInfoEnabled() && !isisSystemEnvironment.isUnitTesting()) {
-            log.info("\n" + _Config.getConfiguration().toStringFormatted());
+            log.info("\n" + _Config.getConfiguration().toStringFormatted(isisSystemEnvironment));
         }    
         
         val isisConfigurationLegacy = _Config.getConfiguration(); // finalize config
diff --git a/core/config/src/main/java/org/apache/isis/config/IsisConfiguration.java b/core/config/src/main/java/org/apache/isis/config/IsisConfiguration.java
index c1444f1..28a217d 100644
--- a/core/config/src/main/java/org/apache/isis/config/IsisConfiguration.java
+++ b/core/config/src/main/java/org/apache/isis/config/IsisConfiguration.java
@@ -38,7 +38,6 @@ import org.apache.isis.applib.annotation.PromptStyle;
 import org.apache.isis.applib.services.i18n.TranslationService;
 import org.apache.isis.commons.internal.base._Strings;
 import org.apache.isis.commons.internal.collections._Maps;
-import org.apache.isis.commons.internal.ioc.spring._Spring;
 import org.apache.isis.metamodel.facets.actions.action.command.CommandActionsConfiguration;
 import org.apache.isis.metamodel.facets.actions.action.publishing.PublishActionsConfiguration;
 import org.apache.isis.metamodel.facets.object.domainobject.auditing.AuditObjectsConfiguration;
@@ -52,7 +51,6 @@ import org.apache.isis.metamodel.specloader.IntrospectionMode;
 import org.apache.isis.viewer.wicket.ui.DialogMode;
 
 import lombok.Data;
-import lombok.Getter;
 
 
 /**
@@ -72,13 +70,6 @@ public class IsisConfiguration {
     @Autowired
     private ConfigurableEnvironment environment;
     
-    /**
-     * Not populated by Spring!
-     * @deprecated maybe using {@link #environment} is the better choice!?
-     */
-    @Getter(lazy = true) @Deprecated
-    private final Map<String, String> rawKeyValueMap = _Spring.copySpringEnvironmentToMap(environment);
-    
     private final Authentication authentication = new Authentication();
     @Data
     public static class Authentication {
diff --git a/core/config/src/main/java/org/apache/isis/config/IsisConfigurationLegacy.java b/core/config/src/main/java/org/apache/isis/config/IsisConfigurationLegacy.java
index e9ee658..a238b7a 100644
--- a/core/config/src/main/java/org/apache/isis/config/IsisConfigurationLegacy.java
+++ b/core/config/src/main/java/org/apache/isis/config/IsisConfigurationLegacy.java
@@ -208,7 +208,7 @@ public interface IsisConfigurationLegacy {
 
     // -- TO STRING
 
-    default public String toStringFormatted() {
+    default public String toStringFormatted(IsisSystemEnvironment isisSystemEnvironment) {
 
         val sb = new StringBuilder();
         val configuration = this.subset("isis");
@@ -217,7 +217,7 @@ public interface IsisConfigurationLegacy {
                 ConfigurationConstants.maskIfProtected(configuration.copyToMap(), TreeMap::new);
 
         String head = String.format("APACHE ISIS %s (%s) ", 
-                getVersion(), IsisSystemEnvironment.get().getDeploymentType().name());
+                getVersion(), isisSystemEnvironment.getDeploymentType().name());
         final int fillCount = 46-head.length();
         final int fillLeft = fillCount/2;
         final int fillRight = fillCount-fillLeft;
diff --git a/core/detached-tests/src/test/java/org/apache/isis/metamodel/facets/object/mixin/MixinIntendedAs.java b/core/detached-tests/src/test/java/org/apache/isis/metamodel/facets/object/mixin/MixinIntendedAs.java
index 64a6843..aed1ded 100644
--- a/core/detached-tests/src/test/java/org/apache/isis/metamodel/facets/object/mixin/MixinIntendedAs.java
+++ b/core/detached-tests/src/test/java/org/apache/isis/metamodel/facets/object/mixin/MixinIntendedAs.java
@@ -21,9 +21,8 @@ package org.apache.isis.metamodel.facets.object.mixin;
 import java.lang.reflect.Method;
 
 import org.apache.isis.applib.Identifier;
-import org.apache.isis.commons.internal.environment.IsisSystemEnvironment;
-import org.apache.isis.config.IsisConfiguration;
 import org.apache.isis.metamodel.MetaModelContext;
+import org.apache.isis.metamodel.MetaModelContext_forTesting;
 import org.apache.isis.metamodel.facetapi.FacetHolder;
 import org.apache.isis.metamodel.facetapi.FeatureType;
 import org.apache.isis.metamodel.facetapi.MethodRemover;
@@ -34,13 +33,13 @@ import org.apache.isis.metamodel.facets.MethodRemoverConstants;
 import org.apache.isis.metamodel.progmodel.ProgrammingModelAbstract;
 import org.apache.isis.metamodel.progmodel.ProgrammingModelInitFilterDefault;
 import org.apache.isis.metamodel.progmodels.dflt.ProgrammingModelFacetsJava8;
-import org.apache.isis.metamodel.specloader.SpecificationLoaderDefault;
 
 import lombok.val;
 
 abstract class MixinIntendedAs {
     
     protected ProgrammingModelFacetsJava8 programmingModel;
+    private MetaModelContext metaModelContext;
 
     protected void setUp() throws Exception {
 
@@ -48,18 +47,14 @@ abstract class MixinIntendedAs {
         
         // PRODUCTION
 
-        MetaModelContext.preset(MetaModelContext.builder()
-                .specificationLoader(SpecificationLoaderDefault.getInstance(
-                        new IsisConfiguration(),
-                        new IsisSystemEnvironment(),
-                        programmingModel))
-//                .serviceInjector(mockServiceInjector)
-//                .serviceRegistry(mockServiceRegistry)
-                .build());
+        metaModelContext = MetaModelContext_forTesting.builder()
+                .programmingModel(programmingModel)
+                .build();
         
-        ((ProgrammingModelAbstract)programmingModel).init(new ProgrammingModelInitFilterDefault());
-        MetaModelContext.current().getSpecificationLoader().createMetaModel();
+        ((ProgrammingModelAbstract)programmingModel)
+        .init(new ProgrammingModelInitFilterDefault(), metaModelContext);
         
+        metaModelContext.getSpecificationLoader().createMetaModel();
     }
 
     protected void tearDown() {
@@ -78,6 +73,7 @@ abstract class MixinIntendedAs {
         
         val facetHolder = new AbstractFacetFactoryTest.IdentifiedHolderImpl(
               Identifier.classIdentifier(type));
+        facetHolder.setMetaModelContext(metaModelContext);
         
         val processClassContext = 
                 new FacetFactory.ProcessClassContext(
diff --git a/core/detached-tests/src/test/java/org/apache/isis/metamodel/facets/param/name/ParameterNameFacetTest.java b/core/detached-tests/src/test/java/org/apache/isis/metamodel/facets/param/name/ParameterNameFacetTest.java
index ef488f7..9a2aed9 100644
--- a/core/detached-tests/src/test/java/org/apache/isis/metamodel/facets/param/name/ParameterNameFacetTest.java
+++ b/core/detached-tests/src/test/java/org/apache/isis/metamodel/facets/param/name/ParameterNameFacetTest.java
@@ -26,6 +26,7 @@ import org.junit.Before;
 import org.junit.Test;
 
 import org.apache.isis.applib.annotation.ParameterLayout;
+import org.apache.isis.metamodel.MetaModelContext_forTesting;
 import org.apache.isis.metamodel.facets.AbstractFacetFactoryJUnit4TestCase;
 import org.apache.isis.metamodel.facets.FacetFactory;
 import org.apache.isis.metamodel.facets.all.named.NamedFacet;
@@ -36,6 +37,8 @@ import org.apache.isis.metamodel.progmodels.dflt.ProgrammingModelFacetsJava8;
 import static org.hamcrest.CoreMatchers.is;
 import static org.junit.Assert.assertThat;
 
+import lombok.val;
+
 /**
  * Detached from its module because we need the javac -parameter flag set when compiling this test 
  */
@@ -47,7 +50,12 @@ public class ParameterNameFacetTest extends AbstractFacetFactoryJUnit4TestCase {
     @Before
     public void setUp() throws Exception {
         programmingModel = new ProgrammingModelFacetsJava8();
-        ((ProgrammingModelAbstract)programmingModel).init(new ProgrammingModelInitFilterDefault());
+        
+        val metaModelContext = MetaModelContext_forTesting.builder().build();
+        
+        ((ProgrammingModelAbstract)programmingModel)
+        .init(new ProgrammingModelInitFilterDefault(), metaModelContext);
+        
         super.setUpFacetedMethodAndParameter();
     }
 
diff --git a/core/detached-tests/src/test/java/org/apache/isis/runtime/services/ServiceInjectorTestUsingCodegenPlugin.java b/core/detached-tests/src/test/java/org/apache/isis/runtime/services/ServiceInjectorTestUsingCodegenPlugin.java
index beef8e1..820e6a4 100644
--- a/core/detached-tests/src/test/java/org/apache/isis/runtime/services/ServiceInjectorTestUsingCodegenPlugin.java
+++ b/core/detached-tests/src/test/java/org/apache/isis/runtime/services/ServiceInjectorTestUsingCodegenPlugin.java
@@ -36,8 +36,7 @@ import org.junit.Test;
 
 import org.apache.isis.applib.services.inject.ServiceInjector;
 import org.apache.isis.applib.services.registry.ServiceRegistry;
-import org.apache.isis.metamodel.MetaModelContext;
-import org.apache.isis.runtime.system.context.IsisContext;
+import org.apache.isis.metamodel.MetaModelContext_forTesting;
 import org.apache.isis.unittestsupport.jmocking.JUnitRuleMockery2;
 
 import static org.hamcrest.CoreMatchers.is;
@@ -52,19 +51,21 @@ public class ServiceInjectorTestUsingCodegenPlugin {
     private ServiceRegistry serviceRegistry;
     private ServiceInjector serviceInjector;
 
+    private MetaModelContext_forTesting metaModelContext;
+
 
     @Before
     public void setUp() throws Exception {
 
         serviceInstantiator = new ServiceInstantiator();
 
-        MetaModelContext.preset(MetaModelContext.builder()
+        metaModelContext = MetaModelContext_forTesting.builder()
                 .singleton(serviceInstantiator.createInstance(SingletonCalculator.class))
                 .singleton(serviceInstantiator.createInstance(AccumulatingCalculator.class))
-                .build());
+                .build();
 
-        serviceRegistry = IsisContext.getServiceRegistry();
-        serviceInjector = IsisContext.getServiceInjector();
+        serviceRegistry = metaModelContext.getServiceRegistry();
+        serviceInjector = metaModelContext.getServiceInjector();
     }
 
     @Test
diff --git a/core/metamodel/src/main/java/org/apache/isis/metamodel/IsisMetamodelModule.java b/core/metamodel/src/main/java/org/apache/isis/metamodel/IsisMetamodelModule.java
index 51a0f09..3be0781 100644
--- a/core/metamodel/src/main/java/org/apache/isis/metamodel/IsisMetamodelModule.java
+++ b/core/metamodel/src/main/java/org/apache/isis/metamodel/IsisMetamodelModule.java
@@ -18,6 +18,11 @@
  */
 package org.apache.isis.metamodel;
 
-public final class IsisMetamodelModule {
+import lombok.AccessLevel;
+import lombok.NoArgsConstructor;
 
+@NoArgsConstructor(access = AccessLevel.PRIVATE)
+public final class IsisMetamodelModule {
+  
+    
 }
diff --git a/core/metamodel/src/main/java/org/apache/isis/metamodel/MetaModelContext.java b/core/metamodel/src/main/java/org/apache/isis/metamodel/MetaModelContext.java
index 73443bc..3e80bad 100644
--- a/core/metamodel/src/main/java/org/apache/isis/metamodel/MetaModelContext.java
+++ b/core/metamodel/src/main/java/org/apache/isis/metamodel/MetaModelContext.java
@@ -27,13 +27,13 @@ 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.commons.internal.environment.IsisSystemEnvironment;
 import org.apache.isis.config.IsisConfiguration;
 import org.apache.isis.config.IsisConfigurationLegacy;
-import org.apache.isis.metamodel.MetaModelContext_forTesting.MetaModelContext_forTestingBuilder;
 import org.apache.isis.metamodel.adapter.ObjectAdapter;
 import org.apache.isis.metamodel.adapter.ObjectAdapterProvider;
 import org.apache.isis.metamodel.services.homepage.HomePageAction;
+import org.apache.isis.metamodel.spec.ManagedObject;
 import org.apache.isis.metamodel.spec.ObjectSpecification;
 import org.apache.isis.metamodel.specloader.SpecificationLoader;
 import org.apache.isis.security.authentication.AuthenticationSession;
@@ -49,9 +49,11 @@ import org.apache.isis.security.authorization.manager.AuthorizationManager;
 public interface MetaModelContext {
 
     // -- INTERFACE
-
+    @Deprecated
     IsisConfigurationLegacy getConfigurationLegacy();
     
+    IsisSystemEnvironment getSystemEnvironment();
+    
     /**
      * 
      * Configuration 'beans' with meta-data (IDE-support).
@@ -74,8 +76,6 @@ public interface MetaModelContext {
 
     TranslationService getTranslationService();
 
-    AuthenticationSession getAuthenticationSession();
-
     AuthorizationManager getAuthorizationManager();
 
     AuthenticationManager getAuthenticationManager();
@@ -95,21 +95,13 @@ public interface MetaModelContext {
     Stream<ObjectAdapter> streamServiceAdapters();
 
     ObjectAdapter lookupServiceAdapterById(String serviceId);
-
-    // -- PRESET INSTANCES
-
-    static MetaModelContext current() {
-        return _Context.computeIfAbsent(MetaModelContext.class, 
-                __->MetaModelContexts.usingSpring()); // default
-    }
-
-    static void preset(MetaModelContext metaModelContext) {
-        _Context.clear();
-        _Context.putSingleton(MetaModelContext.class, metaModelContext);
-    }
-
-    static MetaModelContext_forTestingBuilder builder() {
-        return MetaModelContext_forTesting.builder();
+    
+    <T> T getSingletonElseFail(Class<T> type);
+    
+    // -- EXTRACTORS
+    
+    public static MetaModelContext from(ManagedObject adapter) {
+        return adapter.getSpecification().getMetaModelContext();
     }
 
     // -- DELEGATION - FOR THOSE THAT IMPLEMENT THROUGH DELEGATION
@@ -124,6 +116,11 @@ public interface MetaModelContext {
         }
         
         @Override
+        default IsisSystemEnvironment getSystemEnvironment() {
+            return getMetaModelContext().getSystemEnvironment();
+        }
+        
+        @Override
         public default IsisConfiguration getConfiguration() {
             return getMetaModelContext().getConfiguration();
         }
@@ -158,9 +155,8 @@ public interface MetaModelContext {
             return getMetaModelContext().getTranslationService();
         }
 
-        @Override
-        public default AuthenticationSession getAuthenticationSession() {
-            return getMetaModelContext().getAuthenticationSession();
+        default AuthenticationSession getAuthenticationSession() {
+            return getAuthenticationSessionProvider().getAuthenticationSession();
         }
 
         @Override
@@ -212,6 +208,11 @@ public interface MetaModelContext {
         default ObjectAdapter lookupServiceAdapterById(String serviceId) {
             return getMetaModelContext().lookupServiceAdapterById(serviceId);
         }
+        
+        @Override
+        default <T> T getSingletonElseFail(Class<T> type) {
+            return getMetaModelContext().getSingletonElseFail(type);
+        }
 
     }
     
diff --git a/core/metamodel/src/main/java/org/apache/isis/metamodel/IsisMetamodelModule.java b/core/metamodel/src/main/java/org/apache/isis/metamodel/MetaModelContextAware.java
similarity index 86%
copy from core/metamodel/src/main/java/org/apache/isis/metamodel/IsisMetamodelModule.java
copy to core/metamodel/src/main/java/org/apache/isis/metamodel/MetaModelContextAware.java
index 51a0f09..4c01a1d 100644
--- a/core/metamodel/src/main/java/org/apache/isis/metamodel/IsisMetamodelModule.java
+++ b/core/metamodel/src/main/java/org/apache/isis/metamodel/MetaModelContextAware.java
@@ -18,6 +18,12 @@
  */
 package org.apache.isis.metamodel;
 
-public final class IsisMetamodelModule {
+/**
+ * 
+ * @since 2.0
+ *
+ */
+public interface MetaModelContextAware {
 
+    void setMetaModelContext(MetaModelContext metaModelContext);
 }
diff --git a/core/metamodel/src/main/java/org/apache/isis/metamodel/MetaModelContext_usingCDI.java b/core/metamodel/src/main/java/org/apache/isis/metamodel/MetaModelContext_usingCDI.java
deleted file mode 100644
index 3c7b0e4..0000000
--- a/core/metamodel/src/main/java/org/apache/isis/metamodel/MetaModelContext_usingCDI.java
+++ /dev/null
@@ -1,173 +0,0 @@
-/*
- *  Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you under the Apache License, Version 2.0 (the
- *  "License"); you may not use this file except in compliance
- *  with the License.  You may obtain a copy of the License at
- *
- *        http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing,
- *  software distributed under the License is distributed on an
- *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- *  KIND, either express or implied.  See the License for the
- *  specific language governing permissions and limitations
- *  under the License.
- */
-package org.apache.isis.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.exceptions._Exceptions;
-import org.apache.isis.commons.internal.ioc.cdi._CDI;
-import org.apache.isis.config.IsisConfiguration;
-import org.apache.isis.config.IsisConfigurationLegacy;
-import org.apache.isis.config.internal._Config;
-import org.apache.isis.metamodel.adapter.ObjectAdapter;
-import org.apache.isis.metamodel.adapter.ObjectAdapterProvider;
-import org.apache.isis.metamodel.services.ServiceUtil;
-import org.apache.isis.metamodel.services.homepage.HomePageAction;
-import org.apache.isis.metamodel.services.homepage.HomePageResolverService;
-import org.apache.isis.metamodel.spec.ObjectSpecification;
-import org.apache.isis.metamodel.specloader.SpecificationLoader;
-import org.apache.isis.security.authentication.AuthenticationSession;
-import org.apache.isis.security.authentication.AuthenticationSessionProvider;
-import org.apache.isis.security.authentication.manager.AuthenticationManager;
-import org.apache.isis.security.authorization.manager.AuthorizationManager;
-
-import lombok.Getter;
-import lombok.val;
-
-class MetaModelContext_usingCDI implements MetaModelContext {
-
-    @Getter(lazy=true) 
-    private final IsisConfigurationLegacy configurationLegacy = 
-    _Config.getConfiguration();
-
-    @Getter(lazy=true) 
-    private final IsisConfiguration configuration = 
-    _CDI.getSingletonElseFail(IsisConfiguration.class);
-    
-    @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);
-
-    @Getter(lazy=true) 
-    private final HomePageResolverService homePageResolverService =
-    _CDI.getSingletonElseFail(HomePageResolverService.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().currentTransactionState();
-    }
-
-    @Override
-    public final HomePageAction getHomePageAction() {
-        return getHomePageResolverService().getHomePageAction();
-    }
-
-    // -- 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().streamRegisteredBeans()
-                .map(objectAdapterProvider::adapterForBean) 
-                .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));
-    }
-
-    // -------------------------------------------------------------------------------
-
-
-}
\ No newline at end of file
diff --git a/core/metamodel/src/main/java/org/apache/isis/metamodel/MetaModelContext_usingSpring.java b/core/metamodel/src/main/java/org/apache/isis/metamodel/MetaModelContext_usingIoc.java
similarity index 80%
rename from core/metamodel/src/main/java/org/apache/isis/metamodel/MetaModelContext_usingSpring.java
rename to core/metamodel/src/main/java/org/apache/isis/metamodel/MetaModelContext_usingIoc.java
index 7fd534b..dae3c9c 100644
--- a/core/metamodel/src/main/java/org/apache/isis/metamodel/MetaModelContext_usingSpring.java
+++ b/core/metamodel/src/main/java/org/apache/isis/metamodel/MetaModelContext_usingIoc.java
@@ -31,8 +31,9 @@ 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.environment.IsisSystemEnvironment;
 import org.apache.isis.commons.internal.exceptions._Exceptions;
-import org.apache.isis.commons.internal.ioc.spring._Spring;
+import org.apache.isis.commons.internal.ioc.IocContainer;
 import org.apache.isis.config.IsisConfiguration;
 import org.apache.isis.config.IsisConfigurationLegacy;
 import org.apache.isis.config.internal._Config;
@@ -44,7 +45,6 @@ import org.apache.isis.metamodel.services.homepage.HomePageResolverService;
 import org.apache.isis.metamodel.services.persistsession.PersistenceSessionServiceInternal;
 import org.apache.isis.metamodel.spec.ObjectSpecification;
 import org.apache.isis.metamodel.specloader.SpecificationLoader;
-import org.apache.isis.security.authentication.AuthenticationSession;
 import org.apache.isis.security.authentication.AuthenticationSessionProvider;
 import org.apache.isis.security.authentication.manager.AuthenticationManager;
 import org.apache.isis.security.authorization.manager.AuthorizationManager;
@@ -52,72 +52,74 @@ import org.apache.isis.security.authorization.manager.AuthorizationManager;
 import lombok.Getter;
 import lombok.val;
 
-class MetaModelContext_usingSpring implements MetaModelContext {
+
+class MetaModelContext_usingIoc implements MetaModelContext {
+
+    private final IocContainer iocContainer;
+    public MetaModelContext_usingIoc(IocContainer iocContainer) {
+        this.iocContainer = iocContainer;
+    }
 
     @Getter(lazy=true) 
     private final IsisConfigurationLegacy configurationLegacy = 
     _Config.getConfiguration();
 
     @Getter(lazy=true) 
+    private final IsisSystemEnvironment systemEnvironment = 
+    getSingletonElseFail(IsisSystemEnvironment.class);
+    
+    @Getter(lazy=true) 
     private final IsisConfiguration configuration = 
-    _Spring.getSingletonElseFail(IsisConfiguration.class);
+    getSingletonElseFail(IsisConfiguration.class);
 
     @Getter(lazy=true) 
     private final ObjectAdapterProvider objectAdapterProvider =
-    _Spring.getSingletonElseFail(PersistenceSessionServiceInternal.class);
+    getSingletonElseFail(PersistenceSessionServiceInternal.class);
 
     @Getter(lazy=true) 
     private final ServiceInjector serviceInjector =
-    _Spring.getSingletonElseFail(ServiceInjector.class);
+    getSingletonElseFail(ServiceInjector.class);
 
     @Getter(lazy=true) 
     private final ServiceRegistry serviceRegistry =
-    _Spring.getSingletonElseFail(ServiceRegistry.class);
+    getSingletonElseFail(ServiceRegistry.class);
 
     @Getter(lazy=true) 
     private final SpecificationLoader specificationLoader = 
-    _Spring.getSingletonElseFail(SpecificationLoader.class);
+    getSingletonElseFail(SpecificationLoader.class);
 
     @Getter(lazy=true) 
     private final AuthenticationSessionProvider authenticationSessionProvider =
-    _Spring.getSingletonElseFail(AuthenticationSessionProvider.class);
+    getSingletonElseFail(AuthenticationSessionProvider.class);
 
     @Getter(lazy=true) 
     private final TranslationService translationService =
-    _Spring.getSingletonElseFail(TranslationService.class);
+    getSingletonElseFail(TranslationService.class);
 
     @Getter(lazy=true) 
     private final AuthorizationManager authorizationManager =
-    _Spring.getSingletonElseFail(AuthorizationManager.class); 
+    getSingletonElseFail(AuthorizationManager.class); 
 
     @Getter(lazy=true) 
     private final AuthenticationManager authenticationManager =
-    _Spring.getSingletonElseFail(AuthenticationManager.class);
+    getSingletonElseFail(AuthenticationManager.class);
 
     @Getter(lazy=true) 
     private final TitleService titleService =
-    _Spring.getSingletonElseFail(TitleService.class);
-
-    //        @Getter(lazy=true) 
-    //        private final ObjectAdapterService objectAdapterService =
-    //        _CDI.getSingletonElseFail(ObjectAdapterService.class);
+    getSingletonElseFail(TitleService.class);
 
     @Getter(lazy=true) 
     private final RepositoryService repositoryService =
-    _Spring.getSingletonElseFail(RepositoryService.class);
+    getSingletonElseFail(RepositoryService.class);
 
     @Getter(lazy=true) 
     private final TransactionService transactionService =
-    _Spring.getSingletonElseFail(TransactionService.class);
+    getSingletonElseFail(TransactionService.class);
 
     @Getter(lazy=true) 
     private final HomePageResolverService homePageResolverService =
-    _Spring.getSingletonElseFail(HomePageResolverService.class);
+    getSingletonElseFail(HomePageResolverService.class);
 
-    @Override
-    public final AuthenticationSession getAuthenticationSession() {
-        return getAuthenticationSessionProvider().getAuthenticationSession();
-    }
 
     @Override
     public final ObjectSpecification getSpecification(final Class<?> type) {
@@ -146,6 +148,12 @@ class MetaModelContext_usingSpring implements MetaModelContext {
         return objectAdaptersForBeansOfKnownSort.get().get(serviceId);
     }
 
+    // -- LOOKUP
+
+    @Override
+    public <T> T getSingletonElseFail(Class<T> type) {
+        return iocContainer.getSingletonElseFail(type);
+    }
 
     // -- HELPER
 
@@ -172,4 +180,6 @@ class MetaModelContext_usingSpring implements MetaModelContext {
     }
 
 
+
+
 }
\ No newline at end of file
diff --git a/core/metamodel/src/main/java/org/apache/isis/metamodel/MetaModelContexts.java b/core/metamodel/src/main/java/org/apache/isis/metamodel/MetaModelContexts.java
index 879f55c..57b9cc6 100644
--- a/core/metamodel/src/main/java/org/apache/isis/metamodel/MetaModelContexts.java
+++ b/core/metamodel/src/main/java/org/apache/isis/metamodel/MetaModelContexts.java
@@ -18,19 +18,24 @@
  */
 package org.apache.isis.metamodel;
 
+import javax.inject.Singleton;
+
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+
+import org.apache.isis.commons.internal.environment.IsisSystemEnvironment;
+
 /**
  * 
  * @since 2.0
  *
  */
-public final class MetaModelContexts {
-
-    final static MetaModelContext usingCDI() {
-        return new MetaModelContext_usingCDI();
-    }
+@Configuration
+public class MetaModelContexts {
 
-    final static MetaModelContext usingSpring() {
-        return new MetaModelContext_usingSpring();
+    @Bean @Singleton
+    public MetaModelContext metaModelContext(IsisSystemEnvironment systemEnvironment) {
+        return new MetaModelContext_usingIoc(systemEnvironment.getIocContainer());
     }
 
 }
diff --git a/core/metamodel/src/main/java/org/apache/isis/metamodel/adapter/ObjectAdapter.java b/core/metamodel/src/main/java/org/apache/isis/metamodel/adapter/ObjectAdapter.java
index 568d1dc..55bb42e 100644
--- a/core/metamodel/src/main/java/org/apache/isis/metamodel/adapter/ObjectAdapter.java
+++ b/core/metamodel/src/main/java/org/apache/isis/metamodel/adapter/ObjectAdapter.java
@@ -127,7 +127,7 @@ public interface ObjectAdapter extends ManagedObject {
         }
 
         public static String unwrapPojoStringElse(final ManagedObject adapter, String orElse) {
-            final Object obj = unwrapPojo(adapter);
+            final Object obj = ManagedObject.unwrapPojo(adapter);
             if (obj == null) {
                 return null;
             }
diff --git a/core/metamodel/src/main/java/org/apache/isis/metamodel/authorization/standard/AuthorizationFacetFactory.java b/core/metamodel/src/main/java/org/apache/isis/metamodel/authorization/standard/AuthorizationFacetFactory.java
index ee21870..adcba1f 100644
--- a/core/metamodel/src/main/java/org/apache/isis/metamodel/authorization/standard/AuthorizationFacetFactory.java
+++ b/core/metamodel/src/main/java/org/apache/isis/metamodel/authorization/standard/AuthorizationFacetFactory.java
@@ -20,7 +20,6 @@
 package org.apache.isis.metamodel.authorization.standard;
 
 import org.apache.isis.metamodel.facetapi.FacetHolder;
-import org.apache.isis.metamodel.facetapi.FacetUtil;
 import org.apache.isis.metamodel.facetapi.FeatureType;
 import org.apache.isis.metamodel.facets.FacetFactoryAbstract;
 
@@ -32,12 +31,12 @@ public class AuthorizationFacetFactory extends FacetFactoryAbstract {
 
     @Override
     public void process(final ProcessClassContext processClassContext) {
-        FacetUtil.addFacet(createFacet(processClassContext.getFacetHolder()));
+        super.addFacet(createFacet(processClassContext.getFacetHolder()));
     }
 
     @Override
     public void process(final ProcessMethodContext processMethodContext) {
-        FacetUtil.addFacet(createFacet(processMethodContext.getFacetHolder()));
+        super.addFacet(createFacet(processMethodContext.getFacetHolder()));
     }
 
     private AuthorizationFacetImpl createFacet(final FacetHolder holder) {
diff --git a/core/metamodel/src/main/java/org/apache/isis/metamodel/facetapi/FacetAbstract.java b/core/metamodel/src/main/java/org/apache/isis/metamodel/facetapi/FacetAbstract.java
index d1c0c0c..40cc3e1 100644
--- a/core/metamodel/src/main/java/org/apache/isis/metamodel/facetapi/FacetAbstract.java
+++ b/core/metamodel/src/main/java/org/apache/isis/metamodel/facetapi/FacetAbstract.java
@@ -56,6 +56,7 @@ public abstract class FacetAbstract implements Facet, MetaModelContext.Delegatin
             final Class<? extends Facet> facetType,
             final FacetHolder holder,
             final Derivation derivation) {
+        
         this.facetType = requires(facetType, "facetType"); 
         setFacetHolder(holder);
         this.derived = (derivation == Derivation.DERIVED);
@@ -70,6 +71,11 @@ public abstract class FacetAbstract implements Facet, MetaModelContext.Delegatin
     public FacetHolder getFacetHolder() {
         return holder;
     }
+    
+    @Override
+    public MetaModelContext getMetaModelContext() {
+        return holder.getMetaModelContext();
+    }
 
     @Override
     public boolean isDerived() {
@@ -241,12 +247,5 @@ public abstract class FacetAbstract implements Facet, MetaModelContext.Delegatin
     public static interface Validating {
     }
 
-    // -- dependencies
-
-    @Override
-    public MetaModelContext getMetaModelContext() {
-        return MetaModelContext.current();
-    }
-
 
 }
diff --git a/core/metamodel/src/main/java/org/apache/isis/metamodel/facetapi/FacetHolder.java b/core/metamodel/src/main/java/org/apache/isis/metamodel/facetapi/FacetHolder.java
index d51e912..7be0edf 100644
--- a/core/metamodel/src/main/java/org/apache/isis/metamodel/facetapi/FacetHolder.java
+++ b/core/metamodel/src/main/java/org/apache/isis/metamodel/facetapi/FacetHolder.java
@@ -22,6 +22,7 @@ package org.apache.isis.metamodel.facetapi;
 import java.util.stream.Stream;
 
 import org.apache.isis.commons.internal.base._NullSafe;
+import org.apache.isis.metamodel.MetaModelContext;
 
 /**
  * Anything in the metamodel (which also includes peers in the reflector) that
@@ -107,6 +108,10 @@ public interface FacetHolder {
     void removeFacet(Class<? extends Facet> facetType);
 
 
-
+    /**
+     * 
+     * @since 2.0
+     */
+    MetaModelContext getMetaModelContext();
 
 }
diff --git a/core/metamodel/src/main/java/org/apache/isis/metamodel/facetapi/FacetHolderImpl.java b/core/metamodel/src/main/java/org/apache/isis/metamodel/facetapi/FacetHolderImpl.java
index ab962e0..f1deac1 100644
--- a/core/metamodel/src/main/java/org/apache/isis/metamodel/facetapi/FacetHolderImpl.java
+++ b/core/metamodel/src/main/java/org/apache/isis/metamodel/facetapi/FacetHolderImpl.java
@@ -27,14 +27,22 @@ import java.util.stream.Stream;
 
 import org.apache.isis.commons.internal.base._Casts;
 import org.apache.isis.commons.internal.base._NullSafe;
+import org.apache.isis.metamodel.MetaModelContext;
+import org.apache.isis.metamodel.MetaModelContextAware;
 
 import static org.apache.isis.commons.internal.base._Casts.uncheckedCast;
 
+import lombok.Getter;
+import lombok.Setter;
+
 /**
  * For base subclasses or, more likely, to help write tests.
  */
-public class FacetHolderImpl implements FacetHolder {
+public class FacetHolderImpl implements FacetHolder, MetaModelContextAware {
 
+    @Getter(onMethod = @__(@Override)) @Setter(onMethod = @__(@Override))
+    private MetaModelContext metaModelContext;
+    
     private final Map<Class<? extends Facet>, Facet> facetsByClass = new ConcurrentHashMap<>();
     private final Set<Class<? extends Facet>> implementedFacetInterfaces = new HashSet<>();
 
diff --git a/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/CollectionUtils.java b/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/CollectionUtils.java
index 7d0f421..7b91b2e 100644
--- a/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/CollectionUtils.java
+++ b/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/CollectionUtils.java
@@ -36,21 +36,16 @@ import java.util.concurrent.CopyOnWriteArraySet;
 import java.util.function.Function;
 import java.util.stream.Stream;
 
-import org.apache.isis.commons.internal.assertions._Assert;
 import org.apache.isis.commons.internal.base._Casts;
 import org.apache.isis.commons.internal.base._With;
 import org.apache.isis.commons.internal.collections._Arrays;
 import org.apache.isis.commons.internal.collections._Lists;
 import org.apache.isis.commons.internal.collections._Sets;
-import org.apache.isis.metamodel.MetaModelContext;
 import org.apache.isis.metamodel.adapter.ObjectAdapter;
 import org.apache.isis.metamodel.adapter.ObjectAdapterProvider;
 import org.apache.isis.metamodel.facets.collections.modify.CollectionFacet;
-import org.apache.isis.metamodel.spec.ManagedObject;
 import org.apache.isis.metamodel.spec.ObjectSpecification;
 
-import lombok.val;
-
 public final class CollectionUtils {
 
     private CollectionUtils() {
@@ -64,12 +59,12 @@ public final class CollectionUtils {
         final ObjectAdapter collection = adapterProvider.adapterFor(optionPojo);
         final CollectionFacet facet = CollectionFacet.Utils.getCollectionFacetFromSpec(collection);
         
-        {//TODO[2158] migrate
-            val mo = ManagedObject.of(MetaModelContext.current().getSpecification(optionPojo.getClass()), optionPojo);
-            val collectionFacet =  CollectionFacet.Utils.getCollectionFacetFromSpec(mo);
-            _Assert.assertEquals("expected same", 
-                    facet, collectionFacet);
-        }
+//        {//TODO[2158] migrate
+//            val mo = ManagedObject.forPojo(optionPojo);
+//            val collectionFacet =  CollectionFacet.Utils.getCollectionFacetFromSpec(mo);
+//            _Assert.assertEquals("expected same", 
+//                    facet, collectionFacet);
+//        }
 
         final Stream<ObjectAdapter> objectAdapters = 
                 CollectionFacet.Utils.streamAdapters(collection);
diff --git a/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/FacetFactoryAbstract.java b/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/FacetFactoryAbstract.java
index 1f21efd..1c88c2a 100644
--- a/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/FacetFactoryAbstract.java
+++ b/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/FacetFactoryAbstract.java
@@ -23,9 +23,20 @@ import java.util.List;
 
 import org.apache.isis.commons.internal.collections._Lists;
 import org.apache.isis.metamodel.MetaModelContext;
+import org.apache.isis.metamodel.MetaModelContextAware;
+import org.apache.isis.metamodel.facetapi.Facet;
+import org.apache.isis.metamodel.facetapi.FacetUtil;
 import org.apache.isis.metamodel.facetapi.FeatureType;
+import org.apache.isis.metamodel.facetapi.MultiTypedFacet;
 
-public abstract class FacetFactoryAbstract implements FacetFactory, MetaModelContext.Delegating {
+import lombok.Getter;
+import lombok.Setter;
+
+public abstract class FacetFactoryAbstract 
+implements FacetFactory, MetaModelContextAware, MetaModelContext.Delegating {
+    
+    @Getter(onMethod = @__({@Override})) @Setter(onMethod = @__({@Override}))
+    private MetaModelContext metaModelContext;
     
     private final List<FeatureType> featureTypes;
 
@@ -49,16 +60,21 @@ public abstract class FacetFactoryAbstract implements FacetFactory, MetaModelCon
     @Override
     public void processParams(final ProcessParameterContext processParameterContext) {
     }
+    
+    // -- FACET UTILITIES
 
+    public void addFacet(final Facet facet) {
+        FacetUtil.addFacet(facet);
+    }
+    
+    public void addFacet(final MultiTypedFacet facet) {
+        FacetUtil.addFacet(facet);
+    }
+    
+    
     // -- METHOD UTILITITES
     
     protected static final Class<?>[] NO_PARAMETERS_TYPES = new Class<?>[0];
-    
-    // -- DEPENDENCIES
 
-    @Override
-    public MetaModelContext getMetaModelContext() {
-        return MetaModelContext.current();
-    }
 
 }
diff --git a/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/actions/action/ActionAnnotationFacetFactory.java b/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/actions/action/ActionAnnotationFacetFactory.java
index bdfcc1f..ba47ac8 100644
--- a/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/actions/action/ActionAnnotationFacetFactory.java
+++ b/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/actions/action/ActionAnnotationFacetFactory.java
@@ -26,8 +26,6 @@ import org.apache.isis.applib.events.domain.ActionDomainEvent;
 import org.apache.isis.applib.services.HasUniqueId;
 import org.apache.isis.commons.internal.base._Strings;
 import org.apache.isis.commons.internal.collections._Collections;
-import org.apache.isis.commons.internal.environment.IsisSystemEnvironment;
-import org.apache.isis.metamodel.facetapi.FacetUtil;
 import org.apache.isis.metamodel.facetapi.FeatureType;
 import org.apache.isis.metamodel.facets.FacetFactoryAbstract;
 import org.apache.isis.metamodel.facets.actcoll.typeof.TypeOfFacet;
@@ -120,7 +118,7 @@ public class ActionAnnotationFacetFactory extends FacetFactoryAbstract {
                     ActionDomainEvent.Noop.class,
                     ActionDomainEvent.Default.class,
                     getConfiguration().getReflector().getFacet().getActionAnnotation().getDomainEvent().isPostForDefault())) {
-                FacetUtil.addFacet(actionDomainEventFacet);
+                super.addFacet(actionDomainEventFacet);
             }
 
             // replace the current actionInvocationFacet with one that will
@@ -136,7 +134,7 @@ public class ActionAnnotationFacetFactory extends FacetFactoryAbstract {
                 actionInvocationFacet = new ActionInvocationFacetForDomainEventFromDefault(
                         actionDomainEventFacet.getEventType(), actionMethod, typeSpec, returnSpec, holder);
             }
-            FacetUtil.addFacet(actionInvocationFacet);
+            super.addFacet(actionInvocationFacet);
 
         } finally {
             processMethodContext.removeMethod(actionMethod);
@@ -162,18 +160,17 @@ public class ActionAnnotationFacetFactory extends FacetFactoryAbstract {
 
         // search for @Action(hidden=...)
         val facet = HiddenFacetForActionAnnotation.create(actionIfAny, holder);
-        FacetUtil.addFacet(facet);
+        super.addFacet(facet);
     }
 
     void processRestrictTo(final ProcessMethodContext processMethodContext, Optional<Action> actionIfAny) {
         val holder = processMethodContext.getFacetHolder();
 
         // search for @Action(restrictTo=...)
-        @SuppressWarnings("deprecation")
         val facet = PrototypeFacetForActionAnnotation.create(actionIfAny, holder,
-                ()->IsisSystemEnvironment.get().getDeploymentType());
-
-        FacetUtil.addFacet(facet);
+                ()->super.getSystemEnvironment().getDeploymentType());
+        
+        super.addFacet(facet);
     }
 
     void processSemantics(final ProcessMethodContext processMethodContext, Optional<Action> actionIfAny) {
@@ -182,7 +179,7 @@ public class ActionAnnotationFacetFactory extends FacetFactoryAbstract {
         // check for @Action(semantics=...)
         val facet = ActionSemanticsFacetForActionAnnotation.create(actionIfAny, holder);
 
-        FacetUtil.addFacet(facet);
+        super.addFacet(facet);
     }
 
     void processCommand(final ProcessMethodContext processMethodContext, Optional<Action> actionIfAny) {
@@ -201,7 +198,7 @@ public class ActionAnnotationFacetFactory extends FacetFactoryAbstract {
         // check for @Action(command=...)
         val commandFacet = CommandFacetForActionAnnotation.create(actionIfAny, getConfiguration(), getServiceInjector(), facetHolder);
 
-        FacetUtil.addFacet(commandFacet);
+        super.addFacet(commandFacet);
     }
 
     void processPublishing(final ProcessMethodContext processMethodContext, Optional<Action> actionIfAny) {
@@ -221,7 +218,7 @@ public class ActionAnnotationFacetFactory extends FacetFactoryAbstract {
         // check for @Action(publishing=...)
         val facet = PublishedActionFacetForActionAnnotation.create(actionIfAny, getConfiguration(), holder);
 
-        FacetUtil.addFacet(facet);
+        super.addFacet(facet);
     }
 
     void processTypeOf(final ProcessMethodContext processMethodContext, Optional<Action> actionIfAny) {
@@ -253,7 +250,7 @@ public class ActionAnnotationFacetFactory extends FacetFactoryAbstract {
             typeOfFacet = TypeOfFacet.Util.inferFromGenericReturnType(cls, method, holder);
         }
 
-        FacetUtil.addFacet(typeOfFacet);
+        super.addFacet(typeOfFacet);
     }
 
     void processAssociateWith(final ProcessMethodContext processMethodContext, Optional<Action> actionIfAny) {
@@ -266,9 +263,9 @@ public class ActionAnnotationFacetFactory extends FacetFactoryAbstract {
             val associateWith = action.associateWith();
             if(!_Strings.isNullOrEmpty(associateWith)) {
                 val associateWithSequence = action.associateWithSequence();
-                FacetUtil.addFacet(
+                super.addFacet(
                         new MemberOrderFacetForActionAnnotation(associateWith, associateWithSequence, holder));
-                FacetUtil.addFacet(
+                super.addFacet(
                         new AssociatedWithFacetForActionAnnotation(associateWith, holder));
             }
         });
@@ -282,7 +279,7 @@ public class ActionAnnotationFacetFactory extends FacetFactoryAbstract {
 
         // check for @Action(fileAccept=...)
         val facet = FileAcceptFacetForActionAnnotation.create(actionIfAny, holder);
-        FacetUtil.addFacet(facet);
+        super.addFacet(facet);
 
     }
 
diff --git a/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/actions/defaults/method/ActionDefaultsFacetViaMethodFactory.java b/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/actions/defaults/method/ActionDefaultsFacetViaMethodFactory.java
index 058039d..ba06ee0 100644
--- a/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/actions/defaults/method/ActionDefaultsFacetViaMethodFactory.java
+++ b/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/actions/defaults/method/ActionDefaultsFacetViaMethodFactory.java
@@ -26,11 +26,10 @@ import org.apache.isis.commons.internal._Constants;
 import org.apache.isis.metamodel.commons.StringExtensions;
 import org.apache.isis.metamodel.facetapi.Facet;
 import org.apache.isis.metamodel.facetapi.FacetHolder;
-import org.apache.isis.metamodel.facetapi.FacetUtil;
 import org.apache.isis.metamodel.facetapi.FeatureType;
 import org.apache.isis.metamodel.facets.MethodFinderUtils;
-import org.apache.isis.metamodel.facets.MethodPrefixBasedFacetFactoryAbstract;
 import org.apache.isis.metamodel.facets.MethodLiteralConstants;
+import org.apache.isis.metamodel.facets.MethodPrefixBasedFacetFactoryAbstract;
 import org.apache.isis.metamodel.methodutils.MethodScope;
 
 /**
@@ -58,7 +57,8 @@ public class ActionDefaultsFacetViaMethodFactory extends MethodPrefixBasedFacetF
         attachActionDefaultsFacetIfParameterDefaultsMethodIsFound(processMethodContext);
     }
 
-    private static void attachActionDefaultsFacetIfParameterDefaultsMethodIsFound(final ProcessMethodContext processMethodContext) {
+    private void attachActionDefaultsFacetIfParameterDefaultsMethodIsFound(
+            final ProcessMethodContext processMethodContext) {
 
         Method defaultsMethod = findDefaultsMethodReturning(processMethodContext, Object[].class);
         if (defaultsMethod == null) {
@@ -72,7 +72,7 @@ public class ActionDefaultsFacetViaMethodFactory extends MethodPrefixBasedFacetF
 
         final FacetHolder facetedMethod = processMethodContext.getFacetHolder();
         final ActionDefaultsFacetViaMethod facet = new ActionDefaultsFacetViaMethod(defaultsMethod, facetedMethod);
-        FacetUtil.addFacet(facet);
+        super.addFacet(facet);
     }
 
     private static Method findDefaultsMethodReturning(final ProcessMethodContext processMethodContext, final Class<?> returnType) {
diff --git a/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/actions/layout/ActionLayoutFacetFactory.java b/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/actions/layout/ActionLayoutFacetFactory.java
index 6506e9f..a7997fb 100644
--- a/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/actions/layout/ActionLayoutFacetFactory.java
+++ b/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/actions/layout/ActionLayoutFacetFactory.java
@@ -20,7 +20,6 @@ package org.apache.isis.metamodel.facets.actions.layout;
 
 import org.apache.isis.applib.annotation.ActionLayout;
 import org.apache.isis.metamodel.facetapi.FacetHolder;
-import org.apache.isis.metamodel.facetapi.FacetUtil;
 import org.apache.isis.metamodel.facetapi.FeatureType;
 import org.apache.isis.metamodel.facets.ContributeeMemberFacetFactory;
 import org.apache.isis.metamodel.facets.FacetFactoryAbstract;
@@ -58,38 +57,38 @@ public class ActionLayoutFacetFactory extends FacetFactoryAbstract implements Co
         // bookmarkable
         BookmarkPolicyFacet bookmarkableFacet = BookmarkPolicyFacetForActionLayoutAnnotation
                 .create(actionLayoutIfAny, facetHolder);
-        FacetUtil.addFacet(bookmarkableFacet);
+        super.addFacet(bookmarkableFacet);
 
 
         // cssClass
         CssClassFacet cssClassFacet = CssClassFacetForActionLayoutAnnotation.create(actionLayoutIfAny, facetHolder);
-        FacetUtil.addFacet(cssClassFacet);
+        super.addFacet(cssClassFacet);
 
 
         // cssClassFa
         CssClassFaFacet cssClassFaFacet = CssClassFaFacetForActionLayoutAnnotation.create(actionLayoutIfAny, facetHolder);
-        FacetUtil.addFacet(cssClassFaFacet);
+        super.addFacet(cssClassFaFacet);
 
 
         // describedAs
         DescribedAsFacet describedAsFacet = DescribedAsFacetForActionLayoutAnnotation.create(actionLayoutIfAny, facetHolder);
-        FacetUtil.addFacet(describedAsFacet);
+        super.addFacet(describedAsFacet);
 
 
         // hidden
         HiddenFacet hiddenFacet = HiddenFacetForActionLayoutAnnotation.create(actionLayoutIfAny, facetHolder);
-        FacetUtil.addFacet(hiddenFacet);
+        super.addFacet(hiddenFacet);
 
 
         // named
         NamedFacet namedFacet = NamedFacetForActionLayoutAnnotation.create(actionLayoutIfAny, facetHolder);
-        FacetUtil.addFacet(namedFacet);
+        super.addFacet(namedFacet);
 
         // promptStyle
         PromptStyleFacet promptStyleFacet = PromptStyleFacetForActionLayoutAnnotation
                 .create(actionLayoutIfAny, getConfiguration(), facetHolder);
 
-        FacetUtil.addFacet(promptStyleFacet);
+        super.addFacet(promptStyleFacet);
 
 
         // position
@@ -98,7 +97,7 @@ public class ActionLayoutFacetFactory extends FacetFactoryAbstract implements Co
         if(actionPositionFacet == null) {
             actionPositionFacet = new ActionPositionFacetFallback(facetHolder);
         }
-        FacetUtil.addFacet(actionPositionFacet);
+        super.addFacet(actionPositionFacet);
 
 
         // redirectPolicy
@@ -106,14 +105,14 @@ public class ActionLayoutFacetFactory extends FacetFactoryAbstract implements Co
         if(redirectFacet == null) {
             redirectFacet = new RedirectFacetFallback(facetHolder);
         }
-        FacetUtil.addFacet(redirectFacet);
+        super.addFacet(redirectFacet);
 
 
         // contributing
         if (isContributingServiceOrMixinObject(processMethodContext)) {
             NotContributedFacet notContributedFacet = NotContributedFacetForActionLayoutAnnotation
                     .create(actionLayoutIfAny, facetHolder);
-            FacetUtil.addFacet(notContributedFacet);
+            super.addFacet(notContributedFacet);
         }
     }
 
@@ -142,30 +141,30 @@ public class ActionLayoutFacetFactory extends FacetFactoryAbstract implements Co
 
         // cssClass
         CssClassFacet cssClassFacet = null;
-        FacetUtil.addFacet(cssClassFacet);
+        super.addFacet(cssClassFacet);
 
         // cssClassFa
         CssClassFaFacet cssClassFaFacet = null;
-        FacetUtil.addFacet(cssClassFaFacet);
+        super.addFacet(cssClassFaFacet);
 
         // describedAs
         DescribedAsFacet describedAsFacet = null;
-        FacetUtil.addFacet(describedAsFacet);
+        super.addFacet(describedAsFacet);
 
         // hidden
         HiddenFacet hiddenFacet = null;
-        FacetUtil.addFacet(hiddenFacet);
+        super.addFacet(hiddenFacet);
 
         // named
         NamedFacet namedFacet = null;
-        FacetUtil.addFacet(namedFacet);
+        super.addFacet(namedFacet);
 
         // position
         ActionPositionFacet actionPositionFacet = null;
         if(! holder.containsDoOpFacet(ActionPositionFacet.class)) {
             actionPositionFacet = new ActionPositionFacetFallback(holder);
         }
-        FacetUtil.addFacet(actionPositionFacet);
+        super.addFacet(actionPositionFacet);
 
     }
 
diff --git a/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/actions/semantics/ActionSemanticsFacetAbstract.java b/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/actions/semantics/ActionSemanticsFacetAbstract.java
index 987999a..052286f 100644
--- a/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/actions/semantics/ActionSemanticsFacetAbstract.java
+++ b/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/actions/semantics/ActionSemanticsFacetAbstract.java
@@ -24,7 +24,9 @@ import org.apache.isis.metamodel.facetapi.Facet;
 import org.apache.isis.metamodel.facetapi.FacetHolder;
 import org.apache.isis.metamodel.facets.SingleValueFacetAbstract;
 
-public abstract class ActionSemanticsFacetAbstract extends SingleValueFacetAbstract<SemanticsOf> implements ActionSemanticsFacet {
+public abstract class ActionSemanticsFacetAbstract 
+extends SingleValueFacetAbstract<SemanticsOf> 
+implements ActionSemanticsFacet {
 
     public static Class<? extends Facet> type() {
         return ActionSemanticsFacet.class;
diff --git a/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/actions/validate/method/ActionValidationFacetViaMethodFactory.java b/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/actions/validate/method/ActionValidationFacetViaMethodFactory.java
index ec560c5..55e023c 100644
--- a/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/actions/validate/method/ActionValidationFacetViaMethodFactory.java
+++ b/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/actions/validate/method/ActionValidationFacetViaMethodFactory.java
@@ -24,7 +24,6 @@ import java.lang.reflect.Method;
 import org.apache.isis.applib.services.i18n.TranslationService;
 import org.apache.isis.metamodel.commons.StringExtensions;
 import org.apache.isis.metamodel.facetapi.Facet;
-import org.apache.isis.metamodel.facetapi.FacetUtil;
 import org.apache.isis.metamodel.facetapi.FeatureType;
 import org.apache.isis.metamodel.facetapi.IdentifiedHolder;
 import org.apache.isis.metamodel.facets.MethodFinderUtils;
@@ -82,7 +81,7 @@ public class ActionValidationFacetViaMethodFactory extends MethodPrefixBasedFace
         // sadness: same as in TranslationFactory
         final String translationContext = facetHolder.getIdentifier().toClassAndNameIdentityString();
         final ActionValidationFacetViaMethod facet = new ActionValidationFacetViaMethod(validateMethod, translationService, translationContext, facetHolder);
-        FacetUtil.addFacet(facet);
+        super.addFacet(facet);
     }
 
     @Override
@@ -112,7 +111,7 @@ public class ActionValidationFacetViaMethodFactory extends MethodPrefixBasedFace
         // sadness: same as in TranslationFactory
         final String translationContext = facetHolder.getIdentifier().toFullIdentityString();
         final Facet facet = new ActionParameterValidationFacetViaMethod(validateMethod, translationService, translationContext, facetHolder);
-        FacetUtil.addFacet(facet);
+        super.addFacet(facet);
     }
 
 
diff --git a/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/all/i18n/TranslationFacetFactory.java b/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/all/i18n/TranslationFacetFactory.java
index 21e65e5..e27b8c5 100644
--- a/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/all/i18n/TranslationFacetFactory.java
+++ b/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/all/i18n/TranslationFacetFactory.java
@@ -20,10 +20,8 @@ package org.apache.isis.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.metamodel.facetapi.FacetHolder;
-import org.apache.isis.metamodel.facetapi.FacetUtil;
 import org.apache.isis.metamodel.facetapi.FeatureType;
 import org.apache.isis.metamodel.facetapi.IdentifiedHolder;
 import org.apache.isis.metamodel.facets.ContributeeMemberFacetFactory;
@@ -33,8 +31,6 @@ import org.apache.isis.metamodel.facets.all.named.NamedFacet;
 
 public class TranslationFacetFactory extends FacetFactoryAbstract implements ContributeeMemberFacetFactory {
 
-    private TranslationService translationService;
-
     public TranslationFacetFactory() {
         super(FeatureType.EVERYTHING);
     }
@@ -91,10 +87,10 @@ public class TranslationFacetFactory extends FacetFactoryAbstract implements Con
             return;
         }
 
-        final TranslationService translationService = lookupTranslationService();
+        final TranslationService translationService = getTranslationService();
         NamedFacetTranslated facetTranslated = new NamedFacetTranslated(context, originalText, translationService, facetHolder);
         facetTranslated.setUnderlyingFacet(facet);
-        FacetUtil.addFacet(facetTranslated);
+        super.addFacet(facetTranslated);
     }
 
     void translateDescription(final FacetHolder facetHolder, final String context) {
@@ -109,8 +105,8 @@ public class TranslationFacetFactory extends FacetFactoryAbstract implements Con
             return;
         }
 
-        final TranslationService translationService = lookupTranslationService();
-        FacetUtil.addFacet(new DescribedAsFacetTranslated(context, originalText, translationService, holder));
+        final TranslationService translationService = getTranslationService();
+        super.addFacet(new DescribedAsFacetTranslated(context, originalText, translationService, holder));
 
     }
 
@@ -118,21 +114,6 @@ public class TranslationFacetFactory extends FacetFactoryAbstract implements Con
         return originalText == null || _Strings.isNullOrEmpty(originalText.trim());
     }
 
-    // //////////////////////////////////////
 
-    /**
-     * Looks up from {@link ServiceInjector}.
-     *
-     * <p>
-     *     There is guaranteed to be an instance because <code>TranslationServicePo</code> (in runtime) is annotated
-     *     as a {@link org.apache.isis.applib.annotation.DomainService &#64;DomainService}.
-     * </p>
-     */
-    TranslationService lookupTranslationService() {
-        if(translationService == null) {
-            translationService = getTranslationService();
-        }
-        return translationService;
-    }
 
 }
diff --git a/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/collections/accessor/CollectionAccessorFacetViaAccessorFactory.java b/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/collections/accessor/CollectionAccessorFacetViaAccessorFactory.java
index 3311078..13f39b8 100644
--- a/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/collections/accessor/CollectionAccessorFacetViaAccessorFactory.java
+++ b/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/collections/accessor/CollectionAccessorFacetViaAccessorFactory.java
@@ -24,7 +24,6 @@ import java.util.Collection;
 import java.util.List;
 
 import org.apache.isis.metamodel.facetapi.FacetHolder;
-import org.apache.isis.metamodel.facetapi.FacetUtil;
 import org.apache.isis.metamodel.facetapi.FeatureType;
 import org.apache.isis.metamodel.facetapi.MethodRemover;
 import org.apache.isis.metamodel.facets.MethodLiteralConstants;
@@ -55,11 +54,11 @@ extends PropertyOrCollectionIdentifyingFacetFactoryAbstract {
         final ObjectSpecification typeSpec = getSpecificationLoader().loadSpecification(cls);
 
         final FacetHolder holder = processMethodContext.getFacetHolder();
-        FacetUtil.addFacet(
+        super.addFacet(
                 new CollectionAccessorFacetViaAccessor(
                         typeSpec, accessorMethod, holder));
 
-        FacetUtil.addFacet(CollectionSemanticsFacetDefault.forCollection(accessorMethod, holder));
+        super.addFacet(CollectionSemanticsFacetDefault.forCollection(accessorMethod, holder));
     }
 
 
diff --git a/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/collections/clear/CollectionClearFacetFactory.java b/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/collections/clear/CollectionClearFacetFactory.java
index 7c3f71f..94e4986 100644
--- a/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/collections/clear/CollectionClearFacetFactory.java
+++ b/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/collections/clear/CollectionClearFacetFactory.java
@@ -23,11 +23,10 @@ import java.lang.reflect.Method;
 
 import org.apache.isis.metamodel.commons.StringExtensions;
 import org.apache.isis.metamodel.facetapi.FacetHolder;
-import org.apache.isis.metamodel.facetapi.FacetUtil;
 import org.apache.isis.metamodel.facetapi.FeatureType;
 import org.apache.isis.metamodel.facets.MethodFinderUtils;
-import org.apache.isis.metamodel.facets.MethodPrefixBasedFacetFactoryAbstract;
 import org.apache.isis.metamodel.facets.MethodLiteralConstants;
+import org.apache.isis.metamodel.facets.MethodPrefixBasedFacetFactoryAbstract;
 import org.apache.isis.metamodel.facets.collections.modify.CollectionClearFacet;
 import org.apache.isis.metamodel.methodutils.MethodScope;
 
@@ -56,7 +55,7 @@ public class CollectionClearFacetFactory extends MethodPrefixBasedFacetFactoryAb
         processMethodContext.removeMethod(method);
 
         final FacetHolder collection = processMethodContext.getFacetHolder();
-        FacetUtil.addFacet(createCollectionClearFacet(method, getMethod, collection));
+        super.addFacet(createCollectionClearFacet(method, getMethod, collection));
     }
 
     private CollectionClearFacet createCollectionClearFacet(
diff --git a/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/collections/collection/CollectionAnnotationFacetFactory.java b/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/collections/collection/CollectionAnnotationFacetFactory.java
index 3d9865a..7db9dea 100644
--- a/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/collections/collection/CollectionAnnotationFacetFactory.java
+++ b/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/collections/collection/CollectionAnnotationFacetFactory.java
@@ -129,7 +129,7 @@ public class CollectionAnnotationFacetFactory extends FacetFactoryAbstract {
                                 defaultFromDomainObjectIfRequired(typeSpec, CollectionDomainEvent.Default.class), holder)
                         );
         if(!CollectionDomainEvent.Noop.class.isAssignableFrom(collectionDomainEventFacet.getEventType())) {
-            FacetUtil.addFacet(collectionDomainEventFacet);
+            super.addFacet(collectionDomainEventFacet);
         }
 
         if(EventUtil.eventTypeIsPostable(
@@ -138,7 +138,7 @@ public class CollectionAnnotationFacetFactory extends FacetFactoryAbstract {
                 CollectionDomainEvent.Default.class,
                 getConfiguration().getReflector().getFacet().getCollectionAnnotation().getDomainEvent().isPostForDefault()
                 )) {
-            FacetUtil.addFacet(collectionDomainEventFacet);
+            super.addFacet(collectionDomainEventFacet);
         }
 
 
@@ -165,7 +165,7 @@ public class CollectionAnnotationFacetFactory extends FacetFactoryAbstract {
                         collectionDomainEventFacet.getEventType(), getterFacet, 
                         collectionAddToFacet, collectionDomainEventFacet, holder, getServiceRegistry());
             }
-            FacetUtil.addFacet(replacementFacet);
+            super.addFacet(replacementFacet);
         }
 
         final CollectionRemoveFromFacet collectionRemoveFromFacet = holder.getFacet(CollectionRemoveFromFacet.class);
@@ -180,7 +180,7 @@ public class CollectionAnnotationFacetFactory extends FacetFactoryAbstract {
                 // default
                 replacementFacet = new CollectionRemoveFromFacetForDomainEventFromDefault(collectionDomainEventFacet.getEventType(), getterFacet, collectionRemoveFromFacet, collectionDomainEventFacet, getServiceRegistry(), holder);
             }
-            FacetUtil.addFacet(replacementFacet);
+            super.addFacet(replacementFacet);
         }
 
     }
@@ -205,7 +205,7 @@ public class CollectionAnnotationFacetFactory extends FacetFactoryAbstract {
         // check for @Collection(hidden=...)
         val facet = HiddenFacetForCollectionAnnotation.create(collectionIfAny, holder);
 
-        FacetUtil.addFacet(facet);
+        super.addFacet(facet);
     }
 
     void processEditing(final ProcessMethodContext processMethodContext, Optional<Collection> collectionIfAny) {
@@ -214,7 +214,7 @@ public class CollectionAnnotationFacetFactory extends FacetFactoryAbstract {
         // check for @Collection(editing=...)
         val facet = DisabledFacetForCollectionAnnotation.create(collectionIfAny, holder);
 
-        FacetUtil.addFacet(facet);
+        super.addFacet(facet);
     }
 
     void processNotPersisted(final ProcessMethodContext processMethodContext, Optional<Collection> collectionIfAny) {
@@ -223,7 +223,7 @@ public class CollectionAnnotationFacetFactory extends FacetFactoryAbstract {
         // search for @Collection(notPersisted=...)
         val facet = NotPersistedFacetForCollectionAnnotation.create(collectionIfAny, holder);
 
-        FacetUtil.addFacet(facet);
+        super.addFacet(facet);
     }
 
 
@@ -255,7 +255,7 @@ public class CollectionAnnotationFacetFactory extends FacetFactoryAbstract {
             facet = inferFromGenericReturnType(processMethodContext);
         }
 
-        FacetUtil.addFacet(facet);
+        super.addFacet(facet);
     }
 
     private TypeOfFacet inferFromGenericReturnType(final ProcessMethodContext processMethodContext) {
diff --git a/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/collections/disabled/fromimmutable/DisabledFacetOnCollectionDerivedFromImmutableFactory.java b/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/collections/disabled/fromimmutable/DisabledFacetOnCollectionDerivedFromImmutableFactory.java
index c470df0..0c5065b 100644
--- a/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/collections/disabled/fromimmutable/DisabledFacetOnCollectionDerivedFromImmutableFactory.java
+++ b/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/collections/disabled/fromimmutable/DisabledFacetOnCollectionDerivedFromImmutableFactory.java
@@ -19,7 +19,6 @@
 
 package org.apache.isis.metamodel.facets.collections.disabled.fromimmutable;
 
-import org.apache.isis.metamodel.facetapi.FacetUtil;
 import org.apache.isis.metamodel.facetapi.FeatureType;
 import org.apache.isis.metamodel.facets.FacetFactoryAbstract;
 import org.apache.isis.metamodel.facets.FacetedMethod;
@@ -39,7 +38,7 @@ public class DisabledFacetOnCollectionDerivedFromImmutableFactory extends FacetF
         if (spec.containsDoOpFacet(ImmutableFacet.class)) {
             final ImmutableFacet immutableFacet = spec.getFacet(ImmutableFacet.class);
             final FacetedMethod facetHolder = processMethodContext.getFacetHolder();
-            FacetUtil.addFacet(new DisabledFacetOnCollectionDerivedFromImmutable(immutableFacet, facetHolder));
+            super.addFacet(new DisabledFacetOnCollectionDerivedFromImmutable(immutableFacet, facetHolder));
         }
     }
 
diff --git a/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/collections/layout/CollectionLayoutFacetFactory.java b/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/collections/layout/CollectionLayoutFacetFactory.java
index 657c88d..e702d65 100644
--- a/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/collections/layout/CollectionLayoutFacetFactory.java
+++ b/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/collections/layout/CollectionLayoutFacetFactory.java
@@ -19,7 +19,6 @@
 package org.apache.isis.metamodel.facets.collections.layout;
 
 import org.apache.isis.applib.annotation.CollectionLayout;
-import org.apache.isis.metamodel.facetapi.FacetUtil;
 import org.apache.isis.metamodel.facetapi.FeatureType;
 import org.apache.isis.metamodel.facets.ContributeeMemberFacetFactory;
 import org.apache.isis.metamodel.facets.FacetFactoryAbstract;
@@ -49,39 +48,39 @@ public class CollectionLayoutFacetFactory extends FacetFactoryAbstract implement
 
         // cssClass
         CssClassFacet cssClassFacet = CssClassFacetForCollectionLayoutAnnotation.create(collectionLayoutIfAny, facetHolder);
-        FacetUtil.addFacet(cssClassFacet);
+        super.addFacet(cssClassFacet);
 
 
         // describedAs
         DescribedAsFacet describedAsFacet =
                 DescribedAsFacetForCollectionLayoutAnnotation.create(collectionLayoutIfAny, facetHolder);
-        FacetUtil.addFacet(describedAsFacet);
+        super.addFacet(describedAsFacet);
 
 
         // hidden
         HiddenFacet hiddenFacet = HiddenFacetForCollectionLayoutAnnotation.create(collectionLayoutIfAny, facetHolder);
-        FacetUtil.addFacet(hiddenFacet);
+        super.addFacet(hiddenFacet);
 
 
         // defaultView
         DefaultViewFacet defaultViewFacet =
                 DefaultViewFacetForCollectionLayoutAnnotation.create(collectionLayoutIfAny, getConfiguration(), facetHolder);
-        FacetUtil.addFacet(defaultViewFacet);
+        super.addFacet(defaultViewFacet);
 
 
         // named
         NamedFacet namedFacet = NamedFacetForCollectionLayoutAnnotation.create(collectionLayoutIfAny, facetHolder);
-        FacetUtil.addFacet(namedFacet);
+        super.addFacet(namedFacet);
 
 
         // paged
         PagedFacet pagedFacet = PagedFacetForCollectionLayoutAnnotation.create(collectionLayoutIfAny, facetHolder);
-        FacetUtil.addFacet(pagedFacet);
+        super.addFacet(pagedFacet);
 
 
         // sortedBy
         SortedByFacet sortedByFacet = SortedByFacetForCollectionLayoutAnnotation.create(collectionLayoutIfAny, facetHolder);
-        FacetUtil.addFacet(sortedByFacet);
+        super.addFacet(sortedByFacet);
 
     }
 
@@ -90,32 +89,32 @@ public class CollectionLayoutFacetFactory extends FacetFactoryAbstract implement
 
         // cssClass
         CssClassFacet cssClassFacet = null;
-        FacetUtil.addFacet(cssClassFacet);
+        super.addFacet(cssClassFacet);
 
 
         // describedAs
         DescribedAsFacet describedAsFacet = null;
-        FacetUtil.addFacet(describedAsFacet);
+        super.addFacet(describedAsFacet);
 
 
         // hidden
         HiddenFacet hiddenFacet = null;
-        FacetUtil.addFacet(hiddenFacet);
+        super.addFacet(hiddenFacet);
 
 
         // named
         NamedFacet namedFacet = null;
-        FacetUtil.addFacet(namedFacet);
+        super.addFacet(namedFacet);
 
 
         // paged
         PagedFacet pagedFacet = null;
-        FacetUtil.addFacet(pagedFacet);
+        super.addFacet(pagedFacet);
 
 
         // sortedBy
         SortedByFacet sortedByFacet = null;
-        FacetUtil.addFacet(sortedByFacet);
+        super.addFacet(sortedByFacet);
 
 
     }
diff --git a/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/collections/modify/CollectionAddToRemoveFromAndValidateFacetFactory.java b/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/collections/modify/CollectionAddToRemoveFromAndValidateFacetFactory.java
index 1659302..ad28498 100644
--- a/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/collections/modify/CollectionAddToRemoveFromAndValidateFacetFactory.java
+++ b/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/collections/modify/CollectionAddToRemoveFromAndValidateFacetFactory.java
@@ -25,7 +25,6 @@ import org.apache.isis.applib.services.i18n.TranslationService;
 import org.apache.isis.metamodel.commons.StringExtensions;
 import org.apache.isis.metamodel.exceptions.MetaModelException;
 import org.apache.isis.metamodel.facetapi.FacetHolder;
-import org.apache.isis.metamodel.facetapi.FacetUtil;
 import org.apache.isis.metamodel.facetapi.FeatureType;
 import org.apache.isis.metamodel.facetapi.IdentifiedHolder;
 import org.apache.isis.metamodel.facets.FacetFactory;
@@ -74,8 +73,8 @@ public class CollectionAddToRemoveFromAndValidateFacetFactory extends MethodPref
 
         // add facets
         final FacetHolder collection = processMethodContext.getFacetHolder();
-        FacetUtil.addFacet(createAddToFacet(addToMethod, accessorMethod, collection));
-        FacetUtil.addFacet(createRemoveFromFacet(removeFromMethod, accessorMethod, collection));
+        super.addFacet(createAddToFacet(addToMethod, accessorMethod, collection));
+        super.addFacet(createRemoveFromFacet(removeFromMethod, accessorMethod, collection));
 
         // infer typ
         final Class<?> addToType = ((addToMethod == null || addToMethod.getParameterTypes().length != 1) ? null : addToMethod.getParameterTypes()[0]);
@@ -116,7 +115,7 @@ public class CollectionAddToRemoveFromAndValidateFacetFactory extends MethodPref
 
         final Class<?> type = addType != null ? addType : removeType;
         if (type != null) {
-            FacetUtil.addFacet(new TypeOfFacetInferredFromSupportingMethods(type, collection));
+            super.addFacet(new TypeOfFacetInferredFromSupportingMethods(type, collection));
         }
         return type;
     }
@@ -148,7 +147,7 @@ public class CollectionAddToRemoveFromAndValidateFacetFactory extends MethodPref
         final String translationContext = facetHolder.getIdentifier().toClassAndNameIdentityString();
 
         final CollectionValidateAddToFacetViaMethod facet = new CollectionValidateAddToFacetViaMethod(validateAddToMethod, translationService, translationContext, facetHolder);
-        FacetUtil.addFacet(facet);
+        super.addFacet(facet);
     }
 
     private void attachValidateRemoveFacetIfValidateRemoveFromMethodIsFound(final ProcessMethodContext processMethodContext, final Class<?> collectionType) {
@@ -173,7 +172,7 @@ public class CollectionAddToRemoveFromAndValidateFacetFactory extends MethodPref
         final String translationContext = facetHolder.getIdentifier().toClassAndNameIdentityString();
 
         final CollectionValidateRemoveFromFacetViaMethod facet = new CollectionValidateRemoveFromFacetViaMethod(validateRemoveFromMethod, translationService, translationContext, facetHolder);
-        FacetUtil.addFacet(facet);
+        super.addFacet(facet);
     }
 
 }
diff --git a/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/fallback/FallbackFacetFactory.java b/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/fallback/FallbackFacetFactory.java
index d47338c..f95e441 100644
--- a/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/fallback/FallbackFacetFactory.java
+++ b/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/fallback/FallbackFacetFactory.java
@@ -18,18 +18,14 @@
  */
 package org.apache.isis.metamodel.facets.fallback;
 
-import java.util.ArrayList;
 import java.util.HashMap;
-import java.util.List;
 import java.util.Map;
 
 import org.apache.isis.applib.annotation.LabelPosition;
-import org.apache.isis.commons.internal.collections._Lists;
 import org.apache.isis.config.ConfigPropsForPropertyOrParameterLayout;
 import org.apache.isis.metamodel.commons.StringExtensions;
 import org.apache.isis.metamodel.facetapi.Facet;
 import org.apache.isis.metamodel.facetapi.FacetHolder;
-import org.apache.isis.metamodel.facetapi.FacetUtil;
 import org.apache.isis.metamodel.facetapi.FeatureType;
 import org.apache.isis.metamodel.facets.FacetFactoryAbstract;
 import org.apache.isis.metamodel.facets.FacetedMethod;
@@ -76,17 +72,16 @@ public class FallbackFacetFactory extends FacetFactoryAbstract {
         final int pagedStandalone = getConfiguration().getViewers().getPaged().getStandalone();
         final PagedFacetFromConfiguration pagedFacet = new PagedFacetFromConfiguration(pagedStandalone, facetHolder);
 
-        FacetUtil.addFacet(describedAsFacet);
+        super.addFacet(describedAsFacet);
         // commenting these out, think this whole isNoop business is a little bogus
         //FacetUtil.addFacet(new ImmutableFacetNever(holder)); 
-        FacetUtil.addFacet(titleFacet);
-        FacetUtil.addFacet(pagedFacet);
+        super.addFacet(titleFacet);
+        super.addFacet(pagedFacet);
 
     }
 
     @Override
     public void process(final ProcessMethodContext processMethodContext) {
-        final List<Facet> facets = _Lists.newArrayList();
 
         final FacetedMethod facetedMethod = processMethodContext.getFacetHolder();
 
@@ -94,47 +89,44 @@ public class FallbackFacetFactory extends FacetFactoryAbstract {
         final String id = facetedMethod.getIdentifier().getMemberName();
         String defaultName = StringExtensions.asNaturalName2(id);
 
-        facets.add(new NamedFacetDefault(defaultName, facetedMethod));
+        super.addFacet(new NamedFacetDefault(defaultName, facetedMethod));
 
-        facets.add(new DescribedAsFacetNone(facetedMethod));
-        facets.add(new HelpFacetNone(facetedMethod));
+        super.addFacet(new DescribedAsFacetNone(facetedMethod));
+        super.addFacet(new HelpFacetNone(facetedMethod));
 
 
         final FeatureType featureType = facetedMethod.getFeatureType();
         if (featureType.isProperty()) {
-            facets.add(new MaxLengthFacetUnlimited(facetedMethod));
-            facets.add(new MultiLineFacetNone(true, facetedMethod));
+            super.addFacet(new MaxLengthFacetUnlimited(facetedMethod));
+            super.addFacet(new MultiLineFacetNone(true, facetedMethod));
 
-            facets.add(newPropParamLayoutFacetIfAny(facetedMethod, "propertyLayout", getConfiguration().getViewers().getPropertyLayout()));
+            super.addFacet(newPropParamLayoutFacetIfAny(facetedMethod, "propertyLayout", getConfiguration().getViewers().getPropertyLayout()));
         }
         if (featureType.isAction()) {
-            facets.add(new ActionDefaultsFacetNone(facetedMethod));
-            facets.add(new ActionChoicesFacetNone(facetedMethod));
+            super.addFacet(new ActionDefaultsFacetNone(facetedMethod));
+            super.addFacet(new ActionChoicesFacetNone(facetedMethod));
         }
         if (featureType.isCollection()) {
-            facets.add(new PagedFacetFromConfiguration(getConfiguration().getViewers().getPaged().getParented(), facetedMethod));
+            super.addFacet(new PagedFacetFromConfiguration(getConfiguration().getViewers().getPaged().getParented(), facetedMethod));
         }
-
-        FacetUtil.addFacets(facets);
+        
     }
 
     @Override
     public void processParams(final ProcessParameterContext processParameterContext) {
-        final List<Facet> facets = new ArrayList<Facet>();
 
         final TypedHolder typedHolder = processParameterContext.getFacetHolder();
         if (typedHolder.getFeatureType().isActionParameter()) {
-            facets.add(new NamedFacetNone(typedHolder));
-            facets.add(new DescribedAsFacetNone(typedHolder));
-            facets.add(new HelpFacetNone(typedHolder));
-            facets.add(new MultiLineFacetNone(false, typedHolder));
+            super.addFacet(new NamedFacetNone(typedHolder));
+            super.addFacet(new DescribedAsFacetNone(typedHolder));
+            super.addFacet(new HelpFacetNone(typedHolder));
+            super.addFacet(new MultiLineFacetNone(false, typedHolder));
 
-            facets.add(new MaxLengthFacetUnlimited(typedHolder));
+            super.addFacet(new MaxLengthFacetUnlimited(typedHolder));
 
-            facets.add(newPropParamLayoutFacetIfAny(typedHolder, "parameterLayout", getConfiguration().getViewers().getParameterLayout()));
+            super.addFacet(newPropParamLayoutFacetIfAny(typedHolder, "parameterLayout", getConfiguration().getViewers().getParameterLayout()));
         }
 
-        FacetUtil.addFacets(facets);
     }
 
     private Facet newPropParamLayoutFacetIfAny(final FacetHolder facetHolder, final String layoutKey, ConfigPropsForPropertyOrParameterLayout configPropsHolder) {
diff --git a/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/jaxb/JaxbFacetFactory.java b/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/jaxb/JaxbFacetFactory.java
index f2100a5..ef1a3c3 100644
--- a/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/jaxb/JaxbFacetFactory.java
+++ b/core/metamodel/src/main/java/org/apache/isis/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.metamodel.facetapi.FacetHolder;
-import org.apache.isis.metamodel.facetapi.FacetUtil;
 import org.apache.isis.metamodel.facetapi.FeatureType;
 import org.apache.isis.metamodel.facetapi.MetaModelRefiner;
 import org.apache.isis.metamodel.facets.Annotations;
@@ -79,7 +78,7 @@ implements MetaModelRefiner {
         final XmlJavaTypeAdapterFacetDefault facet = new XmlJavaTypeAdapterFacetDefault(holder,
                 annotation.value());
 
-        FacetUtil.addFacet(facet);
+        super.addFacet(facet);
     }
 
     private void processXmlAccessorTypeFacet(final ProcessClassContext processClassContext) {
@@ -94,7 +93,7 @@ implements MetaModelRefiner {
         final XmlAccessorTypeFacetDefault facet =
                 new XmlAccessorTypeFacetDefault(holder, annotation.value());
 
-        FacetUtil.addFacet(facet);
+        super.addFacet(facet);
     }
 
     // -- METHOD CONTEXT
@@ -127,7 +126,7 @@ implements MetaModelRefiner {
         final XmlJavaTypeAdapterFacetDefault facet = new XmlJavaTypeAdapterFacetDefault(holder,
                 annotation.value());
 
-        FacetUtil.addFacet(facet);
+        super.addFacet(facet);
     }
 
     private void processXmlTransient(final ProcessMethodContext processMethodContext, XmlAccessType accessType) {
@@ -141,7 +140,7 @@ implements MetaModelRefiner {
         final FacetHolder holder = processMethodContext.getFacetHolder();
         final XmlTransientFacet facet = new XmlTransientFacetDefault(holder);
 
-        FacetUtil.addFacet(facet);
+        super.addFacet(facet);
     }
 
     // --
diff --git a/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/members/cssclass/annotprop/CssClassFacetOnActionFromConfiguredRegexFactory.java b/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/members/cssclass/annotprop/CssClassFacetOnActionFromConfiguredRegexFactory.java
index 86acbc1..6bfd41f 100644
--- a/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/members/cssclass/annotprop/CssClassFacetOnActionFromConfiguredRegexFactory.java
+++ b/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/members/cssclass/annotprop/CssClassFacetOnActionFromConfiguredRegexFactory.java
@@ -24,7 +24,6 @@ import java.util.Map;
 import java.util.regex.Pattern;
 
 import org.apache.isis.metamodel.facetapi.FacetHolder;
-import org.apache.isis.metamodel.facetapi.FacetUtil;
 import org.apache.isis.metamodel.facetapi.FeatureType;
 import org.apache.isis.metamodel.facets.ContributeeMemberFacetFactory;
 import org.apache.isis.metamodel.facets.FacetFactoryAbstract;
@@ -63,7 +62,7 @@ public class CssClassFacetOnActionFromConfiguredRegexFactory extends FacetFactor
         CssClassFacet cssClassFacet = createFromConfiguredRegexIfPossible(name, facetHolder);
 
         // no-op if null
-        FacetUtil.addFacet(cssClassFacet);
+        super.addFacet(cssClassFacet);
     }
 
 
@@ -82,7 +81,7 @@ public class CssClassFacetOnActionFromConfiguredRegexFactory extends FacetFactor
         CssClassFacet cssClassFacet = createFromConfiguredRegexIfPossible(id, objectMember);
 
         // no-op if null
-        FacetUtil.addFacet(cssClassFacet);
+        super.addFacet(cssClassFacet);
     }
 
     // -- cssClassFromPattern
diff --git a/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/members/cssclassfa/annotprop/CssClassFaFacetOnMemberFactory.java b/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/members/cssclassfa/annotprop/CssClassFaFacetOnMemberFactory.java
index e8ed533..e99f92e 100644
--- a/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/members/cssclassfa/annotprop/CssClassFaFacetOnMemberFactory.java
+++ b/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/members/cssclassfa/annotprop/CssClassFaFacetOnMemberFactory.java
@@ -21,14 +21,8 @@ package org.apache.isis.metamodel.facets.members.cssclassfa.annotprop;
 
 import java.lang.reflect.Method;
 import java.util.Map;
-import java.util.StringTokenizer;
-import java.util.regex.Matcher;
 import java.util.regex.Pattern;
 
-import org.apache.isis.commons.internal.base._Strings;
-import org.apache.isis.commons.internal.collections._Maps;
-import org.apache.isis.config.ConfigurationConstants;
-import org.apache.isis.metamodel.facetapi.FacetUtil;
 import org.apache.isis.metamodel.facetapi.FeatureType;
 import org.apache.isis.metamodel.facets.ContributeeMemberFacetFactory;
 import org.apache.isis.metamodel.facets.FacetFactoryAbstract;
@@ -46,7 +40,7 @@ public class CssClassFaFacetOnMemberFactory extends FacetFactoryAbstract impleme
         CssClassFaFacet cssClassFaFacet = createFromConfiguredRegexIfPossible(processMethodContext);
 
         // no-op if null
-        FacetUtil.addFacet(cssClassFaFacet);
+        super.addFacet(cssClassFaFacet);
     }
 
     @Override
diff --git a/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/members/describedas/annotprop/DescribedAsFacetOnMemberFactory.java b/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/members/describedas/annotprop/DescribedAsFacetOnMemberFactory.java
index a9fe17c..77a1fab 100644
--- a/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/members/describedas/annotprop/DescribedAsFacetOnMemberFactory.java
+++ b/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/members/describedas/annotprop/DescribedAsFacetOnMemberFactory.java
@@ -19,7 +19,6 @@
 
 package org.apache.isis.metamodel.facets.members.describedas.annotprop;
 
-import org.apache.isis.metamodel.facetapi.FacetUtil;
 import org.apache.isis.metamodel.facetapi.FeatureType;
 import org.apache.isis.metamodel.facets.ContributeeMemberFacetFactory;
 import org.apache.isis.metamodel.facets.FacetFactoryAbstract;
@@ -40,7 +39,7 @@ public class DescribedAsFacetOnMemberFactory extends FacetFactoryAbstract implem
         // facet derived from type moved to post-processor
 
         // no-op if null
-        FacetUtil.addFacet(facet);
+        super.addFacet(facet);
     }
 
     @Override
diff --git a/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/members/disabled/forsession/DisableForSessionFacetViaMethodFactory.java b/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/members/disabled/forsession/DisableForSessionFacetViaMethodFactory.java
index 1158c5c..78a04cd 100644
--- a/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/members/disabled/forsession/DisableForSessionFacetViaMethodFactory.java
+++ b/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/members/disabled/forsession/DisableForSessionFacetViaMethodFactory.java
@@ -25,11 +25,10 @@ import org.apache.isis.applib.security.UserMemento;
 import org.apache.isis.metamodel.commons.StringExtensions;
 import org.apache.isis.metamodel.facetapi.Facet;
 import org.apache.isis.metamodel.facetapi.FacetHolder;
-import org.apache.isis.metamodel.facetapi.FacetUtil;
 import org.apache.isis.metamodel.facetapi.FeatureType;
 import org.apache.isis.metamodel.facets.MethodFinderUtils;
-import org.apache.isis.metamodel.facets.MethodPrefixBasedFacetFactoryAbstract;
 import org.apache.isis.metamodel.facets.MethodLiteralConstants;
+import org.apache.isis.metamodel.facets.MethodPrefixBasedFacetFactoryAbstract;
 import org.apache.isis.metamodel.methodutils.MethodScope;
 import org.apache.isis.security.authentication.AuthenticationSessionProvider;
 
@@ -55,7 +54,7 @@ public class DisableForSessionFacetViaMethodFactory extends MethodPrefixBasedFac
         attachDisableFacetIfDisableMethodForSessionIsFound(processMethodContext, getAuthenticationSessionProvider());
     }
 
-    public static void attachDisableFacetIfDisableMethodForSessionIsFound(
+    private void attachDisableFacetIfDisableMethodForSessionIsFound(
             final ProcessMethodContext processMethodContext,
             final AuthenticationSessionProvider authenticationSessionProvider) {
 
@@ -77,7 +76,7 @@ public class DisableForSessionFacetViaMethodFactory extends MethodPrefixBasedFac
         processMethodContext.removeMethod(disableForSessionMethod);
 
         final FacetHolder facetedMethod = processMethodContext.getFacetHolder();
-        FacetUtil.addFacet(new DisableForSessionFacetViaMethod(disableForSessionMethod, facetedMethod));
+        super.addFacet(new DisableForSessionFacetViaMethod(disableForSessionMethod, facetedMethod));
     }
 
 }
diff --git a/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/members/disabled/method/DisableForContextFacetViaMethodFactory.java b/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/members/disabled/method/DisableForContextFacetViaMethodFactory.java
index c956b73..6c7ef36 100644
--- a/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/members/disabled/method/DisableForContextFacetViaMethodFactory.java
+++ b/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/members/disabled/method/DisableForContextFacetViaMethodFactory.java
@@ -25,7 +25,6 @@ import org.apache.isis.applib.services.i18n.TranslationService;
 import org.apache.isis.metamodel.commons.StringExtensions;
 import org.apache.isis.metamodel.facetapi.Facet;
 import org.apache.isis.metamodel.facetapi.FacetHolder;
-import org.apache.isis.metamodel.facetapi.FacetUtil;
 import org.apache.isis.metamodel.facetapi.FeatureType;
 import org.apache.isis.metamodel.facetapi.IdentifiedHolder;
 import org.apache.isis.metamodel.facets.MethodFinderUtils;
@@ -90,7 +89,7 @@ public class DisableForContextFacetViaMethodFactory extends MethodPrefixBasedFac
         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));
+        super.addFacet(new DisableForContextFacetViaMethod(disableMethod, translationService, translationContext, facetHolder));
     }
 
 }
diff --git a/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/members/hidden/forsession/HideForSessionFacetAbstract.java b/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/members/hidden/forsession/HideForSessionFacetAbstract.java
index c886f00..2930e77 100644
--- a/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/members/hidden/forsession/HideForSessionFacetAbstract.java
+++ b/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/members/hidden/forsession/HideForSessionFacetAbstract.java
@@ -38,8 +38,7 @@ public abstract class HideForSessionFacetAbstract extends FacetAbstract implemen
         return HideForSessionFacet.class;
     }
 
-    public HideForSessionFacetAbstract(
-            final FacetHolder holder) {
+    public HideForSessionFacetAbstract(FacetHolder holder) {
         super(type(), holder, Derivation.NOT_DERIVED);
     }
 
diff --git a/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/object/ViewModelSemanticCheckingFacetFactory.java b/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/object/ViewModelSemanticCheckingFacetFactory.java
index 17a2f18..bd3f121 100644
--- a/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/object/ViewModelSemanticCheckingFacetFactory.java
+++ b/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/object/ViewModelSemanticCheckingFacetFactory.java
@@ -26,6 +26,7 @@ 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.metamodel.MetaModelContext;
 import org.apache.isis.metamodel.facetapi.FeatureType;
 import org.apache.isis.metamodel.facetapi.MetaModelRefiner;
 import org.apache.isis.metamodel.facets.Annotations;
@@ -48,6 +49,12 @@ implements MetaModelRefiner {
             new MetaModelValidatorForValidationFailures();
 
     @Override
+    public void setMetaModelContext(MetaModelContext metaModelContext) {
+        super.setMetaModelContext(metaModelContext);
+        validator.setMetaModelContext(metaModelContext);
+    }
+    
+    @Override
     public void process(final ProcessClassContext processClassContext) {
 
         // disable by default
diff --git a/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/object/bookmarkpolicy/bookmarkable/BookmarkPolicyFacetFallbackFactory.java b/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/object/bookmarkpolicy/bookmarkable/BookmarkPolicyFacetFallbackFactory.java
index 1bcbe48..89af660 100644
--- a/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/object/bookmarkpolicy/bookmarkable/BookmarkPolicyFacetFallbackFactory.java
+++ b/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/object/bookmarkpolicy/bookmarkable/BookmarkPolicyFacetFallbackFactory.java
@@ -22,7 +22,6 @@ package org.apache.isis.metamodel.facets.object.bookmarkpolicy.bookmarkable;
 import java.util.stream.Stream;
 
 import org.apache.isis.applib.annotation.BookmarkPolicy;
-import org.apache.isis.metamodel.facetapi.FacetUtil;
 import org.apache.isis.metamodel.facetapi.FeatureType;
 import org.apache.isis.metamodel.facetapi.MetaModelRefiner;
 import org.apache.isis.metamodel.facets.FacetFactoryAbstract;
@@ -42,12 +41,12 @@ implements MetaModelRefiner {
 
     @Override
     public void process(final ProcessClassContext processClassContext) {
-        FacetUtil.addFacet(new BookmarkPolicyFacetFallback(processClassContext.getFacetHolder()));
+        super.addFacet(new BookmarkPolicyFacetFallback(processClassContext.getFacetHolder()));
     }
 
     @Override
     public void process(final ProcessMethodContext processMethodContext) {
-        FacetUtil.addFacet(new BookmarkPolicyFacetFallback(processMethodContext.getFacetHolder()));
+        super.addFacet(new BookmarkPolicyFacetFallback(processMethodContext.getFacetHolder()));
     }
 
     /**
diff --git a/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/object/callbacks/CreatedCallbackFacetFactory.java b/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/object/callbacks/CreatedCallbackFacetFactory.java
index 4906041..57afb92 100644
--- a/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/object/callbacks/CreatedCallbackFacetFactory.java
+++ b/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/object/callbacks/CreatedCallbackFacetFactory.java
@@ -19,10 +19,6 @@
 
 package org.apache.isis.metamodel.facets.object.callbacks;
 
-import java.util.ArrayList;
-
-import org.apache.isis.metamodel.facetapi.Facet;
-import org.apache.isis.metamodel.facetapi.FacetUtil;
 import org.apache.isis.metamodel.facetapi.FeatureType;
 import org.apache.isis.metamodel.facets.MethodFinderUtils;
 import org.apache.isis.metamodel.facets.MethodLiteralConstants;
@@ -43,15 +39,13 @@ public class CreatedCallbackFacetFactory extends MethodPrefixBasedFacetFactoryAb
     public void process(final ProcessClassContext processClassContext) {
         val cls = processClassContext.getCls();
         val facetHolder = processClassContext.getFacetHolder();
-        val facets = new ArrayList<Facet>();
 
         val method = MethodFinderUtils.findMethod(cls, MethodScope.OBJECT, MethodLiteralConstants.CREATED_PREFIX, void.class, NO_PARAMETERS_TYPES);
         if (method != null) {
-            facets.add(new CreatedCallbackFacetViaMethod(method, facetHolder));
+            super.addFacet(new CreatedCallbackFacetViaMethod(method, facetHolder));
             processClassContext.removeMethod(method);
         }
         
-        FacetUtil.addFacets(facets);
     }
 
 }
diff --git a/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/object/callbacks/LoadCallbackFacetFactory.java b/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/object/callbacks/LoadCallbackFacetFactory.java
index 16c317a..58b04c2 100644
--- a/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/object/callbacks/LoadCallbackFacetFactory.java
+++ b/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/object/callbacks/LoadCallbackFacetFactory.java
@@ -20,10 +20,7 @@
 package org.apache.isis.metamodel.facets.object.callbacks;
 
 import java.lang.reflect.Method;
-import java.util.ArrayList;
 
-import org.apache.isis.metamodel.facetapi.Facet;
-import org.apache.isis.metamodel.facetapi.FacetUtil;
 import org.apache.isis.metamodel.facetapi.FeatureType;
 import org.apache.isis.metamodel.facets.MethodFinderUtils;
 import org.apache.isis.metamodel.facets.MethodPrefixBasedFacetFactoryAbstract;
@@ -46,22 +43,20 @@ public class LoadCallbackFacetFactory extends MethodPrefixBasedFacetFactoryAbstr
     public void process(final ProcessClassContext processClassContext) {
         val cls = processClassContext.getCls();
         val facetHolder = processClassContext.getFacetHolder();
-        val facets = new ArrayList<Facet>();
 
         Method method = null;
         method = MethodFinderUtils.findMethod(cls, MethodScope.OBJECT, LOADING_PREFIX, void.class, NO_PARAMETERS_TYPES);
         if (method != null) {
             processClassContext.removeMethod(method);
-            facets.add(new LoadingCallbackFacetViaMethod(method, facetHolder));
+            super.addFacet(new LoadingCallbackFacetViaMethod(method, facetHolder));
         }
 
         method = MethodFinderUtils.findMethod(cls, MethodScope.OBJECT, LOADED_PREFIX, void.class, NO_PARAMETERS_TYPES);
         if (method != null) {
             processClassContext.removeMethod(method);
-            facets.add(new LoadedCallbackFacetViaMethod(method, facetHolder));
+            super.addFacet(new LoadedCallbackFacetViaMethod(method, facetHolder));
         }
 
-        FacetUtil.addFacets(facets);
     }
 
 }
diff --git a/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/object/choices/ChoicesFacetFromBoundedAbstract.java b/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/object/choices/ChoicesFacetFromBoundedAbstract.java
index 13d0b1a..baa8508 100644
--- a/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/object/choices/ChoicesFacetFromBoundedAbstract.java
+++ b/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/object/choices/ChoicesFacetFromBoundedAbstract.java
@@ -23,7 +23,6 @@ import java.util.function.Predicate;
 
 import org.apache.isis.applib.services.wrapper.events.UsabilityEvent;
 import org.apache.isis.applib.services.wrapper.events.ValidityEvent;
-import org.apache.isis.metamodel.MetaModelContext;
 import org.apache.isis.metamodel.adapter.ObjectAdapter;
 import org.apache.isis.metamodel.consent.InteractionInitiatedBy;
 import org.apache.isis.metamodel.facetapi.Facet;
@@ -108,7 +107,7 @@ implements ChoicesFacet, DisablingInteractionAdvisor, ValidatingInteractionAdvis
             ManagedObject adapter,
             final InteractionInitiatedBy interactionInitiatedBy) {
 
-        val context = MetaModelContext.current();
+        val context = getMetaModelContext();
         val repository = context.getRepositoryService();
 
         final Predicate<ManagedObject> visibilityFilter = 
diff --git a/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/object/choices/enums/EnumFacetUsingValueFacetUsingSemanticsProviderFactory.java b/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/object/choices/enums/EnumFacetUsingValueFacetUsingSemanticsProviderFactory.java
index c79eca2..a913a5c 100644
--- a/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/object/choices/enums/EnumFacetUsingValueFacetUsingSemanticsProviderFactory.java
+++ b/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/object/choices/enums/EnumFacetUsingValueFacetUsingSemanticsProviderFactory.java
@@ -21,7 +21,6 @@ package org.apache.isis.metamodel.facets.object.choices.enums;
 
 import org.apache.isis.commons.internal.base._Casts;
 import org.apache.isis.metamodel.facetapi.FacetHolder;
-import org.apache.isis.metamodel.facetapi.FacetUtil;
 import org.apache.isis.metamodel.facets.object.value.vsp.ValueFacetUsingSemanticsProviderFactory;
 
 public class EnumFacetUsingValueFacetUsingSemanticsProviderFactory 
@@ -44,7 +43,7 @@ extends ValueFacetUsingSemanticsProviderFactory<Enum<?>> {
                 new EnumValueSemanticsProvider<>(holder, _Casts.uncheckedCast(cls));
         
         addFacets(_Casts.uncheckedCast(enumValueSemanticsProvider));
-        FacetUtil.addFacet(new ChoicesFacetEnum(holder, cls.getEnumConstants()));
+        super.addFacet(new ChoicesFacetEnum(holder, cls.getEnumConstants()));
     }
 
 }
diff --git a/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/object/cssclass/method/CssClassFacetMethodFactory.java b/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/object/cssclass/method/CssClassFacetMethodFactory.java
index 2983816..3a04f51 100644
--- a/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/object/cssclass/method/CssClassFacetMethodFactory.java
+++ b/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/object/cssclass/method/CssClassFacetMethodFactory.java
@@ -22,7 +22,6 @@ package org.apache.isis.metamodel.facets.object.cssclass.method;
 import java.lang.reflect.Method;
 
 import org.apache.isis.metamodel.facetapi.FacetHolder;
-import org.apache.isis.metamodel.facetapi.FacetUtil;
 import org.apache.isis.metamodel.facetapi.FeatureType;
 import org.apache.isis.metamodel.facets.MethodFinderUtils;
 import org.apache.isis.metamodel.facets.MethodPrefixBasedFacetFactoryAbstract;
@@ -48,6 +47,6 @@ public class CssClassFacetMethodFactory extends MethodPrefixBasedFacetFactoryAbs
             return;
         }
         processClassContext.removeMethod(method);
-        FacetUtil.addFacet(new CssClassFacetMethod(method, facetHolder));
+        super.addFacet(new CssClassFacetMethod(method, facetHolder));
     }
 }
diff --git a/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/object/defaults/annotcfg/DefaultedFacetAnnotationElseConfigurationFactory.java b/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/object/defaults/annotcfg/DefaultedFacetAnnotationElseConfigurationFactory.java
index 1e26690..f09c6db 100644
--- a/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/object/defaults/annotcfg/DefaultedFacetAnnotationElseConfigurationFactory.java
+++ b/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/object/defaults/annotcfg/DefaultedFacetAnnotationElseConfigurationFactory.java
@@ -22,7 +22,6 @@ package org.apache.isis.metamodel.facets.object.defaults.annotcfg;
 import org.apache.isis.applib.annotation.Defaulted;
 import org.apache.isis.commons.internal.base._Strings;
 import org.apache.isis.metamodel.facetapi.FacetHolder;
-import org.apache.isis.metamodel.facetapi.FacetUtil;
 import org.apache.isis.metamodel.facetapi.FeatureType;
 import org.apache.isis.metamodel.facets.Annotations;
 import org.apache.isis.metamodel.facets.FacetFactoryAbstract;
@@ -40,7 +39,7 @@ public class DefaultedFacetAnnotationElseConfigurationFactory extends FacetFacto
 
     @Override
     public void process(final ProcessClassContext processClassContext) {
-        FacetUtil.addFacet(create(processClassContext.getCls(), processClassContext.getFacetHolder()));
+        super.addFacet(create(processClassContext.getCls(), processClassContext.getFacetHolder()));
     }
 
     private DefaultedFacetAbstract create(final Class<?> cls, final FacetHolder holder) {
diff --git a/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/object/domainobject/DomainObjectAnnotationFacetFactory.java b/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/object/domainobject/DomainObjectAnnotationFacetFactory.java
index 942f0be..842ea49 100644
--- a/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/object/domainobject/DomainObjectAnnotationFacetFactory.java
+++ b/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/object/domainobject/DomainObjectAnnotationFacetFactory.java
@@ -39,8 +39,8 @@ import org.apache.isis.applib.events.lifecycle.ObjectUpdatedEvent;
 import org.apache.isis.applib.events.lifecycle.ObjectUpdatingEvent;
 import org.apache.isis.applib.services.HasUniqueId;
 import org.apache.isis.commons.internal.collections._Maps;
+import org.apache.isis.metamodel.MetaModelContext;
 import org.apache.isis.metamodel.facetapi.FacetHolder;
-import org.apache.isis.metamodel.facetapi.FacetUtil;
 import org.apache.isis.metamodel.facetapi.FeatureType;
 import org.apache.isis.metamodel.facetapi.MetaModelRefiner;
 import org.apache.isis.metamodel.facets.FacetFactoryAbstract;
@@ -86,6 +86,7 @@ implements MetaModelRefiner, PostConstructMethodCache, ObjectSpecIdFacetFactory
 
     private final MetaModelValidatorForValidationFailures autoCompleteMethodInvalid = 
             new MetaModelValidatorForValidationFailures();
+    
     private final MetaModelValidatorForMixinTypes mixinTypeValidator = 
             new MetaModelValidatorForMixinTypes("@DomainObject#nature=MIXIN");
 
@@ -94,6 +95,13 @@ implements MetaModelRefiner, PostConstructMethodCache, ObjectSpecIdFacetFactory
     public DomainObjectAnnotationFacetFactory() {
         super(FeatureType.OBJECTS_ONLY);
     }
+    
+    @Override
+    public void setMetaModelContext(MetaModelContext metaModelContext) {
+        super.setMetaModelContext(metaModelContext);
+        autoCompleteMethodInvalid.setMetaModelContext(metaModelContext);
+        mixinTypeValidator.setMetaModelContext(metaModelContext);
+    }
 
     @Override
     public void process(final ProcessObjectSpecIdContext processClassContext) {
@@ -136,7 +144,7 @@ implements MetaModelRefiner, PostConstructMethodCache, ObjectSpecIdFacetFactory
                 .create(auditing, getConfiguration(), facetHolder);
 
         // then add
-        FacetUtil.addFacet(auditableFacet);
+        super.addFacet(auditableFacet);
     }
 
 
@@ -159,7 +167,7 @@ implements MetaModelRefiner, PostConstructMethodCache, ObjectSpecIdFacetFactory
                 .create(publishing, getConfiguration(), facetHolder);
 
         // then add
-        FacetUtil.addFacet(publishedObjectFacet);
+        super.addFacet(publishedObjectFacet);
     }
     
     // -- AUTO COMPLETE
@@ -173,7 +181,7 @@ implements MetaModelRefiner, PostConstructMethodCache, ObjectSpecIdFacetFactory
         val facet = createFor(domainObjectIfAny, facetHolder, cls);
 
         // then add
-        FacetUtil.addFacet(facet);
+        super.addFacet(facet);
     }
     
     private final static class AnnotHelper {
@@ -247,7 +255,7 @@ implements MetaModelRefiner, PostConstructMethodCache, ObjectSpecIdFacetFactory
         val facet = ChoicesFacetForDomainObjectAnnotation.create(domainObjectIfAny, facetHolder);
 
         // then add
-        FacetUtil.addFacet(facet);
+        super.addFacet(facet);
     }
 
     void processEditing(final ProcessClassContext processClassContext) {
@@ -259,7 +267,7 @@ implements MetaModelRefiner, PostConstructMethodCache, ObjectSpecIdFacetFactory
                 .create(domainObjectIfAny, getConfiguration(), facetHolder);
 
         // then add
-        FacetUtil.addFacet(facet);
+        super.addFacet(facet);
     }
 
     void processObjectType(final ProcessObjectSpecIdContext processClassContext) {
@@ -280,7 +288,7 @@ implements MetaModelRefiner, PostConstructMethodCache, ObjectSpecIdFacetFactory
         //        }
 
         // then add
-        FacetUtil.addFacet(facet);
+        super.addFacet(facet);
     }
 
 
@@ -301,7 +309,7 @@ implements MetaModelRefiner, PostConstructMethodCache, ObjectSpecIdFacetFactory
                     postConstructMethodCache);
 
         if(recreatableObjectFacet != null) {
-            FacetUtil.addFacet(recreatableObjectFacet);
+            super.addFacet(recreatableObjectFacet);
         } else {
 
             val mixinDomainObjectIfAny =
@@ -311,7 +319,7 @@ implements MetaModelRefiner, PostConstructMethodCache, ObjectSpecIdFacetFactory
 
             val mixinFacet = 
                     MixinFacetForDomainObjectAnnotation.create(mixinDomainObjectIfAny, cls, facetHolder, getServiceInjector());
-            FacetUtil.addFacet(mixinFacet);
+            super.addFacet(mixinFacet);
         }
 
     }
@@ -360,7 +368,7 @@ implements MetaModelRefiner, PostConstructMethodCache, ObjectSpecIdFacetFactory
                 )
         .map(lifecycleEvent -> new CreatedLifecycleEventFacetForDomainObjectAnnotation(
                 holder, lifecycleEvent))
-        .ifPresent(FacetUtil::addFacet);
+        .ifPresent(super::addFacet);
     }
 
     private void processLifecycleEventLoaded(final Optional<DomainObject> domainObjectIfAny, final FacetHolder holder) {
@@ -376,7 +384,7 @@ implements MetaModelRefiner, PostConstructMethodCache, ObjectSpecIdFacetFactory
                 )
         .map(lifecycleEvent -> new LoadedLifecycleEventFacetForDomainObjectAnnotation(
                 holder, lifecycleEvent))
-        .ifPresent(FacetUtil::addFacet);
+        .ifPresent(super::addFacet);
     }
 
     private void processLifecycleEventPersisting(final Optional<DomainObject> domainObjectIfAny, final FacetHolder holder) {
@@ -392,7 +400,7 @@ implements MetaModelRefiner, PostConstructMethodCache, ObjectSpecIdFacetFactory
                 )
         .map(lifecycleEvent -> new PersistingLifecycleEventFacetForDomainObjectAnnotation(
                 holder, lifecycleEvent))
-        .ifPresent(FacetUtil::addFacet);
+        .ifPresent(super::addFacet);
     }
 
     private void processLifecycleEventPersisted(final Optional<DomainObject> domainObjectIfAny, final FacetHolder holder) {
@@ -408,7 +416,7 @@ implements MetaModelRefiner, PostConstructMethodCache, ObjectSpecIdFacetFactory
                 )
         .map(lifecycleEvent -> new PersistedLifecycleEventFacetForDomainObjectAnnotation(
                 holder, lifecycleEvent))
-        .ifPresent(FacetUtil::addFacet);
+        .ifPresent(super::addFacet);
     }
 
     private void processLifecycleEventRemoving(final Optional<DomainObject> domainObjectIfAny, final FacetHolder holder) {
@@ -424,7 +432,7 @@ implements MetaModelRefiner, PostConstructMethodCache, ObjectSpecIdFacetFactory
                 )
         .map(lifecycleEvent -> new RemovingLifecycleEventFacetForDomainObjectAnnotation(
                 holder, lifecycleEvent))
-        .ifPresent(FacetUtil::addFacet);
+        .ifPresent(super::addFacet);
     }
 
     private void processLifecycleEventUpdated(final Optional<DomainObject> domainObjectIfAny, final FacetHolder holder) {
@@ -440,7 +448,7 @@ implements MetaModelRefiner, PostConstructMethodCache, ObjectSpecIdFacetFactory
                 )
         .map(lifecycleEvent -> new UpdatedLifecycleEventFacetForDomainObjectAnnotation(
                 holder, lifecycleEvent))
-        .ifPresent(FacetUtil::addFacet);
+        .ifPresent(super::addFacet);
     }
 
     private void processLifecycleEventUpdating(final Optional<DomainObject> domainObjectIfAny, final FacetHolder holder) {
@@ -456,7 +464,7 @@ implements MetaModelRefiner, PostConstructMethodCache, ObjectSpecIdFacetFactory
                 )
         .map(lifecycleEvent -> new UpdatingLifecycleEventFacetForDomainObjectAnnotation(
                 holder, lifecycleEvent))
-        .ifPresent(FacetUtil::addFacet);
+        .ifPresent(super::addFacet);
     }
 
     private void processDomainEventAction(final Optional<DomainObject> domainObjectIfAny, final FacetHolder holder) {
@@ -466,7 +474,7 @@ implements MetaModelRefiner, PostConstructMethodCache, ObjectSpecIdFacetFactory
         .filter(domainEvent -> domainEvent != ActionDomainEvent.Default.class)
         .map(domainEvent -> new ActionDomainEventDefaultFacetForDomainObjectAnnotation(
                 holder, domainEvent))
-        .ifPresent(FacetUtil::addFacet);
+        .ifPresent(super::addFacet);
 
     }
 
@@ -477,7 +485,7 @@ implements MetaModelRefiner, PostConstructMethodCache, ObjectSpecIdFacetFactory
         .filter(domainEvent -> domainEvent != PropertyDomainEvent.Default.class)
         .map(domainEvent -> new PropertyDomainEventDefaultFacetForDomainObjectAnnotation(
                 holder, domainEvent))
-        .ifPresent(FacetUtil::addFacet);
+        .ifPresent(super::addFacet);
     }
 
     private void processDomainEventCollection(final Optional<DomainObject> domainObjectIfAny, final FacetHolder holder) {
@@ -487,7 +495,7 @@ implements MetaModelRefiner, PostConstructMethodCache, ObjectSpecIdFacetFactory
         .filter(domainEvent -> domainEvent != CollectionDomainEvent.Default.class)
         .map(domainEvent -> new CollectionDomainEventDefaultFacetForDomainObjectAnnotation(
                 holder, domainEvent))
-        .ifPresent(FacetUtil::addFacet);
+        .ifPresent(super::addFacet);
     }
 
     @Override
diff --git a/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/object/domainobjectlayout/DomainObjectLayoutFacetFactory.java b/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/object/domainobjectlayout/DomainObjectLayoutFacetFactory.java
index 147f6c7..52a37f5 100644
--- a/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/object/domainobjectlayout/DomainObjectLayoutFacetFactory.java
+++ b/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/object/domainobjectlayout/DomainObjectLayoutFacetFactory.java
@@ -19,7 +19,6 @@ package org.apache.isis.metamodel.facets.object.domainobjectlayout;
 import org.apache.isis.applib.annotation.DomainObjectLayout;
 import org.apache.isis.applib.annotation.ViewModelLayout;
 import org.apache.isis.commons.internal.base._Lazy;
-import org.apache.isis.metamodel.facetapi.FacetUtil;
 import org.apache.isis.metamodel.facetapi.FeatureType;
 import org.apache.isis.metamodel.facets.FacetFactoryAbstract;
 import org.apache.isis.metamodel.services.events.MetamodelEventService;
@@ -41,67 +40,67 @@ public class DomainObjectLayoutFacetFactory extends FacetFactoryAbstract {
 
         val metamodelEventService = this.metamodelEventService.get();
 
-        FacetUtil.addFacet(
+        super.addFacet(
                 TitleFacetViaDomainObjectLayoutAnnotationUsingTitleUiEvent.create(
                         domainObjectLayoutIfAny, metamodelEventService, getConfiguration(), facetHolder));
-        FacetUtil.addFacet(
+        super.addFacet(
                 TitleFacetViaViewModelLayoutAnnotationUsingTitleUiEvent.create(
                         viewModelLayoutIfAny, metamodelEventService, getConfiguration(), facetHolder));
 
-        FacetUtil.addFacet(
+        super.addFacet(
                 IconFacetViaDomainObjectLayoutAnnotationUsingIconUiEvent.create(
                         domainObjectLayoutIfAny, metamodelEventService, getConfiguration(), facetHolder));
-        FacetUtil.addFacet(
+        super.addFacet(
                 IconFacetViaViewModelLayoutAnnotationUsingIconUiEvent.create(
                         viewModelLayoutIfAny, metamodelEventService, getConfiguration(), facetHolder));
 
-        FacetUtil.addFacet(
+        super.addFacet(
                 CssClassFacetViaDomainObjectLayoutAnnotationUsingCssClassUiEvent.create(
                         domainObjectLayoutIfAny, metamodelEventService, getConfiguration(), facetHolder));
-        FacetUtil.addFacet(
+        super.addFacet(
                 CssClassFacetViaViewModelLayoutAnnotationUsingCssClassUiEvent.create(
                         viewModelLayoutIfAny, metamodelEventService, getConfiguration(), facetHolder));
 
-        FacetUtil.addFacet(
+        super.addFacet(
                 LayoutFacetViaDomainObjectLayoutAnnotationUsingLayoutUiEvent.create(
                         domainObjectLayoutIfAny, metamodelEventService, getConfiguration(), facetHolder));
-        FacetUtil.addFacet(
+        super.addFacet(
                 LayoutFacetViaViewModelLayoutAnnotationUsingLayoutUiEvent.create(
                         viewModelLayoutIfAny, metamodelEventService, getConfiguration() , facetHolder));
 
-        FacetUtil.addFacet(
+        super.addFacet(
                 CssClassFacetForDomainObjectLayoutAnnotation.create(domainObjectLayoutIfAny, facetHolder));
-        FacetUtil.addFacet(
+        super.addFacet(
                 CssClassFacetForViewModelLayoutAnnotation.create(viewModelLayoutIfAny, facetHolder));
 
-        FacetUtil.addFacet(
+        super.addFacet(
                 CssClassFaFacetForDomainObjectLayoutAnnotation.create(domainObjectLayoutIfAny, facetHolder));
-        FacetUtil.addFacet(
+        super.addFacet(
                 CssClassFaFacetForViewModelLayoutAnnotation.create(viewModelLayoutIfAny, facetHolder));
 
-        FacetUtil.addFacet(
+        super.addFacet(
                 DescribedAsFacetForDomainObjectLayoutAnnotation.create(domainObjectLayoutIfAny, facetHolder));
-        FacetUtil.addFacet(
+        super.addFacet(
                 DescribedAsFacetForViewModelLayoutAnnotation.create(viewModelLayoutIfAny, facetHolder));
 
-        FacetUtil.addFacet(
+        super.addFacet(
                 NamedFacetForDomainObjectLayoutAnnotation.create(domainObjectLayoutIfAny, facetHolder));
-        FacetUtil.addFacet(
+        super.addFacet(
                 NamedFacetForViewModelLayoutAnnotation.create(viewModelLayoutIfAny, facetHolder));
 
-        FacetUtil.addFacet(
+        super.addFacet(
                 PagedFacetForDomainObjectLayoutAnnotation.create(domainObjectLayoutIfAny, facetHolder));
-        FacetUtil.addFacet(
+        super.addFacet(
                 PagedFacetForViewModelLayoutAnnotation.create(viewModelLayoutIfAny, facetHolder));
 
-        FacetUtil.addFacet(
+        super.addFacet(
                 PluralFacetForDomainObjectLayoutAnnotation.create(domainObjectLayoutIfAny, facetHolder));
-        FacetUtil.addFacet(
+        super.addFacet(
                 PluralFacetForViewModelLayoutAnnotation.create(viewModelLayoutIfAny, facetHolder));
 
-        FacetUtil.addFacet(
+        super.addFacet(
                 BookmarkPolicyFacetForDomainObjectLayoutAnnotation.create(domainObjectLayoutIfAny, facetHolder));
-        FacetUtil.addFacet(
+        super.addFacet(
                 BookmarkPolicyFacetForViewModelLayoutAnnotation.create(viewModelLayoutIfAny, facetHolder));
 
         return;
diff --git a/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/object/domainservice/annotation/DomainServiceFacetAnnotationFactory.java b/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/object/domainservice/annotation/DomainServiceFacetAnnotationFactory.java
index 948bee5..9fd7142 100644
--- a/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/object/domainservice/annotation/DomainServiceFacetAnnotationFactory.java
+++ b/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/object/domainservice/annotation/DomainServiceFacetAnnotationFactory.java
@@ -24,7 +24,7 @@ import java.util.stream.Stream;
 
 import org.apache.isis.applib.Identifier;
 import org.apache.isis.applib.annotation.DomainService;
-import org.apache.isis.metamodel.facetapi.FacetUtil;
+import org.apache.isis.metamodel.MetaModelContext;
 import org.apache.isis.metamodel.facetapi.FeatureType;
 import org.apache.isis.metamodel.facetapi.MetaModelRefiner;
 import org.apache.isis.metamodel.facets.Annotations;
@@ -49,6 +49,12 @@ implements MetaModelRefiner {
     public DomainServiceFacetAnnotationFactory() {
         super(FeatureType.OBJECTS_ONLY);
     }
+    
+    @Override
+    public void setMetaModelContext(MetaModelContext metaModelContext) {
+        super.setMetaModelContext(metaModelContext);
+        mixinOnlyValidator.setMetaModelContext(metaModelContext);
+    }
 
     @SuppressWarnings("deprecation") // because we specifically want to handle deprecated enum use here
     @Override
@@ -62,10 +68,10 @@ implements MetaModelRefiner {
         val domainServiceFacet = new DomainServiceFacetAnnotation(
                 facetHolder,
                 domainServiceAnnotation.repositoryFor(), domainServiceAnnotation.nature());
-        FacetUtil.addFacet(domainServiceFacet);
+        super.addFacet(domainServiceFacet);
 
 
-        FacetUtil.addFacet(
+        super.addFacet(
                 new IconFacetDerivedFromDomainServiceAnnotation(
                         facetHolder,
                         domainServiceAnnotation.repositoryFor()));
diff --git a/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/object/domainservicelayout/DomainServiceLayoutFacetFactory.java b/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/object/domainservicelayout/DomainServiceLayoutFacetFactory.java
index c112f99..eb27155 100644
--- a/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/object/domainservicelayout/DomainServiceLayoutFacetFactory.java
+++ b/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/object/domainservicelayout/DomainServiceLayoutFacetFactory.java
@@ -23,7 +23,6 @@ import java.util.Objects;
 import org.apache.isis.applib.annotation.DomainService;
 import org.apache.isis.applib.annotation.DomainServiceLayout;
 import org.apache.isis.commons.internal.base._Strings;
-import org.apache.isis.metamodel.facetapi.FacetUtil;
 import org.apache.isis.metamodel.facetapi.FeatureType;
 import org.apache.isis.metamodel.facets.FacetFactoryAbstract;
 import org.apache.isis.metamodel.facets.object.domainservicelayout.annotation.DomainServiceLayoutFacetAnnotation;
@@ -57,7 +56,7 @@ public class DomainServiceLayoutFacetFactory extends FacetFactoryAbstract {
                 .filter(mb -> mb != DomainServiceLayout.MenuBar.NOT_SPECIFIED) // redundant since _Annotations
                 .orElse(DomainServiceLayout.MenuBar.PRIMARY);
         
-        FacetUtil.addFacet(new DomainServiceLayoutFacetAnnotation(facetHolder, menuBar));
+        super.addFacet(new DomainServiceLayoutFacetAnnotation(facetHolder, menuBar));
 
         val named = domainServiceLayoutIfAny
                 .map(DomainServiceLayout::named)
@@ -65,7 +64,7 @@ public class DomainServiceLayoutFacetFactory extends FacetFactoryAbstract {
                 .filter(Objects::nonNull)
                 .orElse(null);
         
-        FacetUtil.addFacet(NamedFacetForDomainServiceLayoutAnnotation.create(named, facetHolder));
+        super.addFacet(NamedFacetForDomainServiceLayoutAnnotation.create(named, facetHolder));
     }
 
 }
diff --git a/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/object/grid/GridFacetFactory.java b/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/object/grid/GridFacetFactory.java
index 03018ca..4803106 100644
--- a/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/object/grid/GridFacetFactory.java
+++ b/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/object/grid/GridFacetFactory.java
@@ -18,7 +18,6 @@ package org.apache.isis.metamodel.facets.object.grid;
 
 import org.apache.isis.applib.services.grid.GridService;
 import org.apache.isis.commons.internal.base._Lazy;
-import org.apache.isis.metamodel.facetapi.FacetUtil;
 import org.apache.isis.metamodel.facetapi.FeatureType;
 import org.apache.isis.metamodel.facets.FacetFactoryAbstract;
 
@@ -36,7 +35,7 @@ public class GridFacetFactory extends FacetFactoryAbstract {
             return;
         }
         val facetHolder = processClassContext.getFacetHolder();
-        FacetUtil.addFacet(GridFacetDefault.create(facetHolder, gridService.get()));
+        super.addFacet(GridFacetDefault.create(facetHolder, gridService.get()));
     }
     
     private final _Lazy<GridService> gridService = _Lazy.threadSafe(()->
diff --git a/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/object/layout/LayoutFacetFactory.java b/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/object/layout/LayoutFacetFactory.java
index 7bcbac7..41c63c6 100644
--- a/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/object/layout/LayoutFacetFactory.java
+++ b/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/object/layout/LayoutFacetFactory.java
@@ -22,7 +22,6 @@ package org.apache.isis.metamodel.facets.object.layout;
 import java.lang.reflect.Method;
 
 import org.apache.isis.metamodel.facetapi.FacetHolder;
-import org.apache.isis.metamodel.facetapi.FacetUtil;
 import org.apache.isis.metamodel.facetapi.FeatureType;
 import org.apache.isis.metamodel.facets.MethodFinderUtils;
 import org.apache.isis.metamodel.facets.MethodPrefixBasedFacetFactoryAbstract;
@@ -52,6 +51,6 @@ public class LayoutFacetFactory extends MethodPrefixBasedFacetFactoryAbstract {
             processClassContext.removeMethod(method);
             facet = new LayoutFacetMethod(method, facetHolder);
         }
-        FacetUtil.addFacet(facet);
+        super.addFacet(facet);
     }
 }
diff --git a/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/object/navparent/annotation/NavigableParentAnnotationFacetFactory.java b/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/object/navparent/annotation/NavigableParentAnnotationFacetFactory.java
index f5d6adc..716a876 100644
--- a/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/object/navparent/annotation/NavigableParentAnnotationFacetFactory.java
+++ b/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/object/navparent/annotation/NavigableParentAnnotationFacetFactory.java
@@ -25,7 +25,6 @@ import java.util.List;
 import org.apache.isis.applib.annotation.PropertyLayout;
 import org.apache.isis.commons.internal.base._NullSafe;
 import org.apache.isis.metamodel.facetapi.FacetHolder;
-import org.apache.isis.metamodel.facetapi.FacetUtil;
 import org.apache.isis.metamodel.facetapi.FeatureType;
 import org.apache.isis.metamodel.facetapi.MetaModelRefiner;
 import org.apache.isis.metamodel.facets.Annotations;
@@ -88,7 +87,7 @@ implements MetaModelRefiner {
         }
 
         try {
-            FacetUtil.addFacet(new NavigableParentFacetMethod(method, facetHolder));
+            super.addFacet(new NavigableParentFacetMethod(method, facetHolder));
         } catch (IllegalAccessException e) {
             e.printStackTrace();
         }
diff --git a/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/object/objectvalidprops/impl/ObjectValidPropertiesFacetImplFactory.java b/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/object/objectvalidprops/impl/ObjectValidPropertiesFacetImplFactory.java
index e0c78ff..99f9b15 100644
--- a/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/object/objectvalidprops/impl/ObjectValidPropertiesFacetImplFactory.java
+++ b/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/object/objectvalidprops/impl/ObjectValidPropertiesFacetImplFactory.java
@@ -19,7 +19,6 @@
 
 package org.apache.isis.metamodel.facets.object.objectvalidprops.impl;
 
-import org.apache.isis.metamodel.facetapi.FacetUtil;
 import org.apache.isis.metamodel.facetapi.FeatureType;
 import org.apache.isis.metamodel.facets.FacetFactoryAbstract;
 
@@ -31,6 +30,6 @@ public class ObjectValidPropertiesFacetImplFactory extends FacetFactoryAbstract
 
     @Override
     public void process(final ProcessClassContext processClassContaxt) {
-        FacetUtil.addFacet(new ObjectValidPropertiesFacetImpl(processClassContaxt.getFacetHolder()));
+        super.addFacet(new ObjectValidPropertiesFacetImpl(processClassContaxt.getFacetHolder()));
     }
 }
diff --git a/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/object/recreatable/DisabledFacetOnCollectionDerivedFromViewModelFacetFactory.java b/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/object/recreatable/DisabledFacetOnCollectionDerivedFromViewModelFacetFactory.java
index d980b00..00043c4 100644
--- a/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/object/recreatable/DisabledFacetOnCollectionDerivedFromViewModelFacetFactory.java
+++ b/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/object/recreatable/DisabledFacetOnCollectionDerivedFromViewModelFacetFactory.java
@@ -21,7 +21,6 @@ package org.apache.isis.metamodel.facets.object.recreatable;
 
 import java.lang.reflect.Method;
 
-import org.apache.isis.metamodel.facetapi.FacetUtil;
 import org.apache.isis.metamodel.facetapi.FeatureType;
 import org.apache.isis.metamodel.facets.FacetFactoryAbstract;
 import org.apache.isis.metamodel.facets.FacetedMethod;
@@ -48,7 +47,7 @@ public class DisabledFacetOnCollectionDerivedFromViewModelFacetFactory extends F
         final DisabledFacetAbstract.Semantics semantics = Util.inferSemanticsFrom(facet);
 
         final FacetedMethod facetHolder = processMethodContext.getFacetHolder();
-        FacetUtil.addFacet(new DisabledFacetOnCollectionDerivedFromRecreatableObject(facetHolder, semantics));
+        super.addFacet(new DisabledFacetOnCollectionDerivedFromRecreatableObject(facetHolder, semantics));
     }
 
 
diff --git a/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/object/recreatable/DisabledFacetOnPropertyDerivedFromRecreatableObjectFacetFactory.java b/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/object/recreatable/DisabledFacetOnPropertyDerivedFromRecreatableObjectFacetFactory.java
index 90bf67a..cee5ac1 100644
--- a/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/object/recreatable/DisabledFacetOnPropertyDerivedFromRecreatableObjectFacetFactory.java
+++ b/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/object/recreatable/DisabledFacetOnPropertyDerivedFromRecreatableObjectFacetFactory.java
@@ -21,7 +21,6 @@ package org.apache.isis.metamodel.facets.object.recreatable;
 
 import java.lang.reflect.Method;
 
-import org.apache.isis.metamodel.facetapi.FacetUtil;
 import org.apache.isis.metamodel.facetapi.FeatureType;
 import org.apache.isis.metamodel.facets.FacetFactoryAbstract;
 import org.apache.isis.metamodel.facets.FacetedMethod;
@@ -47,7 +46,7 @@ public class DisabledFacetOnPropertyDerivedFromRecreatableObjectFacetFactory ext
         final DisabledFacetAbstract.Semantics semantics = Util.inferSemanticsFrom(facet);
 
         final FacetedMethod facetHolder = processMethodContext.getFacetHolder();
-        FacetUtil.addFacet(new DisabledFacetOnPropertyDerivedFromRecreatableObject(facetHolder, semantics));
+        super.addFacet(new DisabledFacetOnPropertyDerivedFromRecreatableObject(facetHolder, semantics));
     }
 
 }
diff --git a/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/object/title/annotation/TitleFacetViaTitleAnnotation.java b/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/object/title/annotation/TitleFacetViaTitleAnnotation.java
index e3d5307..2c27489 100644
--- a/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/object/title/annotation/TitleFacetViaTitleAnnotation.java
+++ b/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/object/title/annotation/TitleFacetViaTitleAnnotation.java
@@ -27,7 +27,6 @@ import java.util.function.Function;
 import org.apache.isis.applib.annotation.Title;
 import org.apache.isis.commons.internal.base._Strings;
 import org.apache.isis.commons.internal.collections._Lists;
-import org.apache.isis.commons.internal.environment.IsisSystemEnvironment;
 import org.apache.isis.metamodel.adapter.ObjectAdapter;
 import org.apache.isis.metamodel.adapter.ObjectAdapterProvider;
 import org.apache.isis.metamodel.facetapi.FacetHolder;
@@ -35,6 +34,7 @@ import org.apache.isis.metamodel.facets.Annotations;
 import org.apache.isis.metamodel.facets.object.title.TitleFacetAbstract;
 import org.apache.isis.metamodel.spec.ManagedObject;
 
+import lombok.val;
 import lombok.extern.log4j.Log4j2;
 
 @Log4j2
@@ -120,7 +120,6 @@ public class TitleFacetViaTitleAnnotation extends TitleFacetAbstract {
         return str.length() < maxLength ? str : str.substring(0, maxLength - 3) + "...";
     }
 
-    @SuppressWarnings("deprecation")
     @Override
     public String title(ManagedObject contextAdapter, ManagedObject targetAdapter) {
         final StringBuilder stringBuilder = new StringBuilder();
@@ -153,7 +152,10 @@ public class TitleFacetViaTitleAnnotation extends TitleFacetAbstract {
 
             return stringBuilder.toString().trim();
         } catch (final RuntimeException ex) {
-            if(!IsisSystemEnvironment.get().isUnitTesting()) {
+            
+            val isUnitTesting = super.getMetaModelContext().getSystemEnvironment().isUnitTesting();
+            
+            if(!isUnitTesting) {
                 log.warn("Title failure", ex);    
             }
             return "Failed Title";
diff --git a/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/object/title/methods/TitleFacetViaTitleMethod.java b/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/object/title/methods/TitleFacetViaTitleMethod.java
index 5e1a869..bb8eb4b 100644
--- a/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/object/title/methods/TitleFacetViaTitleMethod.java
+++ b/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/object/title/methods/TitleFacetViaTitleMethod.java
@@ -26,13 +26,13 @@ import java.util.Map;
 
 import org.apache.isis.applib.services.i18n.TranslatableString;
 import org.apache.isis.applib.services.i18n.TranslationService;
-import org.apache.isis.commons.internal.environment.IsisSystemEnvironment;
 import org.apache.isis.metamodel.adapter.ObjectAdapter;
 import org.apache.isis.metamodel.facetapi.FacetHolder;
 import org.apache.isis.metamodel.facets.ImperativeFacet;
 import org.apache.isis.metamodel.facets.object.title.TitleFacetAbstract;
 import org.apache.isis.metamodel.spec.ManagedObject;
 
+import lombok.val;
 import lombok.extern.log4j.Log4j2;
 
 @Log4j2
@@ -63,7 +63,6 @@ public class TitleFacetViaTitleMethod extends TitleFacetAbstract implements Impe
         return Intent.UI_HINT;
     }
 
-    @SuppressWarnings("deprecation")
     @Override
     public String title(final ManagedObject owningAdapter) {
         try {
@@ -77,7 +76,10 @@ public class TitleFacetViaTitleMethod extends TitleFacetAbstract implements Impe
             }
             return null;
         } catch (final RuntimeException ex) {
-            if(!IsisSystemEnvironment.get().isUnitTesting()) {
+            
+            val isUnitTesting = super.getMetaModelContext().getSystemEnvironment().isUnitTesting();
+            
+            if(!isUnitTesting) {
                 log.warn("Title failure", ex);    
             }
             return "Failed Title";
diff --git a/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/object/validating/mustsatisfyspec/MustSatisfySpecificationFromMustSatisfyAnnotationOnTypeFacet.java b/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/object/validating/mustsatisfyspec/MustSatisfySpecificationFromMustSatisfyAnnotationOnTypeFacet.java
deleted file mode 100644
index cb22b80..0000000
--- a/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/object/validating/mustsatisfyspec/MustSatisfySpecificationFromMustSatisfyAnnotationOnTypeFacet.java
+++ /dev/null
@@ -1,84 +0,0 @@
-/*
- *  Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you under the Apache License, Version 2.0 (the
- *  "License"); you may not use this file except in compliance
- *  with the License.  You may obtain a copy of the License at
- *
- *        http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing,
- *  software distributed under the License is distributed on an
- *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- *  KIND, either express or implied.  See the License for the
- *  specific language governing permissions and limitations
- *  under the License.
- */
-
-package org.apache.isis.metamodel.facets.object.validating.mustsatisfyspec;
-
-import java.util.List;
-import java.util.Map;
-
-import org.apache.isis.applib.services.i18n.TranslationService;
-import org.apache.isis.applib.services.inject.ServiceInjector;
-import org.apache.isis.applib.services.wrapper.events.ValidityEvent;
-import org.apache.isis.applib.spec.Specification;
-import org.apache.isis.metamodel.facetapi.Facet;
-import org.apache.isis.metamodel.facetapi.FacetAbstract;
-import org.apache.isis.metamodel.facetapi.FacetHolder;
-import org.apache.isis.metamodel.facetapi.IdentifiedHolder;
-import org.apache.isis.metamodel.facets.objectvalue.mustsatisfyspec.SpecificationEvaluator;
-import org.apache.isis.metamodel.interactions.ProposedHolder;
-import org.apache.isis.metamodel.interactions.ValidatingInteractionAdvisor;
-import org.apache.isis.metamodel.interactions.ValidityContext;
-import org.apache.isis.metamodel.spec.ManagedObject;
-
-/**
- * @deprecated
- */
-@Deprecated
-public class MustSatisfySpecificationFromMustSatisfyAnnotationOnTypeFacet extends FacetAbstract implements ValidatingInteractionAdvisor {
-
-    public static Class<? extends Facet> type() {
-        return MustSatisfySpecificationFromMustSatisfyAnnotationOnTypeFacet.class;
-    }
-
-    private final List<Specification> specifications;
-
-    private final SpecificationEvaluator specificationEvaluator;
-
-    public MustSatisfySpecificationFromMustSatisfyAnnotationOnTypeFacet(
-            final List<Specification> specifications,
-            final FacetHolder holder,
-            final ServiceInjector servicesInjector) {
-        super(type(), holder, Derivation.NOT_DERIVED);
-        this.specifications = specifications;
-
-        final TranslationService translationService = getTranslationService();
-        // sadness: same as in TranslationFactory
-        final String translationContext = ((IdentifiedHolder) holder).getIdentifier().toClassAndNameIdentityString();
-
-        specificationEvaluator = new SpecificationEvaluator(translationService, translationContext);
-    }
-
-    @Override
-    public String invalidates(final ValidityContext<? extends ValidityEvent> validityContext) {
-        if (!(validityContext instanceof ProposedHolder)) {
-            return null;
-        }
-        final ProposedHolder proposedHolder = (ProposedHolder) validityContext;
-        final ManagedObject targetNO = proposedHolder.getProposed();
-        final Object targetObject = targetNO.getPojo();
-        return specificationEvaluator.evaluation()
-                .evaluate(specifications, targetObject)
-                .getReason();
-    }
-
-    @Override public void appendAttributesTo(final Map<String, Object> attributeMap) {
-        super.appendAttributesTo(attributeMap);
-        attributeMap.put("specifications", specifications);
-    }
-}
diff --git a/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/object/value/annotcfg/ValueFacetAnnotationOrConfigurationFactory.java b/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/object/value/annotcfg/ValueFacetAnnotationOrConfigurationFactory.java
index 35b1bc0..5073cd1 100644
--- a/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/object/value/annotcfg/ValueFacetAnnotationOrConfigurationFactory.java
+++ b/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/object/value/annotcfg/ValueFacetAnnotationOrConfigurationFactory.java
@@ -23,8 +23,6 @@ import org.apache.isis.applib.adapters.EncoderDecoder;
 import org.apache.isis.applib.adapters.Parser;
 import org.apache.isis.applib.annotation.Value;
 import org.apache.isis.commons.internal.base._Strings;
-import org.apache.isis.config.IsisConfiguration;
-import org.apache.isis.metamodel.MetaModelContext;
 import org.apache.isis.metamodel.facetapi.FacetHolder;
 import org.apache.isis.metamodel.facetapi.FacetUtil;
 import org.apache.isis.metamodel.facetapi.FeatureType;
@@ -40,6 +38,8 @@ import org.apache.isis.metamodel.facets.object.value.EqualByContentFacet;
 import org.apache.isis.metamodel.facets.object.value.ValueFacet;
 import org.apache.isis.metamodel.facets.object.value.vsp.ValueSemanticsProviderUtil;
 
+import lombok.val;
+
 /**
  * Processes the {@link Value} annotation.
  *
@@ -83,7 +83,7 @@ public class ValueFacetAnnotationOrConfigurationFactory extends FacetFactoryAbst
      */
     private ValueFacet create(final Class<?> cls, final FacetHolder holder) {
         
-        IsisConfiguration config = MetaModelContext.current().getConfiguration();
+        val config = super.getMetaModelContext().getConfiguration();
 
         // create from annotation, if present
         final Value annotation = Annotations.getAnnotation(cls, Value.class);
diff --git a/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/objectvalue/mandatory/MandatoryFacetAbstract.java b/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/objectvalue/mandatory/MandatoryFacetAbstract.java
index 9967825..6323a02 100644
--- a/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/objectvalue/mandatory/MandatoryFacetAbstract.java
+++ b/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/objectvalue/mandatory/MandatoryFacetAbstract.java
@@ -22,6 +22,7 @@ package org.apache.isis.metamodel.facets.objectvalue.mandatory;
 import java.util.Map;
 
 import org.apache.isis.applib.services.wrapper.events.ValidityEvent;
+import org.apache.isis.commons.internal.base._Strings;
 import org.apache.isis.metamodel.adapter.ObjectAdapter;
 import org.apache.isis.metamodel.facetapi.Facet;
 import org.apache.isis.metamodel.facetapi.FacetHolder;
@@ -33,6 +34,8 @@ import org.apache.isis.metamodel.interactions.ProposedHolder;
 import org.apache.isis.metamodel.interactions.ValidityContext;
 import org.apache.isis.metamodel.spec.ManagedObject;
 
+import lombok.val;
+
 public abstract class MandatoryFacetAbstract extends MarkerFacetAbstract implements MandatoryFacet {
 
     public static Class<? extends Facet> type() {
@@ -61,15 +64,16 @@ public abstract class MandatoryFacetAbstract extends MarkerFacetAbstract impleme
     @Override
     public final boolean isRequiredButNull(final ManagedObject adapter) {
         if(!isInvertedSemantics()) {
-            final Object object = ObjectAdapter.Util.unwrapPojo(adapter);
-            if (object == null) {
-                return true;
-            }
+            val pojo = ManagedObject.unwrapPojo(adapter);
+            
             // special case string handling.
-            final String str = ObjectAdapter.Util.unwrapPojoStringElse(adapter, null);
-            return str != null && str.length() == 0;
+            if(pojo instanceof String) {
+                return _Strings.isEmpty((String)pojo);
+            }
+            
+            return pojo == null;
         } else {
-            return false;
+            return false; // policy is not enforced
         }
     }
 
diff --git a/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/param/autocomplete/method/ActionParameterAutoCompleteFacetViaMethodFactory.java b/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/param/autocomplete/method/ActionParameterAutoCompleteFacetViaMethodFactory.java
index d157b24..88ffa4e 100644
--- a/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/param/autocomplete/method/ActionParameterAutoCompleteFacetViaMethodFactory.java
+++ b/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/param/autocomplete/method/ActionParameterAutoCompleteFacetViaMethodFactory.java
@@ -26,7 +26,6 @@ import java.util.List;
 import java.util.Set;
 
 import org.apache.isis.metamodel.commons.StringExtensions;
-import org.apache.isis.metamodel.facetapi.FacetUtil;
 import org.apache.isis.metamodel.facetapi.FeatureType;
 import org.apache.isis.metamodel.facets.FacetedMethod;
 import org.apache.isis.metamodel.facets.FacetedMethodParameter;
@@ -81,7 +80,7 @@ public class ActionParameterAutoCompleteFacetViaMethodFactory extends MethodPref
 
             // add facets directly to parameters, not to actions
             final FacetedMethodParameter paramAsHolder = parameters.get(i);
-            FacetUtil.addFacet(
+            super.addFacet(
                     new ActionParameterAutoCompleteFacetViaMethod(
                             autoCompleteMethod, paramType, paramAsHolder));
         }
diff --git a/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/param/bigdecimal/javaxvaldigits/BigDecimalFacetOnParameterFromJavaxValidationAnnotationFactory.java b/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/param/bigdecimal/javaxvaldigits/BigDecimalFacetOnParameterFromJavaxValidationAnnotationFactory.java
index c37f76f..6d71f08 100644
--- a/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/param/bigdecimal/javaxvaldigits/BigDecimalFacetOnParameterFromJavaxValidationAnnotationFactory.java
+++ b/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/param/bigdecimal/javaxvaldigits/BigDecimalFacetOnParameterFromJavaxValidationAnnotationFactory.java
@@ -23,7 +23,6 @@ import java.math.BigDecimal;
 import javax.validation.constraints.Digits;
 
 import org.apache.isis.metamodel.facetapi.FacetHolder;
-import org.apache.isis.metamodel.facetapi.FacetUtil;
 import org.apache.isis.metamodel.facetapi.FeatureType;
 import org.apache.isis.metamodel.facets.FacetFactoryAbstract;
 import org.apache.isis.metamodel.facets.value.bigdecimal.BigDecimalValueFacet;
@@ -43,7 +42,7 @@ public class BigDecimalFacetOnParameterFromJavaxValidationAnnotationFactory exte
 
         processParameterContext.synthesizeOnParameter(Digits.class)
         .ifPresent(digits->{
-            FacetUtil.addFacet(create(digits, processParameterContext.getFacetHolder()));
+            super.addFacet(create(digits, processParameterContext.getFacetHolder()));
         });
         
     }
diff --git a/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/param/choices/enums/ActionParameterChoicesFacetDerivedFromChoicesFacetFactory.java b/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/param/choices/enums/ActionParameterChoicesFacetDerivedFromChoicesFacetFactory.java
index c9d60f6..b4226d2 100644
--- a/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/param/choices/enums/ActionParameterChoicesFacetDerivedFromChoicesFacetFactory.java
+++ b/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/param/choices/enums/ActionParameterChoicesFacetDerivedFromChoicesFacetFactory.java
@@ -19,7 +19,6 @@
 
 package org.apache.isis.metamodel.facets.param.choices.enums;
 
-import org.apache.isis.metamodel.facetapi.FacetUtil;
 import org.apache.isis.metamodel.facetapi.FeatureType;
 import org.apache.isis.metamodel.facets.FacetFactoryAbstract;
 import org.apache.isis.metamodel.facets.FacetedMethodParameter;
@@ -49,7 +48,7 @@ public class ActionParameterChoicesFacetDerivedFromChoicesFacetFactory extends F
             return;
         }
 
-        FacetUtil.addFacet(new ActionParameterChoicesFacetDerivedFromChoicesFacet(facetHolder));
+        super.addFacet(new ActionParameterChoicesFacetDerivedFromChoicesFacet(facetHolder));
     }
 
 
diff --git a/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/param/choices/method/ActionChoicesFacetViaMethodFactory.java b/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/param/choices/method/ActionChoicesFacetViaMethodFactory.java
index 6282e84..4e3c225 100644
--- a/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/param/choices/method/ActionChoicesFacetViaMethodFactory.java
+++ b/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/param/choices/method/ActionChoicesFacetViaMethodFactory.java
@@ -81,7 +81,9 @@ public class ActionChoicesFacetViaMethodFactory extends MethodPrefixBasedFacetFa
         final Class<?> returnType = actionMethod.getReturnType();
         final FacetHolder action = processMethodContext.getFacetHolder();
         final ActionChoicesFacetViaMethod facet = new ActionChoicesFacetViaMethod(choicesMethod, returnType, action);
-        FacetUtil.addFacet(facet);
+        
+        super.addFacet(facet);
+        
     }
 
     protected Method findChoicesMethodReturning(final ProcessMethodContext processMethodContext, final Class<?> returnType2) {
diff --git a/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/param/choices/methodnum/ActionParameterChoicesFacetViaMethodFactory.java b/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/param/choices/methodnum/ActionParameterChoicesFacetViaMethodFactory.java
index 809242b..439db7e 100644
--- a/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/param/choices/methodnum/ActionParameterChoicesFacetViaMethodFactory.java
+++ b/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/param/choices/methodnum/ActionParameterChoicesFacetViaMethodFactory.java
@@ -28,13 +28,12 @@ import org.apache.isis.metamodel.commons.ListExtensions;
 import org.apache.isis.metamodel.commons.StringExtensions;
 import org.apache.isis.metamodel.exceptions.MetaModelException;
 import org.apache.isis.metamodel.facetapi.Facet;
-import org.apache.isis.metamodel.facetapi.FacetUtil;
 import org.apache.isis.metamodel.facetapi.FeatureType;
 import org.apache.isis.metamodel.facets.FacetedMethod;
 import org.apache.isis.metamodel.facets.FacetedMethodParameter;
 import org.apache.isis.metamodel.facets.MethodFinderUtils;
-import org.apache.isis.metamodel.facets.MethodPrefixBasedFacetFactoryAbstract;
 import org.apache.isis.metamodel.facets.MethodLiteralConstants;
+import org.apache.isis.metamodel.facets.MethodPrefixBasedFacetFactoryAbstract;
 import org.apache.isis.metamodel.facets.param.choices.ActionChoicesFacet;
 import org.apache.isis.metamodel.methodutils.MethodScope;
 
@@ -92,7 +91,7 @@ public class ActionParameterChoicesFacetViaMethodFactory extends MethodPrefixBas
 
             // add facets directly to parameters, not to actions
             final FacetedMethodParameter paramAsHolder = parameters.get(i);
-            FacetUtil.addFacet(new ActionParameterChoicesFacetViaMethod(choicesMethod, arrayOfParamType, paramAsHolder));
+            super.addFacet(new ActionParameterChoicesFacetViaMethod(choicesMethod, arrayOfParamType, paramAsHolder));
         }
     }
 
diff --git a/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/param/defaults/fromtype/ActionParameterDefaultFacetDerivedFromTypeFactory.java b/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/param/defaults/fromtype/ActionParameterDefaultFacetDerivedFromTypeFactory.java
index dc93233..4a8a5a0 100644
--- a/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/param/defaults/fromtype/ActionParameterDefaultFacetDerivedFromTypeFactory.java
+++ b/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/param/defaults/fromtype/ActionParameterDefaultFacetDerivedFromTypeFactory.java
@@ -19,7 +19,6 @@
 
 package org.apache.isis.metamodel.facets.param.defaults.fromtype;
 
-import org.apache.isis.metamodel.facetapi.FacetUtil;
 import org.apache.isis.metamodel.facetapi.FeatureType;
 import org.apache.isis.metamodel.facets.FacetFactoryAbstract;
 import org.apache.isis.metamodel.facets.actions.defaults.ActionDefaultsFacet;
@@ -53,7 +52,7 @@ public class ActionParameterDefaultFacetDerivedFromTypeFactory extends FacetFact
             hasAtLeastOneDefault = hasAtLeastOneDefault | (parameterTypeDefaultedFacets[i] != null);
         }
         if (hasAtLeastOneDefault) {
-            FacetUtil.addFacet(new ActionParameterDefaultFacetDerivedFromTypeFacets(parameterTypeDefaultedFacets, processParameterContext.getFacetHolder()));
+            super.addFacet(new ActionParameterDefaultFacetDerivedFromTypeFacets(parameterTypeDefaultedFacets, processParameterContext.getFacetHolder()));
         }
     }
 
diff --git a/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/param/defaults/methodnum/ActionParameterDefaultsFacetViaMethodFactory.java b/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/param/defaults/methodnum/ActionParameterDefaultsFacetViaMethodFactory.java
index b731a50..180e7a5 100644
--- a/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/param/defaults/methodnum/ActionParameterDefaultsFacetViaMethodFactory.java
+++ b/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/param/defaults/methodnum/ActionParameterDefaultsFacetViaMethodFactory.java
@@ -26,13 +26,12 @@ import org.apache.isis.commons.internal.collections._Arrays;
 import org.apache.isis.metamodel.commons.StringExtensions;
 import org.apache.isis.metamodel.exceptions.MetaModelException;
 import org.apache.isis.metamodel.facetapi.Facet;
-import org.apache.isis.metamodel.facetapi.FacetUtil;
 import org.apache.isis.metamodel.facetapi.FeatureType;
 import org.apache.isis.metamodel.facets.FacetedMethod;
 import org.apache.isis.metamodel.facets.FacetedMethodParameter;
 import org.apache.isis.metamodel.facets.MethodFinderUtils;
-import org.apache.isis.metamodel.facets.MethodPrefixBasedFacetFactoryAbstract;
 import org.apache.isis.metamodel.facets.MethodLiteralConstants;
+import org.apache.isis.metamodel.facets.MethodPrefixBasedFacetFactoryAbstract;
 import org.apache.isis.metamodel.facets.actions.defaults.ActionDefaultsFacet;
 import org.apache.isis.metamodel.methodutils.MethodScope;
 
@@ -93,7 +92,7 @@ public class ActionParameterDefaultsFacetViaMethodFactory extends MethodPrefixBa
 
             // add facets directly to parameters, not to actions
             final FacetedMethodParameter paramAsHolder = parameters.get(i);
-            FacetUtil.addFacet(new ActionParameterDefaultsFacetViaMethod(defaultMethod, i, paramAsHolder));
+            super.addFacet(new ActionParameterDefaultsFacetViaMethod(defaultMethod, i, paramAsHolder));
         }
     }
     
diff --git a/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/param/disable/method/ActionParameterDisabledFacetViaMethodFactory.java b/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/param/disable/method/ActionParameterDisabledFacetViaMethodFactory.java
index 8a6c91f..7838227 100644
--- a/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/param/disable/method/ActionParameterDisabledFacetViaMethodFactory.java
+++ b/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/param/disable/method/ActionParameterDisabledFacetViaMethodFactory.java
@@ -26,7 +26,6 @@ import org.apache.isis.applib.services.i18n.TranslationService;
 import org.apache.isis.metamodel.commons.ListExtensions;
 import org.apache.isis.metamodel.commons.StringExtensions;
 import org.apache.isis.metamodel.facetapi.Facet;
-import org.apache.isis.metamodel.facetapi.FacetUtil;
 import org.apache.isis.metamodel.facetapi.FeatureType;
 import org.apache.isis.metamodel.facetapi.IdentifiedHolder;
 import org.apache.isis.metamodel.facets.MethodFinderUtils;
@@ -82,7 +81,7 @@ public class ActionParameterDisabledFacetViaMethodFactory extends MethodPrefixBa
 
                 final Facet facet = new ActionParameterDisabledFacetViaMethod(disableMethod,
                         translationService, translationContext, facetHolder);
-                FacetUtil.addFacet(facet);
+                super.addFacet(facet);
                 return;
             }
 
diff --git a/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/param/hide/method/ActionParameterHiddenFacetViaMethodFactory.java b/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/param/hide/method/ActionParameterHiddenFacetViaMethodFactory.java
index b927dcb..8d2296a 100644
--- a/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/param/hide/method/ActionParameterHiddenFacetViaMethodFactory.java
+++ b/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/param/hide/method/ActionParameterHiddenFacetViaMethodFactory.java
@@ -25,12 +25,11 @@ import java.util.List;
 import org.apache.isis.metamodel.commons.ListExtensions;
 import org.apache.isis.metamodel.commons.StringExtensions;
 import org.apache.isis.metamodel.facetapi.Facet;
-import org.apache.isis.metamodel.facetapi.FacetUtil;
 import org.apache.isis.metamodel.facetapi.FeatureType;
 import org.apache.isis.metamodel.facetapi.IdentifiedHolder;
 import org.apache.isis.metamodel.facets.MethodFinderUtils;
-import org.apache.isis.metamodel.facets.MethodPrefixBasedFacetFactoryAbstract;
 import org.apache.isis.metamodel.facets.MethodLiteralConstants;
+import org.apache.isis.metamodel.facets.MethodPrefixBasedFacetFactoryAbstract;
 import org.apache.isis.metamodel.facets.param.hide.ActionParameterHiddenFacet;
 import org.apache.isis.metamodel.methodutils.MethodScope;
 import org.apache.isis.metamodel.services.persistsession.PersistenceSessionServiceInternal;
@@ -76,7 +75,7 @@ public class ActionParameterHiddenFacetViaMethodFactory extends MethodPrefixBase
                 processParameterContext.removeMethod(hideMethod);
 
                 final Facet facet = new ActionParameterHiddenFacetViaMethod(hideMethod, facetHolder);
-                FacetUtil.addFacet(facet);
+                super.addFacet(facet);
                 return;
             }
 
diff --git a/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/param/layout/ParameterLayoutFacetFactory.java b/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/param/layout/ParameterLayoutFacetFactory.java
index 9cdff72..806ab0b 100644
--- a/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/param/layout/ParameterLayoutFacetFactory.java
+++ b/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/param/layout/ParameterLayoutFacetFactory.java
@@ -22,7 +22,6 @@ package org.apache.isis.metamodel.facets.param.layout;
 import java.util.Optional;
 
 import org.apache.isis.applib.annotation.ParameterLayout;
-import org.apache.isis.metamodel.facetapi.FacetUtil;
 import org.apache.isis.metamodel.facetapi.FeatureType;
 import org.apache.isis.metamodel.facets.FacetFactoryAbstract;
 
@@ -46,13 +45,13 @@ public class ParameterLayoutFacetFactory extends FacetFactoryAbstract {
         
         val facetHolder = processParameterContext.getFacetHolder();
 
-        FacetUtil.addFacet(CssClassFacetForParameterLayoutAnnotation.create(parameterLayoutIfAny, facetHolder));
-        FacetUtil.addFacet(DescribedAsFacetForParameterLayoutAnnotation.create(parameterLayoutIfAny, facetHolder));
-        FacetUtil.addFacet(LabelAtFacetForParameterLayoutAnnotation.create(parameterLayoutIfAny, facetHolder));
-        FacetUtil.addFacet(MultiLineFacetForParameterLayoutAnnotation.create(parameterLayoutIfAny, facetHolder));
-        FacetUtil.addFacet(NamedFacetForParameterLayoutAnnotation.create(parameterLayoutIfAny, facetHolder));
-        FacetUtil.addFacet(RenderedAdjustedFacetForParameterLayoutAnnotation.create(parameterLayoutIfAny, facetHolder));
-        FacetUtil.addFacet(TypicalLengthFacetForParameterLayoutAnnotation.create(parameterLayoutIfAny, facetHolder));
+        super.addFacet(CssClassFacetForParameterLayoutAnnotation.create(parameterLayoutIfAny, facetHolder));
+        super.addFacet(DescribedAsFacetForParameterLayoutAnnotation.create(parameterLayoutIfAny, facetHolder));
+        super.addFacet(LabelAtFacetForParameterLayoutAnnotation.create(parameterLayoutIfAny, facetHolder));
+        super.addFacet(MultiLineFacetForParameterLayoutAnnotation.create(parameterLayoutIfAny, facetHolder));
+        super.addFacet(NamedFacetForParameterLayoutAnnotation.create(parameterLayoutIfAny, facetHolder));
+        super.addFacet(RenderedAdjustedFacetForParameterLayoutAnnotation.create(parameterLayoutIfAny, facetHolder));
+        super.addFacet(TypicalLengthFacetForParameterLayoutAnnotation.create(parameterLayoutIfAny, facetHolder));
 
     }
 
diff --git a/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/param/mandatory/dflt/MandatoryFacetOnParametersDefaultFactory.java b/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/param/mandatory/dflt/MandatoryFacetOnParametersDefaultFactory.java
index 5ec469a..f6a5ff2 100644
--- a/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/param/mandatory/dflt/MandatoryFacetOnParametersDefaultFactory.java
+++ b/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/param/mandatory/dflt/MandatoryFacetOnParametersDefaultFactory.java
@@ -20,7 +20,6 @@
 package org.apache.isis.metamodel.facets.param.mandatory.dflt;
 
 import org.apache.isis.metamodel.facetapi.FacetHolder;
-import org.apache.isis.metamodel.facetapi.FacetUtil;
 import org.apache.isis.metamodel.facetapi.FeatureType;
 import org.apache.isis.metamodel.facets.FacetFactory;
 import org.apache.isis.metamodel.facets.FacetFactoryAbstract;
@@ -47,7 +46,7 @@ public class MandatoryFacetOnParametersDefaultFactory extends FacetFactoryAbstra
 
     @Override
     public void processParams(final ProcessParameterContext processParameterContext) {
-        FacetUtil.addFacet(create(processParameterContext.getFacetHolder()));
+        super.addFacet(create(processParameterContext.getFacetHolder()));
     }
 
     private MandatoryFacet create(final FacetHolder holder) {
diff --git a/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/param/parameter/ParameterAnnotationFacetFactory.java b/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/param/parameter/ParameterAnnotationFacetFactory.java
index 2e4a63a..40d03dd 100644
--- a/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/param/parameter/ParameterAnnotationFacetFactory.java
+++ b/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/param/parameter/ParameterAnnotationFacetFactory.java
@@ -23,7 +23,7 @@ import javax.annotation.Nullable;
 import javax.validation.constraints.Pattern;
 
 import org.apache.isis.applib.annotation.Parameter;
-import org.apache.isis.metamodel.facetapi.FacetUtil;
+import org.apache.isis.metamodel.MetaModelContext;
 import org.apache.isis.metamodel.facetapi.FeatureType;
 import org.apache.isis.metamodel.facetapi.MetaModelRefiner;
 import org.apache.isis.metamodel.facets.FacetFactoryAbstract;
@@ -43,11 +43,18 @@ import lombok.val;
 public class ParameterAnnotationFacetFactory extends FacetFactoryAbstract
 implements MetaModelRefiner {
 
-    private final MetaModelValidatorForConflictingOptionality conflictingOptionalityValidator = new MetaModelValidatorForConflictingOptionality();
+    private final MetaModelValidatorForConflictingOptionality conflictingOptionalityValidator = 
+            new MetaModelValidatorForConflictingOptionality();
 
     public ParameterAnnotationFacetFactory() {
         super(FeatureType.PARAMETERS_ONLY);
     }
+    
+    @Override
+    public void setMetaModelContext(MetaModelContext metaModelContext) {
+        super.setMetaModelContext(metaModelContext);
+        conflictingOptionalityValidator.setMetaModelContext(metaModelContext);
+    }
 
     @Override
     public void processParams(final ProcessParameterContext processParameterContext) {
@@ -63,7 +70,7 @@ implements MetaModelRefiner {
         val holder = processParameterContext.getFacetHolder();
         val parameterIfAny = processParameterContext.synthesizeOnParameter(Parameter.class);
 
-        FacetUtil.addFacet(MaxLengthFacetForParameterAnnotation.create(parameterIfAny, holder));
+        super.addFacet(MaxLengthFacetForParameterAnnotation.create(parameterIfAny, holder));
     }
 
     void processParamsMustSatisfy(final ProcessParameterContext processParameterContext) {
@@ -71,7 +78,7 @@ implements MetaModelRefiner {
         val holder = processParameterContext.getFacetHolder();
         val parameterIfAny = processParameterContext.synthesizeOnParameter(Parameter.class);
 
-        FacetUtil.addFacet(
+        super.addFacet(
                 MustSatisfySpecificationFacetForParameterAnnotation.create(parameterIfAny, holder, getServiceInjector()));
     }
 
@@ -81,11 +88,11 @@ implements MetaModelRefiner {
         val parameterType = processParameterContext.getParameterType();
 
         val patternIfAny = processParameterContext.synthesizeOnParameter(Pattern.class);
-        FacetUtil.addFacet(
+        super.addFacet(
                 RegExFacetForPatternAnnotationOnParameter.create(patternIfAny, parameterType, holder));
 
         val parameterIfAny = processParameterContext.synthesizeOnParameter(Parameter.class);
-        FacetUtil.addFacet(
+        super.addFacet(
                 RegExFacetForParameterAnnotation.create(parameterIfAny, parameterType, holder));
     }
 
@@ -97,14 +104,14 @@ implements MetaModelRefiner {
         val nullableIfAny = processParameterContext.synthesizeOnParameter(Nullable.class);
         final MandatoryFacet facet =
                 MandatoryFacetInvertedByNullableAnnotationOnParameter.create(nullableIfAny, parameterType, holder);
-        FacetUtil.addFacet(facet);
+        super.addFacet(facet);
         conflictingOptionalityValidator.flagIfConflict(
                 facet, "Conflicting @Nullable with other optionality annotation");
 
         val parameterIfAny = processParameterContext.synthesizeOnParameter(Parameter.class);
         final MandatoryFacet mandatoryFacet =
                 MandatoryFacetForParameterAnnotation.create(parameterIfAny, parameterType, holder);
-        FacetUtil.addFacet(mandatoryFacet);
+        super.addFacet(mandatoryFacet);
         conflictingOptionalityValidator.flagIfConflict(
                 mandatoryFacet, "Conflicting @Parameter#optionality with other optionality annotation");
 
@@ -115,7 +122,7 @@ implements MetaModelRefiner {
         val holder = processParameterContext.getFacetHolder();
         val parameterIfAny = processParameterContext.synthesizeOnParameter(Parameter.class);
 
-        FacetUtil.addFacet(FileAcceptFacetForParameterAnnotation.create(parameterIfAny, holder));
+        super.addFacet(FileAcceptFacetForParameterAnnotation.create(parameterIfAny, holder));
     }
 
     @Override
diff --git a/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/param/validate/method/ActionParameterValidationFacetViaMethodFactory.java b/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/param/validate/method/ActionParameterValidationFacetViaMethodFactory.java
index 8115de7..0d75f62 100644
--- a/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/param/validate/method/ActionParameterValidationFacetViaMethodFactory.java
+++ b/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/param/validate/method/ActionParameterValidationFacetViaMethodFactory.java
@@ -24,7 +24,6 @@ import java.lang.reflect.Method;
 import org.apache.isis.applib.services.i18n.TranslationService;
 import org.apache.isis.metamodel.commons.StringExtensions;
 import org.apache.isis.metamodel.facetapi.Facet;
-import org.apache.isis.metamodel.facetapi.FacetUtil;
 import org.apache.isis.metamodel.facetapi.FeatureType;
 import org.apache.isis.metamodel.facetapi.IdentifiedHolder;
 import org.apache.isis.metamodel.facets.MethodFinderUtils;
@@ -77,7 +76,7 @@ public class ActionParameterValidationFacetViaMethodFactory extends MethodPrefix
         // sadness: same as in TranslationFactory
         final String translationContext = facetHolder.getIdentifier().toFullIdentityString();
         final Facet facet = new ActionParameterValidationFacetViaMethod(validateMethod, translationService, translationContext, facetHolder);
-        FacetUtil.addFacet(facet);
+        super.addFacet(facet);
     }
 
 
diff --git a/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/properties/accessor/PropertyAccessorFacetViaAccessor.java b/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/properties/accessor/PropertyAccessorFacetViaAccessor.java
index ef24089..42a57fb 100644
--- a/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/properties/accessor/PropertyAccessorFacetViaAccessor.java
+++ b/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/properties/accessor/PropertyAccessorFacetViaAccessor.java
@@ -24,8 +24,6 @@ import java.util.Collections;
 import java.util.List;
 import java.util.Map;
 
-import org.apache.isis.config.internal._Config;
-import org.apache.isis.metamodel.MetaModelContext;
 import org.apache.isis.metamodel.adapter.ObjectAdapter;
 import org.apache.isis.metamodel.consent.InteractionInitiatedBy;
 import org.apache.isis.metamodel.facetapi.FacetHolder;
@@ -74,7 +72,7 @@ implements ImperativeFacet {
             return null;
         }
 
-        boolean filterForVisibility = MetaModelContext.current().getConfiguration().getReflector().getFacet().isFilterVisibility();
+        boolean filterForVisibility = super.getMetaModelContext().getConfiguration().getReflector().getFacet().isFilterVisibility();
         if(filterForVisibility) {
             final ObjectAdapter referencedAdapter = getObjectAdapterProvider().adapterFor(referencedObject);
             final boolean visible = ObjectAdapter.Util
diff --git a/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/properties/bigdecimal/javaxvaldigits/BigDecimalFacetOnPropertyFromJavaxValidationDigitsAnnotationFactory.java b/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/properties/bigdecimal/javaxvaldigits/BigDecimalFacetOnPropertyFromJavaxValidationDigitsAnnotationFactory.java
index 326b609..ed79bb1 100644
--- a/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/properties/bigdecimal/javaxvaldigits/BigDecimalFacetOnPropertyFromJavaxValidationDigitsAnnotationFactory.java
+++ b/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/properties/bigdecimal/javaxvaldigits/BigDecimalFacetOnPropertyFromJavaxValidationDigitsAnnotationFactory.java
@@ -22,7 +22,6 @@ import java.math.BigDecimal;
 
 import javax.validation.constraints.Digits;
 
-import org.apache.isis.metamodel.facetapi.FacetUtil;
 import org.apache.isis.metamodel.facetapi.FeatureType;
 import org.apache.isis.metamodel.facets.FacetFactoryAbstract;
 import org.apache.isis.metamodel.facets.FacetedMethod;
@@ -47,7 +46,7 @@ public class BigDecimalFacetOnPropertyFromJavaxValidationDigitsAnnotationFactory
         if (digits == null) {
             return;
         }
-        FacetUtil.addFacet(create(processMethodContext, digits));
+        super.addFacet(create(processMethodContext, digits));
     }
 
     private BigDecimalValueFacet create(final ProcessMethodContext processMethodContext, final Digits annotation) {
diff --git a/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/properties/choices/enums/PropertyChoicesFacetDerivedFromChoicesFacetFactory.java b/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/properties/choices/enums/PropertyChoicesFacetDerivedFromChoicesFacetFactory.java
index b092a1a..b0e4a99 100644
--- a/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/properties/choices/enums/PropertyChoicesFacetDerivedFromChoicesFacetFactory.java
+++ b/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/properties/choices/enums/PropertyChoicesFacetDerivedFromChoicesFacetFactory.java
@@ -19,7 +19,6 @@
 
 package org.apache.isis.metamodel.facets.properties.choices.enums;
 
-import org.apache.isis.metamodel.facetapi.FacetUtil;
 import org.apache.isis.metamodel.facetapi.FeatureType;
 import org.apache.isis.metamodel.facets.FacetFactoryAbstract;
 import org.apache.isis.metamodel.facets.objectvalue.choices.ChoicesFacet;
@@ -40,7 +39,7 @@ public class PropertyChoicesFacetDerivedFromChoicesFacetFactory extends FacetFac
             return;
         }
 
-        FacetUtil.addFacet(new PropertyChoicesFacetDerivedFromChoicesFacet(processMethodContext.getFacetHolder()));
+        super.addFacet(new PropertyChoicesFacetDerivedFromChoicesFacet(processMethodContext.getFacetHolder()));
     }
 
 }
diff --git a/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/properties/disabled/fromimmutable/DisabledFacetOnPropertyDerivedFromImmutableFactory.java b/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/properties/disabled/fromimmutable/DisabledFacetOnPropertyDerivedFromImmutableFactory.java
index 6774bb7..7360bae 100644
--- a/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/properties/disabled/fromimmutable/DisabledFacetOnPropertyDerivedFromImmutableFactory.java
+++ b/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/properties/disabled/fromimmutable/DisabledFacetOnPropertyDerivedFromImmutableFactory.java
@@ -19,7 +19,6 @@
 
 package org.apache.isis.metamodel.facets.properties.disabled.fromimmutable;
 
-import org.apache.isis.metamodel.facetapi.FacetUtil;
 import org.apache.isis.metamodel.facetapi.FeatureType;
 import org.apache.isis.metamodel.facets.FacetFactoryAbstract;
 import org.apache.isis.metamodel.facets.FacetedMethod;
@@ -46,7 +45,7 @@ public class DisabledFacetOnPropertyDerivedFromImmutableFactory extends FacetFac
                 // @Property(editing=ENABLED)
                 return;
             }
-            FacetUtil.addFacet(new DisabledFacetOnPropertyDerivedFromImmutable(facetHolder));
+            super.addFacet(new DisabledFacetOnPropertyDerivedFromImmutable(facetHolder));
         }
     }
 
diff --git a/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/properties/property/PropertyAnnotationFacetFactory.java b/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/properties/property/PropertyAnnotationFacetFactory.java
index 18d86aa..afc3b0e 100644
--- a/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/properties/property/PropertyAnnotationFacetFactory.java
+++ b/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/properties/property/PropertyAnnotationFacetFactory.java
@@ -28,6 +28,7 @@ import org.apache.isis.applib.annotation.Property;
 import org.apache.isis.applib.annotation.SemanticsOf;
 import org.apache.isis.applib.events.domain.PropertyDomainEvent;
 import org.apache.isis.applib.services.HasUniqueId;
+import org.apache.isis.metamodel.MetaModelContext;
 import org.apache.isis.metamodel.facetapi.FacetUtil;
 import org.apache.isis.metamodel.facetapi.FeatureType;
 import org.apache.isis.metamodel.facetapi.MetaModelRefiner;
@@ -75,6 +76,12 @@ implements MetaModelRefiner {
     }
     
     @Override
+    public void setMetaModelContext(MetaModelContext metaModelContext) {
+        super.setMetaModelContext(metaModelContext);
+        conflictingOptionalityValidator.setMetaModelContext(metaModelContext);
+    }
+    
+    @Override
     public void process(final ProcessMethodContext processMethodContext) {
         
         val propertyIfAny = processMethodContext.synthesizeOnMethodOrMixinType(Property.class);
@@ -149,7 +156,7 @@ implements MetaModelRefiner {
                 PropertyDomainEvent.Default.class,
                 getConfiguration().getReflector().getFacet().getPropertyAnnotation().getDomainEvent().isPostForDefault()
                 )) {
-            FacetUtil.addFacet(propertyDomainEventFacet);
+            super.addFacet(propertyDomainEventFacet);
         }
 
 
@@ -172,7 +179,7 @@ implements MetaModelRefiner {
                 replacementFacet = new PropertySetterFacetForDomainEventFromDefault(
                         propertyDomainEventFacet.getEventType(), getterFacet, setterFacet, propertyDomainEventFacet, holder);
             }
-            FacetUtil.addFacet(replacementFacet);
+            super.addFacet(replacementFacet);
         }
 
         final PropertyClearFacet clearFacet = holder.getFacet(PropertyClearFacet.class);
@@ -189,7 +196,7 @@ implements MetaModelRefiner {
                 replacementFacet = new PropertyClearFacetForDomainEventFromDefault(
                         propertyDomainEventFacet.getEventType(), getterFacet, clearFacet, propertyDomainEventFacet, holder);
             }
-            FacetUtil.addFacet(replacementFacet);
+            super.addFacet(replacementFacet);
         }
     }
 
@@ -214,7 +221,7 @@ implements MetaModelRefiner {
         // search for @Property(hidden=...)
         val hiddenFacet = HiddenFacetForPropertyAnnotation.create(propertyIfAny, facetHolder);
 
-        FacetUtil.addFacet(hiddenFacet);
+        super.addFacet(hiddenFacet);
     }
 
     void processEditing(final ProcessMethodContext processMethodContext, Optional<Property> propertyIfAny) {
@@ -223,7 +230,7 @@ implements MetaModelRefiner {
         // search for @Property(editing=...)
         val disabledFacet = DisabledFacetForPropertyAnnotation.create(propertyIfAny, facetHolder);
 
-        FacetUtil.addFacet(disabledFacet);
+        super.addFacet(disabledFacet);
     }
 
     void processCommand(final ProcessMethodContext processMethodContext, Optional<Property> propertyIfAny) {
@@ -242,7 +249,7 @@ implements MetaModelRefiner {
         val commandFacet = CommandFacetForPropertyAnnotation
                 .create(propertyIfAny, getConfiguration(), facetHolder, getServiceInjector());
 
-        FacetUtil.addFacet(commandFacet);
+        super.addFacet(commandFacet);
     }
 
     void processProjecting(final ProcessMethodContext processMethodContext, Optional<Property> propertyIfAny) {
@@ -252,7 +259,7 @@ implements MetaModelRefiner {
         val projectingFacet = ProjectingFacetFromPropertyAnnotation
                 .create(propertyIfAny, facetHolder);
 
-        FacetUtil.addFacet(projectingFacet);
+        super.addFacet(projectingFacet);
 
     }
 
@@ -275,7 +282,7 @@ implements MetaModelRefiner {
         val facet = PublishedPropertyFacetForPropertyAnnotation
                 .create(propertyIfAny, getConfiguration(), holder);
 
-        FacetUtil.addFacet(facet);
+        super.addFacet(facet);
     }
 
 
@@ -287,7 +294,7 @@ implements MetaModelRefiner {
         // search for @Property(maxLength=...)
         val facet = MaxLengthFacetForPropertyAnnotation.create(propertyIfAny, holder);
 
-        FacetUtil.addFacet(facet);
+        super.addFacet(facet);
     }
 
     void processMustSatisfy(final ProcessMethodContext processMethodContext, Optional<Property> propertyIfAny) {
@@ -296,7 +303,7 @@ implements MetaModelRefiner {
         // search for @Property(mustSatisfy=...)
         val facet = MustSatisfySpecificationFacetForPropertyAnnotation.create(propertyIfAny, holder, getServiceInjector());
 
-        FacetUtil.addFacet(facet);
+        super.addFacet(facet);
     }
 
     void processNotPersisted(final ProcessMethodContext processMethodContext, Optional<Property> propertyIfAny) {
@@ -305,7 +312,7 @@ implements MetaModelRefiner {
         // search for @Property(notPersisted=...)
         val facet = NotPersistedFacetForPropertyAnnotation.create(propertyIfAny, holder);
 
-        FacetUtil.addFacet(facet);
+        super.addFacet(facet);
     }
 
     void processOptional(final ProcessMethodContext processMethodContext, Optional<Property> propertyIfAny) {
@@ -318,13 +325,13 @@ implements MetaModelRefiner {
         val nullableIfAny = processMethodContext.synthesizeOnMethod(Nullable.class);
         val facet2 =
                 MandatoryFacetInvertedByNullableAnnotationOnProperty.create(nullableIfAny, method, holder);
-        FacetUtil.addFacet(facet2);
+        super.addFacet(facet2);
         conflictingOptionalityValidator.flagIfConflict(
                 facet2, "Conflicting @Nullable with other optionality annotation");
 
         // search for @Property(optional=...)
         val facet3 = MandatoryFacetForPropertyAnnotation.create(propertyIfAny, method, holder);
-        FacetUtil.addFacet(facet3);
+        super.addFacet(facet3);
         conflictingOptionalityValidator.flagIfConflict(
                 facet3, "Conflicting Property#optionality with other optionality annotation");
     }
@@ -338,13 +345,13 @@ implements MetaModelRefiner {
         val facet = RegExFacetForPatternAnnotationOnProperty.create(patternIfAny, returnType, holder);
 
         if (facet != null) {
-            FacetUtil.addFacet(facet);
+            super.addFacet(facet);
             return;
         }
         
         // else search for @Property(pattern=...)
         val facet2 = RegExFacetForPropertyAnnotation.create(propertyIfAny, returnType, holder);
-        FacetUtil.addFacet(facet2);
+        super.addFacet(facet2);
         
         
     }
@@ -356,7 +363,7 @@ implements MetaModelRefiner {
         // else search for @Property(maxLength=...)
         val facet = FileAcceptFacetForPropertyAnnotation.create(propertyIfAny, holder);
 
-        FacetUtil.addFacet(facet);
+        super.addFacet(facet);
     }
 
     // //////////////////////////////////////
diff --git a/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/properties/propertylayout/PropertyLayoutFacetFactory.java b/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/properties/propertylayout/PropertyLayoutFacetFactory.java
index 95c5e22..9a94041 100644
--- a/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/properties/propertylayout/PropertyLayoutFacetFactory.java
+++ b/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/properties/propertylayout/PropertyLayoutFacetFactory.java
@@ -23,7 +23,6 @@ import java.util.Optional;
 
 import org.apache.isis.applib.annotation.PropertyLayout;
 import org.apache.isis.metamodel.facetapi.FacetHolder;
-import org.apache.isis.metamodel.facetapi.FacetUtil;
 import org.apache.isis.metamodel.facetapi.FeatureType;
 import org.apache.isis.metamodel.facets.ContributeeMemberFacetFactory;
 import org.apache.isis.metamodel.facets.FacetFactoryAbstract;
@@ -66,7 +65,7 @@ public class PropertyLayoutFacetFactory extends FacetFactoryAbstract implements
     void processCssClass(final FacetHolder holder, final Optional<PropertyLayout> propertyLayout) {
         val cssClassFacet = CssClassFacetForPropertyLayoutAnnotation
                 .create(propertyLayout, holder);
-        FacetUtil.addFacet(cssClassFacet);
+        super.addFacet(cssClassFacet);
     }
 
     void processDescribedAs(
@@ -74,7 +73,7 @@ public class PropertyLayoutFacetFactory extends FacetFactoryAbstract implements
             final Optional<PropertyLayout> propertyLayout) {
         
         val describedAsFacet = DescribedAsFacetForPropertyLayoutAnnotation.create(propertyLayout, holder);
-        FacetUtil.addFacet(describedAsFacet);
+        super.addFacet(describedAsFacet);
 
     }
 
@@ -90,29 +89,29 @@ public class PropertyLayoutFacetFactory extends FacetFactoryAbstract implements
         val promptStyleFacet = PromptStyleFacetForPropertyLayoutAnnotation
                 .create(propertyLayout, getConfiguration(), holder);
 
-        FacetUtil.addFacet(promptStyleFacet);
+        super.addFacet(promptStyleFacet);
     }
 
     void processHidden(final FacetHolder holder, final Optional<PropertyLayout> propertyLayout) {
         val hiddenFacet = HiddenFacetForPropertyLayoutAnnotation.create(propertyLayout, holder);
-        FacetUtil.addFacet(hiddenFacet);
+        super.addFacet(hiddenFacet);
     }
 
     void processLabelAt(
             final FacetHolder holder,
             final Optional<PropertyLayout> propertyLayout) {
         val labelAtFacet = LabelAtFacetForPropertyLayoutAnnotation.create(propertyLayout, holder);
-        FacetUtil.addFacet(labelAtFacet);
+        super.addFacet(labelAtFacet);
     }
 
     void processMultiLine(final FacetHolder holder, final Optional<PropertyLayout> propertyLayout) {
         val multiLineFacet = MultiLineFacetForPropertyLayoutAnnotation.create(propertyLayout, holder);
-        FacetUtil.addFacet(multiLineFacet);
+        super.addFacet(multiLineFacet);
     }
 
     void processNamed(final FacetHolder holder, final Optional<PropertyLayout> propertyLayout) {
         val namedFacet = NamedFacetForPropertyLayoutAnnotation.create(propertyLayout, holder);
-        FacetUtil.addFacet(namedFacet);
+        super.addFacet(namedFacet);
     }
 
     void processRenderedAdjusted(
@@ -120,7 +119,7 @@ public class PropertyLayoutFacetFactory extends FacetFactoryAbstract implements
             final Optional<PropertyLayout> propertyLayout) {
         val renderedAdjustedFacet = RenderedAdjustedFacetForPropertyLayoutAnnotation
                 .create(propertyLayout, holder);
-        FacetUtil.addFacet(renderedAdjustedFacet);
+        super.addFacet(renderedAdjustedFacet);
     }
 
     void processTypicalLength(
@@ -128,14 +127,14 @@ public class PropertyLayoutFacetFactory extends FacetFactoryAbstract implements
             final Optional<PropertyLayout> propertyLayout) {
         val typicalLengthFacet = TypicalLengthFacetForPropertyLayoutAnnotation
                 .create(propertyLayout, holder);
-        FacetUtil.addFacet(typicalLengthFacet);
+        super.addFacet(typicalLengthFacet);
     }
 
     void processUnchanging(
             final FacetHolder holder,
             final Optional<PropertyLayout> propertyLayout) {
         val unchangingFacet = UnchangingFacetForPropertyLayoutAnnotation.create(propertyLayout, holder);
-        FacetUtil.addFacet(unchangingFacet);
+        super.addFacet(unchangingFacet);
     }
 
     @Override
@@ -143,42 +142,42 @@ public class PropertyLayoutFacetFactory extends FacetFactoryAbstract implements
 
         // cssClass
         CssClassFacet cssClassFacet = null;
-        FacetUtil.addFacet(cssClassFacet);
+        super.addFacet(cssClassFacet);
 
 
         // describedAs
         DescribedAsFacet describedAsFacet = null;
-        FacetUtil.addFacet(describedAsFacet);
+        super.addFacet(describedAsFacet);
 
 
         // hidden
         HiddenFacet hiddenFacet = null;
-        FacetUtil.addFacet(hiddenFacet);
+        super.addFacet(hiddenFacet);
 
 
         // labelAt
         LabelAtFacet labelAtFacet = null;
-        FacetUtil.addFacet(labelAtFacet);
+        super.addFacet(labelAtFacet);
 
 
         // multiLine
         MultiLineFacet multiLineFacet = null;
-        FacetUtil.addFacet(multiLineFacet);
+        super.addFacet(multiLineFacet);
 
 
         // named
         NamedFacet namedFacet = null;
-        FacetUtil.addFacet(namedFacet);
+        super.addFacet(namedFacet);
 
 
         // renderedAsDayBefore
         RenderedAdjustedFacet renderedAdjustedFacet = null;
-        FacetUtil.addFacet(renderedAdjustedFacet);
+        super.addFacet(renderedAdjustedFacet);
 
 
         // typicalLength
         TypicalLengthFacet typicalLengthFacet = null;
-        FacetUtil.addFacet(typicalLengthFacet);
+        super.addFacet(typicalLengthFacet);
 
     }
 
diff --git a/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/properties/validating/dflt/PropertyValidateFacetDefaultFactory.java b/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/properties/validating/dflt/PropertyValidateFacetDefaultFactory.java
index 4889583..e650f82 100644
--- a/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/properties/validating/dflt/PropertyValidateFacetDefaultFactory.java
+++ b/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/properties/validating/dflt/PropertyValidateFacetDefaultFactory.java
@@ -20,7 +20,6 @@
 package org.apache.isis.metamodel.facets.properties.validating.dflt;
 
 import org.apache.isis.metamodel.facetapi.FacetHolder;
-import org.apache.isis.metamodel.facetapi.FacetUtil;
 import org.apache.isis.metamodel.facetapi.FeatureType;
 import org.apache.isis.metamodel.facets.FacetFactory;
 import org.apache.isis.metamodel.facets.FacetFactoryAbstract;
@@ -44,12 +43,12 @@ public class PropertyValidateFacetDefaultFactory extends FacetFactoryAbstract {
 
     @Override
     public void process(final ProcessMethodContext processMethodContext) {
-        FacetUtil.addFacet(create(processMethodContext.getFacetHolder()));
+        super.addFacet(create(processMethodContext.getFacetHolder()));
     }
 
     @Override
     public void processParams(final ProcessParameterContext processParameterContext) {
-        FacetUtil.addFacet(create(processParameterContext.getFacetHolder()));
+        super.addFacet(create(processParameterContext.getFacetHolder()));
     }
 
     private PropertyValidateFacet create(final FacetHolder holder) {
diff --git a/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/properties/validating/method/PropertyValidateFacetViaMethodFactory.java b/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/properties/validating/method/PropertyValidateFacetViaMethodFactory.java
index 47938ec..dea22a0 100644
--- a/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/properties/validating/method/PropertyValidateFacetViaMethodFactory.java
+++ b/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/properties/validating/method/PropertyValidateFacetViaMethodFactory.java
@@ -23,7 +23,6 @@ import java.lang.reflect.Method;
 
 import org.apache.isis.applib.services.i18n.TranslationService;
 import org.apache.isis.metamodel.commons.StringExtensions;
-import org.apache.isis.metamodel.facetapi.FacetUtil;
 import org.apache.isis.metamodel.facetapi.FeatureType;
 import org.apache.isis.metamodel.facets.FacetedMethod;
 import org.apache.isis.metamodel.facets.MethodFinderUtils;
@@ -70,7 +69,7 @@ public class PropertyValidateFacetViaMethodFactory extends MethodPrefixBasedFace
         // sadness: same as in TranslationFactory
         final String translationContext = facetHolder.getIdentifier().toClassAndNameIdentityString();
         final PropertyValidateFacetViaMethod facet = new PropertyValidateFacetViaMethod(method, translationService, translationContext, facetHolder);
-        FacetUtil.addFacet(facet);
+        super.addFacet(facet);
     }
 
 
diff --git a/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/value/timejodalocal/JodaLocalTimeValueFacetSimpleFactory.java b/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/value/timejodalocal/JodaLocalTimeValueFacetSimpleFactory.java
index d8135ae..9db4c3f 100644
--- a/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/value/timejodalocal/JodaLocalTimeValueFacetSimpleFactory.java
+++ b/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/value/timejodalocal/JodaLocalTimeValueFacetSimpleFactory.java
@@ -23,7 +23,6 @@ import org.joda.time.LocalDate;
 import org.joda.time.LocalTime;
 
 import org.apache.isis.metamodel.facetapi.FacetHolder;
-import org.apache.isis.metamodel.facetapi.FacetUtil;
 import org.apache.isis.metamodel.facets.object.value.ValueFacetSimple;
 import org.apache.isis.metamodel.facets.object.value.vsp.ValueFacetUsingSemanticsProviderFactory;
 
@@ -41,7 +40,7 @@ public class JodaLocalTimeValueFacetSimpleFactory extends ValueFacetUsingSemanti
         if (type != LocalTime.class) {
             return;
         }
-        FacetUtil.addFacet(new ValueFacetSimple(holder));
+        super.addFacet(new ValueFacetSimple(holder));
     }
 
 }
diff --git a/core/metamodel/src/main/java/org/apache/isis/metamodel/interactions/InteractionUtils.java b/core/metamodel/src/main/java/org/apache/isis/metamodel/interactions/InteractionUtils.java
index 15d60cb..161040a 100644
--- a/core/metamodel/src/main/java/org/apache/isis/metamodel/interactions/InteractionUtils.java
+++ b/core/metamodel/src/main/java/org/apache/isis/metamodel/interactions/InteractionUtils.java
@@ -28,6 +28,8 @@ import org.apache.isis.metamodel.facetapi.DecoratingFacet;
 import org.apache.isis.metamodel.facetapi.Facet;
 import org.apache.isis.metamodel.facetapi.FacetHolder;
 
+import lombok.val;
+
 public final class InteractionUtils {
 
     private InteractionUtils() {
@@ -59,7 +61,7 @@ public final class InteractionUtils {
         final InteractionResult result = new InteractionResult(context.createInteractionEvent());
         final Stream<Facet> facets = facetHolder.streamFacets().filter(isA(ValidatingInteractionAdvisor.class));
         facets.forEach(facet->{
-            final ValidatingInteractionAdvisor advisor = (ValidatingInteractionAdvisor) facet;
+            val advisor = (ValidatingInteractionAdvisor) facet;
             result.advise(advisor.invalidates(context), advisor);
         });
         return result;
diff --git a/core/metamodel/src/main/java/org/apache/isis/metamodel/postprocessors/param/DeriveFacetsPostProcessor.java b/core/metamodel/src/main/java/org/apache/isis/metamodel/postprocessors/param/DeriveFacetsPostProcessor.java
index 35d319c..6c123b1 100644
--- a/core/metamodel/src/main/java/org/apache/isis/metamodel/postprocessors/param/DeriveFacetsPostProcessor.java
+++ b/core/metamodel/src/main/java/org/apache/isis/metamodel/postprocessors/param/DeriveFacetsPostProcessor.java
@@ -30,7 +30,8 @@ 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.commons.internal.collections._Lists;
-import org.apache.isis.commons.internal.environment.IsisSystemEnvironment;
+import org.apache.isis.metamodel.MetaModelContext;
+import org.apache.isis.metamodel.MetaModelContextAware;
 import org.apache.isis.metamodel.facetapi.Facet;
 import org.apache.isis.metamodel.facetapi.FacetUtil;
 import org.apache.isis.metamodel.facets.Annotations;
@@ -108,12 +109,17 @@ import org.apache.isis.metamodel.specloader.specimpl.ObjectMemberAbstract;
 import org.apache.isis.metamodel.specloader.specimpl.OneToManyAssociationMixedIn;
 import org.apache.isis.metamodel.specloader.specimpl.OneToOneAssociationMixedIn;
 
+import lombok.Setter;
 import lombok.val;
 
 /**
  * Sets up all the {@link Facet}s for an action in a single shot.
  */
-public class DeriveFacetsPostProcessor implements ObjectSpecificationPostProcessor {
+public class DeriveFacetsPostProcessor 
+implements ObjectSpecificationPostProcessor, MetaModelContextAware {
+    
+    @Setter(onMethod = @__(@Override))
+    private MetaModelContext metaModelContext;
 
     @Override
     public void postProcess(final ObjectSpecification objectSpecification) {
@@ -226,18 +232,18 @@ public class DeriveFacetsPostProcessor implements ObjectSpecificationPostProcess
         if (projectionFacet == null) {
             return;
         }
-        FacetUtil.addFacet(projectionFacet);
+        this.addFacet(projectionFacet);
         val titleFacet = objectSpecification.getFacet(TitleFacet.class);
         if(canOverwrite(titleFacet)) {
-            FacetUtil.addFacet(new TitleFacetDerivedFromProjectionFacet(projectionFacet, objectSpecification));
+            this.addFacet(new TitleFacetDerivedFromProjectionFacet(projectionFacet, objectSpecification));
         }
         val iconFacet = objectSpecification.getFacet(IconFacet.class);
         if(canOverwrite(iconFacet)) {
-            FacetUtil.addFacet(new IconFacetDerivedFromProjectionFacet(projectionFacet, objectSpecification));
+            this.addFacet(new IconFacetDerivedFromProjectionFacet(projectionFacet, objectSpecification));
         }
         val cssClassFacet = objectSpecification.getFacet(CssClassFacet.class);
         if(canOverwrite(cssClassFacet)) {
-            FacetUtil.addFacet(new IconFacetDerivedFromProjectionFacet(projectionFacet, objectSpecification));
+            this.addFacet(new IconFacetDerivedFromProjectionFacet(projectionFacet, objectSpecification));
         }
     }
 
@@ -288,7 +294,7 @@ public class DeriveFacetsPostProcessor implements ObjectSpecificationPostProcess
                     final CollectionDomainEventFacetForCollectionAnnotation collectionDomainEventFacet = 
                             new CollectionDomainEventFacetForCollectionAnnotation(
                                     collectionDomainEventType, collection);
-                    FacetUtil.addFacet(collectionDomainEventFacet);
+                    this.addFacet(collectionDomainEventFacet);
                 }
 
                 final CollectionDomainEventDefaultFacetForDomainObjectAnnotation collectionDomainEventDefaultFacet =
@@ -328,7 +334,7 @@ public class DeriveFacetsPostProcessor implements ObjectSpecificationPostProcess
                     final PropertyDomainEventFacetForPropertyAnnotation propertyDomainEventFacet =
                             new PropertyDomainEventFacetForPropertyAnnotation(
                                     propertyDomainEventType, getterFacetIfAny, property);
-                    FacetUtil.addFacet(propertyDomainEventFacet);
+                    this.addFacet(propertyDomainEventFacet);
                 }
             }
             final PropertyDomainEventDefaultFacetForDomainObjectAnnotation propertyDomainEventDefaultFacet =
@@ -373,7 +379,7 @@ public class DeriveFacetsPostProcessor implements ObjectSpecificationPostProcess
         final ObjectSpecification returnSpec = objectAction.getReturnType();
         final DescribedAsFacet specFacet = returnSpec.getFacet(DescribedAsFacet.class);
         if(existsAndIsDoOp(specFacet)) {
-            FacetUtil.addFacet(new DescribedAsFacetOnMemberDerivedFromType(specFacet, facetedMethodFor(objectAction)));
+            this.addFacet(new DescribedAsFacetOnMemberDerivedFromType(specFacet, facetedMethodFor(objectAction)));
         }
     }
 
@@ -398,7 +404,7 @@ public class DeriveFacetsPostProcessor implements ObjectSpecificationPostProcess
             hasAtLeastOneDefault = hasAtLeastOneDefault | (parameterTypeDefaultedFacets[i] != null);
         }
         if (hasAtLeastOneDefault) {
-            FacetUtil.addFacet(
+            this.addFacet(
                     new ActionParameterDefaultFacetDerivedFromTypeFacets(parameterTypeDefaultedFacets, peerFor(parameter)));
         }
     }
@@ -413,7 +419,7 @@ public class DeriveFacetsPostProcessor implements ObjectSpecificationPostProcess
         final ObjectSpecification paramSpec = parameter.getSpecification();
         final ChoicesFacet specFacet = paramSpec.getFacet(ChoicesFacet.class);
         if(existsAndIsDoOp(specFacet)) {
-            FacetUtil.addFacet(
+            this.addFacet(
                     new ActionParameterChoicesFacetDerivedFromChoicesFacet(
                             peerFor(parameter)));
         }
@@ -432,7 +438,7 @@ public class DeriveFacetsPostProcessor implements ObjectSpecificationPostProcess
         //TODO: this ought to check if a do-op; if you come across this, you can probably change it (just taking smaller steps for now)
         //if(existsAndIsDoOp(specFacet)) {
         if(specFacet != null) {
-            FacetUtil.addFacet(new DescribedAsFacetOnParameterDerivedFromType(specFacet, peerFor(parameter)));
+            this.addFacet(new DescribedAsFacetOnParameterDerivedFromType(specFacet, peerFor(parameter)));
         }
     }
 
@@ -446,7 +452,7 @@ public class DeriveFacetsPostProcessor implements ObjectSpecificationPostProcess
         final ObjectSpecification paramSpec = parameter.getSpecification();
         final TypicalLengthFacet specFacet = paramSpec.getFacet(TypicalLengthFacet.class);
         if(existsAndIsDoOp(specFacet)) {
-            FacetUtil.addFacet(new TypicalLengthFacetOnParameterDerivedFromType(specFacet, peerFor(parameter)));
+            this.addFacet(new TypicalLengthFacetOnParameterDerivedFromType(specFacet, peerFor(parameter)));
         }
     }
 
@@ -460,7 +466,7 @@ public class DeriveFacetsPostProcessor implements ObjectSpecificationPostProcess
         final ObjectSpecification propertySpec = property.getSpecification();
         final ChoicesFacet specFacet = propertySpec.getFacet(ChoicesFacet.class);
         if(existsAndIsDoOp(specFacet)) {
-            FacetUtil.addFacet(
+            this.addFacet(
                     new PropertyChoicesFacetDerivedFromChoicesFacet(facetedMethodFor(property)));
         }
     }
@@ -475,7 +481,7 @@ public class DeriveFacetsPostProcessor implements ObjectSpecificationPostProcess
         final ObjectSpecification propertySpec = property.getSpecification();
         final DefaultedFacet specFacet = propertySpec.getFacet(DefaultedFacet.class);
         if(existsAndIsDoOp(specFacet)) {
-            FacetUtil.addFacet(
+            this.addFacet(
                     new PropertyDefaultFacetDerivedFromDefaultedFacet(
                             specFacet, facetedMethodFor(property)));
         }
@@ -491,7 +497,7 @@ public class DeriveFacetsPostProcessor implements ObjectSpecificationPostProcess
         final ObjectSpecification propertySpec = property.getSpecification();
         final TypicalLengthFacet specFacet = propertySpec.getFacet(TypicalLengthFacet.class);
         if(existsAndIsDoOp(specFacet)) {
-            FacetUtil.addFacet(
+            this.addFacet(
                     new TypicalLengthFacetOnPropertyDerivedFromType(specFacet, facetedMethodFor(property)));
         }
     }
@@ -506,7 +512,7 @@ public class DeriveFacetsPostProcessor implements ObjectSpecificationPostProcess
         final ObjectSpecification returnSpec = objectAssociation.getSpecification();
         final DescribedAsFacet specFacet = returnSpec.getFacet(DescribedAsFacet.class);
         if(existsAndIsDoOp(specFacet)) {
-            FacetUtil.addFacet(
+            this.addFacet(
                     new DescribedAsFacetOnMemberDerivedFromType(specFacet, facetedMethodFor(objectAssociation)));
         }
     }
@@ -524,7 +530,7 @@ public class DeriveFacetsPostProcessor implements ObjectSpecificationPostProcess
         final ViewModelFacet specFacet = propertySpec.getFacet(ViewModelFacet.class);
         if(existsAndIsDoOp(specFacet)) {
             final DisabledFacetAbstract.Semantics semantics = inferSemanticsFrom(specFacet);
-            FacetUtil.addFacet(new DisabledFacetOnPropertyDerivedFromRecreatableObject(facetedMethodFor(property), semantics));
+            this.addFacet(new DisabledFacetOnPropertyDerivedFromRecreatableObject(facetedMethodFor(property), semantics));
         }
     }
 
@@ -539,7 +545,7 @@ public class DeriveFacetsPostProcessor implements ObjectSpecificationPostProcess
         final ObjectSpecification onType = property.getOnType();
         final ImmutableFacet specFacet = onType.getFacet(ImmutableFacet.class);
         if(existsAndIsDoOp(specFacet)) {
-            FacetUtil.addFacet(
+            this.addFacet(
                     new DisabledFacetOnPropertyDerivedFromImmutable(facetedMethodFor(property)));
         }
     }
@@ -557,7 +563,7 @@ public class DeriveFacetsPostProcessor implements ObjectSpecificationPostProcess
         final ViewModelFacet specFacet = collectionSpec.getFacet(ViewModelFacet.class);
         if(existsAndIsDoOp(specFacet)) {
             final DisabledFacetAbstract.Semantics semantics = inferSemanticsFrom(specFacet);
-            FacetUtil.addFacet(new DisabledFacetOnCollectionDerivedFromRecreatableObject(facetedMethodFor(collection), semantics));
+            this.addFacet(new DisabledFacetOnCollectionDerivedFromRecreatableObject(facetedMethodFor(collection), semantics));
         }
 
     }
@@ -572,7 +578,7 @@ public class DeriveFacetsPostProcessor implements ObjectSpecificationPostProcess
         final ObjectSpecification onType = collection.getOnType();
         final ImmutableFacet specFacet = onType.getFacet(ImmutableFacet.class);
         if(existsAndIsDoOp(specFacet)) {
-            FacetUtil.addFacet(
+            this.addFacet(
                     new DisabledFacetOnCollectionDerivedFromImmutable(specFacet, facetedMethodFor(collection)));
         }
     }
@@ -583,7 +589,7 @@ public class DeriveFacetsPostProcessor implements ObjectSpecificationPostProcess
         if(collectionParam.containsDoOpFacet(ActionParameterDefaultsFacet.class)) {
             return;
         }
-        FacetUtil.addFacet(new ActionParameterDefaultsFacetFromAssociatedCollection(collectionParam));
+        this.addFacet(new ActionParameterDefaultsFacetFromAssociatedCollection(collectionParam));
     }
 
     private void addCollectionParamChoicesFacetIfNoneAlready(
@@ -594,7 +600,7 @@ public class DeriveFacetsPostProcessor implements ObjectSpecificationPostProcess
             return;
         }
 
-        FacetUtil.addFacet(
+        this.addFacet(
                 new ActionParameterChoicesFacetFromParentedCollection(
                         scalarOrCollectionParam, otma));
     }
@@ -606,10 +612,14 @@ public class DeriveFacetsPostProcessor implements ObjectSpecificationPostProcess
     private List<ActionType> inferActionTypes() {
         final List<ActionType> actionTypes = _Lists.newArrayList();
         actionTypes.add(ActionType.USER);
-        if (IsisSystemEnvironment.get().isPrototyping()) {
+        if (metaModelContext.getSystemEnvironment().isPrototyping()) {
             actionTypes.add(ActionType.PROTOTYPE);
         }
         return actionTypes;
     }
+    
+    private void addFacet(Facet facet) {
+        FacetUtil.addFacet(facet);
+    }
 
 }
diff --git a/core/metamodel/src/main/java/org/apache/isis/metamodel/progmodel/ProgrammingModelAbstract.java b/core/metamodel/src/main/java/org/apache/isis/metamodel/progmodel/ProgrammingModelAbstract.java
index 2f9bd80..238b873 100644
--- a/core/metamodel/src/main/java/org/apache/isis/metamodel/progmodel/ProgrammingModelAbstract.java
+++ b/core/metamodel/src/main/java/org/apache/isis/metamodel/progmodel/ProgrammingModelAbstract.java
@@ -22,15 +22,21 @@ package org.apache.isis.metamodel.progmodel;
 import java.util.Collections;
 import java.util.LinkedHashSet;
 import java.util.List;
+import java.util.function.Supplier;
 import java.util.stream.Stream;
 
 import org.apache.isis.commons.internal.collections._Lists;
 import org.apache.isis.commons.internal.collections._Multimaps;
 import org.apache.isis.commons.internal.collections._Multimaps.SetMultimap;
 import org.apache.isis.commons.internal.exceptions._Exceptions;
+import org.apache.isis.metamodel.MetaModelContext;
+import org.apache.isis.metamodel.MetaModelContextAware;
 import org.apache.isis.metamodel.facetapi.MetaModelRefiner;
 import org.apache.isis.metamodel.facets.FacetFactory;
+import org.apache.isis.metamodel.progmodel.ProgrammingModel.Marker;
+import org.apache.isis.metamodel.progmodel.ProgrammingModel.ValidationOrder;
 import org.apache.isis.metamodel.specloader.validator.MetaModelValidator;
+import org.apache.isis.metamodel.specloader.validator.MetaModelValidatorVisiting;
 
 import lombok.EqualsAndHashCode;
 import lombok.Value;
@@ -45,13 +51,15 @@ public abstract class ProgrammingModelAbstract implements ProgrammingModel {
     /**
      * Finalizes the factory collection, can not be modified afterwards.
      * @param filter - the final programming model will only contain factories accepted by this filter
+     * @param metaModelContext 
      */
-    public void init(ProgrammingModelInitFilter filter) {
+    public void init(ProgrammingModelInitFilter filter, MetaModelContext metaModelContext) {
         
         assertNotInitialized();
         
         // for all registered facet-factories that also implement MetaModelRefiner
-        for (val facetFactory : snapshotFactories(filter)) {
+        for (val facetFactory : snapshotFactories(filter, metaModelContext)) {
+            
             if(facetFactory instanceof MetaModelRefiner) {
                 val metaModelValidatorRefiner = (MetaModelRefiner) facetFactory;
                 metaModelValidatorRefiner.refineProgrammingModel(this);
@@ -59,11 +67,11 @@ public abstract class ProgrammingModelAbstract implements ProgrammingModel {
         }
 
         this.unmodifiableFactories = 
-                Collections.unmodifiableList(snapshotFactories(filter));
+                Collections.unmodifiableList(snapshotFactories(filter, metaModelContext));
         this.unmodifiableValidators = 
-                Collections.unmodifiableList(snapshotValidators(filter));
+                Collections.unmodifiableList(snapshotValidators(filter, metaModelContext));
         this.unmodifiablePostProcessors = 
-                Collections.unmodifiableList(snapshotPostProcessors(filter));
+                Collections.unmodifiableList(snapshotPostProcessors(filter, metaModelContext));
         
     }
     
@@ -90,7 +98,6 @@ public abstract class ProgrammingModelAbstract implements ProgrammingModel {
         val validatorEntry = ProgrammingModelEntry.of(instance, markers);
         validatorEntriesByOrder.putElement(order, validatorEntry);
     }
-    
 
     @Override
     public <T extends ObjectSpecificationPostProcessor> void addPostProcessor(
@@ -136,7 +143,10 @@ public abstract class ProgrammingModelAbstract implements ProgrammingModel {
     private final SetMultimap<FacetProcessingOrder, ProgrammingModelEntry<? extends FacetFactory>> 
         factoryEntriesByOrder = _Multimaps.newSetMultimap(LinkedHashSet::new);
     
-    private List<FacetFactory> snapshotFactories(ProgrammingModelInitFilter filter) {
+    private List<FacetFactory> snapshotFactories(
+            ProgrammingModelInitFilter filter, 
+            MetaModelContext metaModelContext) {
+        
         val factories = _Lists.<FacetFactory>newArrayList();
         for(val order : FacetProcessingOrder.values()) {
             val factoryEntrySet = factoryEntriesByOrder.get(order);
@@ -145,7 +155,8 @@ public abstract class ProgrammingModelAbstract implements ProgrammingModel {
             }
             for(val factoryEntry : factoryEntrySet) {
                 if(filter.acceptFactoryType(factoryEntry.getInstance().getClass(), factoryEntry.getMarkers())) {
-                    factories.add(factoryEntry.getInstance());
+                    factories.add(honorMetaModelContextAwareness(
+                            factoryEntry.getInstance(), metaModelContext));
                 }
             }
         }
@@ -155,7 +166,10 @@ public abstract class ProgrammingModelAbstract implements ProgrammingModel {
     private final SetMultimap<ValidationOrder, ProgrammingModelEntry<? extends MetaModelValidator>> 
         validatorEntriesByOrder = _Multimaps.newSetMultimap(LinkedHashSet::new);
     
-    private List<MetaModelValidator> snapshotValidators(ProgrammingModelInitFilter filter) {
+    private List<MetaModelValidator> snapshotValidators(
+            ProgrammingModelInitFilter filter, 
+            MetaModelContext metaModelContext) {
+        
         val validators = _Lists.<MetaModelValidator>newArrayList();
         for(val order : ValidationOrder.values()) {
             val validatorEntrySet = validatorEntriesByOrder.get(order);
@@ -164,7 +178,10 @@ public abstract class ProgrammingModelAbstract implements ProgrammingModel {
             }
             for(val validatorEntry : validatorEntrySet) {
                 if(filter.acceptValidator(validatorEntry.getInstance().getClass(), validatorEntry.getMarkers())) {
-                    validators.add(validatorEntry.getInstance());
+
+                    validators.add(honorMetaModelContextAwareness(
+                            validatorEntry.getInstance(), metaModelContext));
+                    
                 }
             }
         }
@@ -174,7 +191,10 @@ public abstract class ProgrammingModelAbstract implements ProgrammingModel {
     private final SetMultimap<PostProcessingOrder, ProgrammingModelEntry<? extends ObjectSpecificationPostProcessor>> 
         postProcessorEntriesByOrder = _Multimaps.newSetMultimap(LinkedHashSet::new);
     
-    private List<ObjectSpecificationPostProcessor> snapshotPostProcessors(ProgrammingModelInitFilter filter) {
+    private List<ObjectSpecificationPostProcessor> snapshotPostProcessors(
+            ProgrammingModelInitFilter filter, 
+            MetaModelContext metaModelContext) {
+        
         val postProcessors = _Lists.<ObjectSpecificationPostProcessor>newArrayList();
         for(val order : PostProcessingOrder.values()) {
             val postProcessorEntrySet = postProcessorEntriesByOrder.get(order);
@@ -183,7 +203,9 @@ public abstract class ProgrammingModelAbstract implements ProgrammingModel {
             }
             for(val postProcessorEntry : postProcessorEntrySet) {
                 if(filter.acceptPostProcessor(postProcessorEntry.getInstance().getClass(), postProcessorEntry.getMarkers())) {
-                    postProcessors.add(postProcessorEntry.getInstance());
+                    
+                    postProcessors.add(honorMetaModelContextAwareness(
+                            postProcessorEntry.getInstance(), metaModelContext));
                 }
             }
         }
@@ -210,5 +232,17 @@ public abstract class ProgrammingModelAbstract implements ProgrammingModel {
         }
     }
     
+    // -- METAMODEL CONTEXT AWARE
+    
+    private static <T> T honorMetaModelContextAwareness(T pojo, MetaModelContext metaModelContext) {
+        if(pojo instanceof MetaModelContextAware) {
+            val contextAware = (MetaModelContextAware) pojo;
+            contextAware.setMetaModelContext(metaModelContext);
+        }
+        return pojo;
+    }
+    
+    
+
 
 }
diff --git a/core/metamodel/src/main/java/org/apache/isis/metamodel/services/grid/GridSystemServiceAbstract.java b/core/metamodel/src/main/java/org/apache/isis/metamodel/services/grid/GridSystemServiceAbstract.java
index daf2886..6a6c904 100644
--- a/core/metamodel/src/main/java/org/apache/isis/metamodel/services/grid/GridSystemServiceAbstract.java
+++ b/core/metamodel/src/main/java/org/apache/isis/metamodel/services/grid/GridSystemServiceAbstract.java
@@ -120,7 +120,8 @@ import org.apache.isis.metamodel.specloader.SpecificationLoader;
 import lombok.extern.log4j.Log4j2;
 
 @Log4j2
-public abstract class GridSystemServiceAbstract<G extends org.apache.isis.applib.layout.grid.Grid> implements GridSystemService<G> {
+public abstract class GridSystemServiceAbstract<G extends org.apache.isis.applib.layout.grid.Grid>
+implements GridSystemService<G> {
 
     private final Class<G> gridImplementation;
     private final String tns;
diff --git a/core/metamodel/src/main/java/org/apache/isis/metamodel/services/registry/ServiceRegistryDefault.java b/core/metamodel/src/main/java/org/apache/isis/metamodel/services/registry/ServiceRegistryDefault.java
index 765147a..bb716ec 100644
--- a/core/metamodel/src/main/java/org/apache/isis/metamodel/services/registry/ServiceRegistryDefault.java
+++ b/core/metamodel/src/main/java/org/apache/isis/metamodel/services/registry/ServiceRegistryDefault.java
@@ -19,6 +19,7 @@
 
 package org.apache.isis.metamodel.services.registry;
 
+import java.lang.annotation.Annotation;
 import java.util.Map;
 import java.util.Optional;
 import java.util.stream.Stream;
@@ -28,6 +29,7 @@ import javax.inject.Inject;
 import org.apache.isis.applib.annotation.DomainService;
 import org.apache.isis.applib.annotation.NatureOfService;
 import org.apache.isis.applib.services.registry.ServiceRegistry;
+import org.apache.isis.commons.collections.Bin;
 import org.apache.isis.commons.internal.base._Lazy;
 import org.apache.isis.commons.internal.base._NullSafe;
 import org.apache.isis.commons.internal.collections._Maps;
@@ -44,8 +46,7 @@ import lombok.val;
 @DomainService(nature = NatureOfService.DOMAIN)
 public final class ServiceRegistryDefault implements ServiceRegistry {
     
-    //XXX to enforce provisioning order, this is a depends-on relationship! 
-    @SuppressWarnings("unused")
+    // enforces provisioning order (this is a depends-on relationship) 
     @Inject private IsisSystemEnvironment isisSystemEnvironment; 
     
     @Override
@@ -57,7 +58,12 @@ public final class ServiceRegistryDefault implements ServiceRegistry {
     public Stream<ManagedBeanAdapter> streamRegisteredBeans() {
         return managedBeansById.get().values().stream();
     }
-
+    
+    @Override
+    public <T> Bin<T> select(Class<T> type, Annotation[] qualifiers) {
+        return isisSystemEnvironment.getIocContainer()
+                .select(type, _Spring.filterQualifiers(qualifiers));
+    }
     
     // -- HELPER
 
@@ -69,7 +75,7 @@ public final class ServiceRegistryDefault implements ServiceRegistry {
         val filter = IsisBeanTypeRegistry.current();
         val managedBeanAdapterByName = _Maps.<String, ManagedBeanAdapter>newHashMap();
 
-        _Spring.streamAllBeans()
+        isisSystemEnvironment.getIocContainer().streamAllBeans()
         .filter(_NullSafe::isPresent)
         .filter(bean->filter.isManagedBean(bean.getBeanClass())) // do not register unknown sort
         .forEach(bean->{
@@ -80,4 +86,6 @@ public final class ServiceRegistryDefault implements ServiceRegistry {
         return managedBeanAdapterByName;
     }
 
+
+
 }
diff --git a/core/metamodel/src/main/java/org/apache/isis/metamodel/spec/ManagedObject.java b/core/metamodel/src/main/java/org/apache/isis/metamodel/spec/ManagedObject.java
index 0e2ca2d..0c5d0b2 100644
--- a/core/metamodel/src/main/java/org/apache/isis/metamodel/spec/ManagedObject.java
+++ b/core/metamodel/src/main/java/org/apache/isis/metamodel/spec/ManagedObject.java
@@ -26,12 +26,10 @@ import java.util.function.Function;
 import java.util.stream.Collectors;
 
 import org.apache.isis.commons.internal.base._Lazy;
-import org.apache.isis.metamodel.MetaModelContext;
 import org.apache.isis.metamodel.adapter.ObjectAdapter;
 import org.apache.isis.metamodel.adapter.oid.Oid;
 import org.apache.isis.metamodel.adapter.oid.RootOid;
 import org.apache.isis.metamodel.facets.collections.modify.CollectionFacet;
-import org.apache.isis.metamodel.specloader.SpecificationLoader;
 
 import static org.apache.isis.commons.internal.base._With.requires;
 
@@ -157,7 +155,6 @@ public interface ManagedObject {
      * @deprecated use {@link ObjectSpecification#getIconName(ManagedObject))} instead, 
      * (proposed for removal, to keep the API slim)
      */
-    @Deprecated
     default public String getIconName() {
         return getSpecification().getIconName(this);
     }
@@ -218,18 +215,18 @@ public interface ManagedObject {
     
     // -- SHORTCUTS
     
-    /**
-     * Uses the currently available {@link SpecificationLoader} to
-     * @param pojo
-     * @return
-     * @apiNote its not well thought through yet what to do with null argument
-     */
-    public static ManagedObject forPojo(Object pojo) {
-        if(pojo==null) {
-            return null;
-        }
-        return of(MetaModelContext.current()::getSpecification, pojo);
-    }
+//    /**
+//     * Uses the currently available {@link SpecificationLoader} to
+//     * @param pojo
+//     * @return
+//     * @apiNote its not well thought through yet what to do with null argument
+//     */
+//    public static ManagedObject forPojo(Object pojo) {
+//        if(pojo==null) {
+//            return null;
+//        }
+//        return of(MetaModelContext.current()::getSpecification, pojo);
+//    }
     
     // -- UNWRAPPING
     
@@ -317,4 +314,6 @@ public interface ManagedObject {
 
 
 
+
+
 }
diff --git a/core/metamodel/src/main/java/org/apache/isis/metamodel/spec/feature/ObjectAction.java b/core/metamodel/src/main/java/org/apache/isis/metamodel/spec/feature/ObjectAction.java
index ad017d7..3084c33 100644
--- a/core/metamodel/src/main/java/org/apache/isis/metamodel/spec/feature/ObjectAction.java
+++ b/core/metamodel/src/main/java/org/apache/isis/metamodel/spec/feature/ObjectAction.java
@@ -38,7 +38,8 @@ import org.apache.isis.applib.value.Clob;
 import org.apache.isis.commons.internal.base._Strings;
 import org.apache.isis.commons.internal.collections._Lists;
 import org.apache.isis.commons.internal.collections._Sets;
-import org.apache.isis.commons.internal.environment.IsisSystemEnvironment;
+import org.apache.isis.metamodel.MetaModelContext;
+import org.apache.isis.metamodel.adapter.ObjectAdapter;
 import org.apache.isis.metamodel.consent.Consent;
 import org.apache.isis.metamodel.consent.InteractionInitiatedBy;
 import org.apache.isis.metamodel.facets.actions.action.associateWith.AssociatedWithFacet;
@@ -58,6 +59,8 @@ import org.apache.isis.metamodel.specloader.specimpl.MixedInMember;
 
 import static org.apache.isis.commons.internal.base._NullSafe.stream;
 
+import lombok.val;
+
 public interface ObjectAction extends ObjectMember {
 
     // -- getSemantics, getOnType
@@ -227,6 +230,10 @@ public interface ObjectAction extends ObjectMember {
 
         private Util() {
         }
+        
+        private static boolean isPrototyping(ManagedObject adapter) {
+            return MetaModelContext.from(adapter).getSystemEnvironment().isPrototyping();
+        }
 
         public static String nameFor(final ObjectAction objAction) {
             final String actionName = objAction.getName();
@@ -301,14 +308,13 @@ public interface ObjectAction extends ObjectMember {
             return cssClassFacet != null ? cssClassFacet.cssClass(objectAdapter) : null;
         }
 
-
-        @SuppressWarnings("deprecation")
         public static List<ObjectAction> findTopLevel(
                 final ManagedObject adapter) {
-            final List<ObjectAction> topLevelActions = _Lists.newArrayList();
+            
+            val topLevelActions = _Lists.<ObjectAction>newArrayList();
 
             addTopLevelActions(adapter, ActionType.USER, topLevelActions);
-            if(IsisSystemEnvironment.get().isPrototyping()) {
+            if(isPrototyping(adapter)) {
                 addTopLevelActions(adapter, ActionType.PROTOTYPE, topLevelActions);
             }
             return topLevelActions;
@@ -335,16 +341,14 @@ public interface ObjectAction extends ObjectMember {
 
         }
 
-
-        @SuppressWarnings("deprecation")
         public static List<ObjectAction> findForAssociation(
                 final ManagedObject adapter,
                 final ObjectAssociation association) {
 
-            final List<ObjectAction> associatedActions = _Lists.newArrayList();
+            val associatedActions = _Lists.<ObjectAction>newArrayList();
 
             addActions(adapter, ActionType.USER, association, associatedActions);
-            if(IsisSystemEnvironment.get().isPrototyping()) {
+            if(isPrototyping(adapter)) {
                 addActions(adapter, ActionType.PROTOTYPE, association, associatedActions);
             }
 
diff --git a/core/metamodel/src/main/java/org/apache/isis/metamodel/spec/feature/ObjectMember.java b/core/metamodel/src/main/java/org/apache/isis/metamodel/spec/feature/ObjectMember.java
index 38227ce..c2f08ad 100644
--- a/core/metamodel/src/main/java/org/apache/isis/metamodel/spec/feature/ObjectMember.java
+++ b/core/metamodel/src/main/java/org/apache/isis/metamodel/spec/feature/ObjectMember.java
@@ -21,7 +21,6 @@ package org.apache.isis.metamodel.spec.feature;
 
 import java.util.Comparator;
 import java.util.Map;
-import java.util.function.Function;
 import java.util.function.Predicate;
 import java.util.stream.Stream;
 
@@ -37,6 +36,8 @@ import org.apache.isis.metamodel.facets.members.order.MemberOrderFacet;
 import org.apache.isis.metamodel.layout.memberorderfacet.MemberOrderFacetComparator;
 import org.apache.isis.metamodel.spec.ManagedObject;
 
+import lombok.val;
+
 /**
  * Provides reflective access to an action or a field on a domain object.
  */
@@ -203,29 +204,16 @@ public interface ObjectMember extends ObjectFeature {
         }
     }
 
-    class Functions {
-
-        private Functions(){}
-        public static Function<ObjectMember, String> getId() {
-            return ObjectMember::getId;
-        }
-
-    }
-
     class Util {
 
         private Util(){}
 
         public static <T extends ObjectMember> Map<String, T> mapById(final Stream<T> members) {
 
-            // fails if there are multiple members with the same id...
-            //            return _Maps.newHashMap(Maps.uniqueIndex(members, ObjectMember.Functions.getId()));
-
-            final Map<String, T> memberById = _Maps.newLinkedHashMap();
+            val memberById = _Maps.<String, T>newLinkedHashMap();
             members.forEach(member->{
-                final String id = Functions.getId().apply(member);
                 // if there are multiple members with same id, just disregard
-                memberById.put(id, member);
+                memberById.put(member.getId(), member);
             });
             return memberById;
         }
diff --git a/core/metamodel/src/main/java/org/apache/isis/metamodel/specloader/ProgrammingModelServiceDefault.java b/core/metamodel/src/main/java/org/apache/isis/metamodel/specloader/ProgrammingModelServiceDefault.java
index 7e2145e..9c97e08 100644
--- a/core/metamodel/src/main/java/org/apache/isis/metamodel/specloader/ProgrammingModelServiceDefault.java
+++ b/core/metamodel/src/main/java/org/apache/isis/metamodel/specloader/ProgrammingModelServiceDefault.java
@@ -24,6 +24,7 @@ import org.springframework.stereotype.Service;
 
 import org.apache.isis.applib.services.registry.ServiceRegistry;
 import org.apache.isis.commons.internal.base._Lazy;
+import org.apache.isis.metamodel.MetaModelContext;
 import org.apache.isis.metamodel.facetapi.MetaModelRefiner;
 import org.apache.isis.metamodel.progmodel.ProgrammingModel;
 import org.apache.isis.metamodel.progmodel.ProgrammingModelInitFilter;
@@ -45,6 +46,7 @@ public class ProgrammingModelServiceDefault implements ProgrammingModelService {
 
     @Inject private ServiceRegistry serviceRegistry;
     @Inject private ProgrammingModelInitFilter programmingModelInitFilter;
+    @Inject private MetaModelContext metaModelContext;
      
     private _Lazy<ProgrammingModel> programmingModel = 
             _Lazy.threadSafe(this::createProgrammingModel);
@@ -63,7 +65,7 @@ public class ProgrammingModelServiceDefault implements ProgrammingModelService {
         }
 
         // finalize the programming model (make it immutable)
-        programmingModel.init(programmingModelInitFilter);
+        programmingModel.init(programmingModelInitFilter, metaModelContext);
         
         if(log.isInfoEnabled()) {
             
diff --git a/core/metamodel/src/main/java/org/apache/isis/metamodel/specloader/SpecificationLoaderDefault.java b/core/metamodel/src/main/java/org/apache/isis/metamodel/specloader/SpecificationLoaderDefault.java
index 06f8d07..55fa8b2 100644
--- a/core/metamodel/src/main/java/org/apache/isis/metamodel/specloader/SpecificationLoaderDefault.java
+++ b/core/metamodel/src/main/java/org/apache/isis/metamodel/specloader/SpecificationLoaderDefault.java
@@ -28,6 +28,8 @@ import javax.inject.Inject;
 
 import org.springframework.stereotype.Service;
 
+import org.apache.isis.applib.services.inject.ServiceInjector;
+import org.apache.isis.applib.services.registry.ServiceRegistry;
 import org.apache.isis.commons.internal.base._Blackhole;
 import org.apache.isis.commons.internal.base._Lazy;
 import org.apache.isis.commons.internal.base._Timing;
@@ -35,6 +37,7 @@ import org.apache.isis.commons.internal.collections._Lists;
 import org.apache.isis.commons.internal.environment.IsisSystemEnvironment;
 import org.apache.isis.config.IsisConfiguration;
 import org.apache.isis.config.registry.IsisBeanTypeRegistry;
+import org.apache.isis.metamodel.MetaModelContext;
 import org.apache.isis.metamodel.facetapi.Facet;
 import org.apache.isis.metamodel.progmodel.ProgrammingModel;
 import org.apache.isis.metamodel.progmodel.ProgrammingModelService;
@@ -45,8 +48,8 @@ import org.apache.isis.metamodel.spec.ObjectSpecification;
 import org.apache.isis.metamodel.specloader.classsubstitutor.ClassSubstitutor;
 import org.apache.isis.metamodel.specloader.facetprocessor.FacetProcessor;
 import org.apache.isis.metamodel.specloader.postprocessor.PostProcessor;
-import org.apache.isis.metamodel.specloader.specimpl.FacetedMethodsBuilderContext;
 import org.apache.isis.metamodel.specloader.specimpl.IntrospectionState;
+import org.apache.isis.metamodel.specloader.specimpl.ObjectSpecificationAbstract;
 import org.apache.isis.metamodel.specloader.specimpl.dflt.ObjectSpecificationDefault;
 import org.apache.isis.metamodel.specloader.specimpl.standalonelist.ObjectSpecificationOnStandaloneList;
 import org.apache.isis.metamodel.specloader.validator.MetaModelValidatorAbstract;
@@ -76,31 +79,43 @@ import lombok.extern.log4j.Log4j2;
 @Service
 @Log4j2
 public class SpecificationLoaderDefault implements SpecificationLoader {
+
+    @Inject private ProgrammingModelService programmingModelService;
+    @Inject private IsisConfiguration isisConfiguration;
+    @Inject private IsisSystemEnvironment isisSystemEnvironment;
+    @Inject private ServiceRegistry serviceRegistry;
     
     private final ClassSubstitutor classSubstitutor = new ClassSubstitutor();
 
     private ProgrammingModel programmingModel;
     private FacetProcessor facetProcessor;
     private PostProcessor postProcessor;
+    private MetaModelContext metaModelContext; // cannot inject, would cause circular dependency
     
     private final SpecificationCacheDefault<ObjectSpecification> cache = 
             new SpecificationCacheDefault<>();
 
     /** JUnit Test Support */
     public static SpecificationLoaderDefault getInstance (
-            IsisConfiguration configuration,
+            IsisConfiguration isisConfiguration,
             IsisSystemEnvironment isisSystemEnvironment,
+            ServiceRegistry serviceRegistry,
+            ServiceInjector serviceInjector,
             ProgrammingModel programmingModel) {
 
         val instance = new SpecificationLoaderDefault(); 
 
-        instance.isisConfiguration = configuration;
+        instance.metaModelContext = serviceRegistry.lookupServiceElseFail(MetaModelContext.class);
+        
+        instance.isisConfiguration = isisConfiguration;
         instance.isisSystemEnvironment = isisSystemEnvironment;
+        instance.serviceRegistry = serviceRegistry;
         instance.programmingModel = programmingModel;
 
-        instance.facetProcessor = new FacetProcessor(programmingModel);
+        instance.facetProcessor = new FacetProcessor(programmingModel, instance.metaModelContext);
         instance.postProcessor = new PostProcessor(programmingModel);
-
+        
+        
         return instance;
     }
 
@@ -111,8 +126,9 @@ public class SpecificationLoaderDefault implements SpecificationLoader {
         if (log.isDebugEnabled()) {
             log.debug("initialising {}", this);
         }
+        this.metaModelContext = serviceRegistry.lookupServiceElseFail(MetaModelContext.class);
         this.programmingModel = programmingModelService.getProgrammingModel();
-        this.facetProcessor = new FacetProcessor(programmingModel);
+        this.facetProcessor = new FacetProcessor(programmingModel, metaModelContext);
         this.postProcessor = new PostProcessor(programmingModel);
     }
     
@@ -321,22 +337,19 @@ public class SpecificationLoaderDefault implements SpecificationLoader {
     private ObjectSpecification createSpecification(final Class<?> cls) {
         
          // ... and create the specs
-        final ObjectSpecification objectSpec;
+        final ObjectSpecificationAbstract objectSpec;
         if (FreeStandingList.class.isAssignableFrom(cls)) {
 
             objectSpec = new ObjectSpecificationOnStandaloneList(facetProcessor, postProcessor);
+            objectSpec.setMetaModelContext(metaModelContext);
 
         } else {
 
-            val facetedMethodsBuilderContext =
-                    new FacetedMethodsBuilderContext(
-                            this, facetProcessor);
-
             val managedBeanNameIfAny = IsisBeanTypeRegistry.current().getManagedBeanNameForType(cls);
 
             objectSpec = new ObjectSpecificationDefault(
                     cls,
-                    facetedMethodsBuilderContext,
+                    metaModelContext,
                     facetProcessor, 
                     managedBeanNameIfAny, 
                     postProcessor);
@@ -381,10 +394,5 @@ public class SpecificationLoaderDefault implements SpecificationLoader {
         }
     }
 
-    // -- DEPS
-
-    @Inject private ProgrammingModelService programmingModelService;
-    @Inject private IsisConfiguration isisConfiguration;
-    @Inject private IsisSystemEnvironment isisSystemEnvironment;
 
 }
diff --git a/core/metamodel/src/main/java/org/apache/isis/metamodel/specloader/facetprocessor/FacetProcessor.java b/core/metamodel/src/main/java/org/apache/isis/metamodel/specloader/facetprocessor/FacetProcessor.java
index 4185e20..ac0bfad 100644
--- a/core/metamodel/src/main/java/org/apache/isis/metamodel/specloader/facetprocessor/FacetProcessor.java
+++ b/core/metamodel/src/main/java/org/apache/isis/metamodel/specloader/facetprocessor/FacetProcessor.java
@@ -27,7 +27,6 @@ import java.util.Map;
 import java.util.Set;
 import java.util.function.Consumer;
 
-import org.apache.isis.applib.services.inject.ServiceInjector;
 import org.apache.isis.commons.internal.base._Lazy;
 import org.apache.isis.commons.internal.collections._Lists;
 import org.apache.isis.commons.internal.collections._Maps;
@@ -62,7 +61,7 @@ import lombok.val;
 public class FacetProcessor {
 
     @NonNull private final ProgrammingModel programmingModel;
-    private ServiceInjector serviceInjector;
+    @NonNull private final MetaModelContext metaModelContext;
 
     /**
      * Class<FacetFactory> => FacetFactory
@@ -128,8 +127,6 @@ public class FacetProcessor {
     
     public void init() {
         cleanUp(); 
-        
-        serviceInjector = MetaModelContext.current().getServiceInjector();
         programmingModel.streamFactories()
         .forEach(this::registerFactory);
     }
@@ -141,7 +138,6 @@ public class FacetProcessor {
     private void cleanUp() {
         clearCaches();
         factories.clear();
-        serviceInjector = null;
         factoryByFactoryType.clear();
     }
     
@@ -156,7 +152,7 @@ public class FacetProcessor {
      * processing.
      */
     public void injectDependenciesInto(FacetFactory factory) {
-        serviceInjector.injectServicesInto(factory);
+        metaModelContext.getServiceInjector().injectServicesInto(factory);
     }
 
     /**
@@ -343,6 +339,8 @@ public class FacetProcessor {
             FeatureType featureType, 
             boolean isMixinMain) {
         
+        facetedMethod.setMetaModelContext(metaModelContext);
+        
         val processMethodContext =
                 new ProcessMethodContext(
                         cls, 
@@ -357,6 +355,8 @@ public class FacetProcessor {
 
     public void processMemberOrder(ObjectMember facetHolder) {
         
+        //((MetaModelContextAware)facetHolder).setMetaModelContext(metaModelContext);
+        
         val processMemberContext =
                 new ContributeeMemberFacetFactory.ProcessContributeeMemberContext(facetHolder);
         contributeeMemberFacetFactories.get().forEach(facetFactory->
@@ -389,6 +389,8 @@ public class FacetProcessor {
             MethodRemover methodRemover,
             FacetedMethodParameter facetedMethodParameter) {
         
+        facetedMethodParameter.setMetaModelContext(metaModelContext);
+        
         for (val featureType : FeatureType.PARAMETERS_ONLY) {
             processParams(introspectedClass, method, paramNum, methodRemover, facetedMethodParameter, featureType);
         }
@@ -402,6 +404,8 @@ public class FacetProcessor {
             FacetedMethodParameter facetedMethodParameter,
             FeatureType featureType) {
         
+        facetedMethodParameter.setMetaModelContext(metaModelContext);
+        
         val processParameterContext =
                 new ProcessParameterContext(introspectedClass, method, paramNum, methodRemover, facetedMethodParameter);
         
diff --git a/core/metamodel/src/main/java/org/apache/isis/metamodel/specloader/specimpl/FacetedMethodsBuilder.java b/core/metamodel/src/main/java/org/apache/isis/metamodel/specloader/specimpl/FacetedMethodsBuilder.java
index a33fc10..0a07d70 100644
--- a/core/metamodel/src/main/java/org/apache/isis/metamodel/specloader/specimpl/FacetedMethodsBuilder.java
+++ b/core/metamodel/src/main/java/org/apache/isis/metamodel/specloader/specimpl/FacetedMethodsBuilder.java
@@ -34,7 +34,6 @@ import org.apache.isis.commons.exceptions.IsisException;
 import org.apache.isis.commons.internal.collections._Lists;
 import org.apache.isis.commons.internal.collections._Sets;
 import org.apache.isis.commons.internal.reflection._Annotations;
-import org.apache.isis.metamodel.MetaModelContext;
 import org.apache.isis.metamodel.commons.MethodUtil;
 import org.apache.isis.metamodel.commons.ToString;
 import org.apache.isis.metamodel.exceptions.MetaModelException;
@@ -152,11 +151,13 @@ public class FacetedMethodsBuilder {
 
     public FacetedMethodsBuilder(
             final ObjectSpecificationAbstract inspectedTypeSpec,
-            final FacetedMethodsBuilderContext facetedMethodsBuilderContext) {
+            final FacetProcessor facetProcessor) {
         
         if (log.isDebugEnabled()) {
             log.debug("creating JavaIntrospector for {}", inspectedTypeSpec.getFullIdentifier());
         }
+        
+        val mmContext = inspectedTypeSpec.getMetaModelContext();
 
         this.inspectedTypeSpec = inspectedTypeSpec;
         this.introspectedClass = inspectedTypeSpec.getCorrespondingClass();
@@ -164,10 +165,10 @@ public class FacetedMethodsBuilder {
         val methodsRemaining = introspectedClass.getMethods();
         this.methodRemover = new FacetedMethodsMethodRemover(introspectedClass, methodsRemaining);
 
-        this.facetProcessor = facetedMethodsBuilderContext.facetProcessor;
-        this.specificationLoader = facetedMethodsBuilderContext.specificationLoader;
+        this.facetProcessor = facetProcessor;
+        this.specificationLoader = mmContext.getSpecificationLoader();
 
-        val isisConfiguration = MetaModelContext.current().getConfiguration();
+        val isisConfiguration = mmContext.getConfiguration();
         
         this.explicitAnnotationsForActions = isisConfiguration.getReflector().getExplicitAnnotations().isAction();
 
diff --git a/core/metamodel/src/main/java/org/apache/isis/metamodel/specloader/specimpl/FacetedMethodsBuilderContext.java b/core/metamodel/src/main/java/org/apache/isis/metamodel/specloader/specimpl/FacetedMethodsBuilderContext.java
deleted file mode 100644
index 5728ea3..0000000
--- a/core/metamodel/src/main/java/org/apache/isis/metamodel/specloader/specimpl/FacetedMethodsBuilderContext.java
+++ /dev/null
@@ -1,34 +0,0 @@
-/*
- *  Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you under the Apache License, Version 2.0 (the
- *  "License"); you may not use this file except in compliance
- *  with the License.  You may obtain a copy of the License at
- *
- *        http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing,
- *  software distributed under the License is distributed on an
- *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- *  KIND, either express or implied.  See the License for the
- *  specific language governing permissions and limitations
- *  under the License.
- */
-package org.apache.isis.metamodel.specloader.specimpl;
-
-import org.apache.isis.metamodel.specloader.SpecificationLoader;
-import org.apache.isis.metamodel.specloader.facetprocessor.FacetProcessor;
-
-public class FacetedMethodsBuilderContext {
-    public final SpecificationLoader specificationLoader;
-    public final FacetProcessor facetProcessor;
-
-    public FacetedMethodsBuilderContext(
-            final SpecificationLoader specificationLoader,
-            final FacetProcessor facetProcessor) {
-        this.specificationLoader = specificationLoader;
-        this.facetProcessor = facetProcessor;
-    }
-}
\ No newline at end of file
diff --git a/core/metamodel/src/main/java/org/apache/isis/metamodel/specloader/specimpl/ObjectActionContributee.java b/core/metamodel/src/main/java/org/apache/isis/metamodel/specloader/specimpl/ObjectActionContributee.java
index cb950c3..6960101 100644
--- a/core/metamodel/src/main/java/org/apache/isis/metamodel/specloader/specimpl/ObjectActionContributee.java
+++ b/core/metamodel/src/main/java/org/apache/isis/metamodel/specloader/specimpl/ObjectActionContributee.java
@@ -112,7 +112,7 @@ public class ObjectActionContributee extends ObjectActionDefault implements Cont
         }
 
         final List<ObjectActionParameter> serviceParameters = serviceAction.getParameters();
-        final List<FacetedMethodParameter> paramPeers = getFacetedMethod().getParameters();
+        final List<FacetedMethodParameter> paramPeers = getFacetedMethod().getParameters(); //side effects?
 
         final List<ObjectActionParameter> contributeeParameters = _Lists.newArrayList();
         int contributeeParamNum = 0;
diff --git a/core/metamodel/src/main/java/org/apache/isis/metamodel/specloader/specimpl/ObjectActionDefault.java b/core/metamodel/src/main/java/org/apache/isis/metamodel/specloader/specimpl/ObjectActionDefault.java
index 2d5a010..d3f7d93 100644
--- a/core/metamodel/src/main/java/org/apache/isis/metamodel/specloader/specimpl/ObjectActionDefault.java
+++ b/core/metamodel/src/main/java/org/apache/isis/metamodel/specloader/specimpl/ObjectActionDefault.java
@@ -33,6 +33,7 @@ import org.apache.isis.applib.services.command.Command;
 import org.apache.isis.commons.exceptions.UnknownTypeException;
 import org.apache.isis.commons.internal._Constants;
 import org.apache.isis.commons.internal.collections._Lists;
+import org.apache.isis.metamodel.adapter.ObjectAdapter;
 import org.apache.isis.metamodel.consent.Consent;
 import org.apache.isis.metamodel.consent.InteractionInitiatedBy;
 import org.apache.isis.metamodel.consent.InteractionResultSet;
@@ -56,14 +57,12 @@ import org.apache.isis.metamodel.interactions.InteractionUtils;
 import org.apache.isis.metamodel.interactions.UsabilityContext;
 import org.apache.isis.metamodel.interactions.ValidityContext;
 import org.apache.isis.metamodel.interactions.VisibilityContext;
-import org.apache.isis.metamodel.services.command.CommandDtoServiceInternal;
 import org.apache.isis.metamodel.spec.ActionType;
 import org.apache.isis.metamodel.spec.DomainModelException;
 import org.apache.isis.metamodel.spec.ManagedObject;
 import org.apache.isis.metamodel.spec.ObjectSpecification;
 import org.apache.isis.metamodel.spec.feature.ObjectAction;
 import org.apache.isis.metamodel.spec.feature.ObjectActionParameter;
-import org.apache.isis.schema.cmd.v1.CommandDto;
 
 import lombok.val;
 
@@ -188,8 +187,7 @@ public class ObjectActionDefault extends ObjectMemberAbstract implements ObjectA
         for (int paramNum = 0; paramNum < parameterCount; paramNum++) {
             final FacetedMethodParameter paramPeer = paramPeers.get(paramNum);
 
-            final ObjectSpecification specification = ObjectMemberAbstract
-                    .specificationOf(paramPeer.getType());
+            super.specificationOf(paramPeer.getType()); // preload
 
             // previously we threw an exception here if the specification represented a collection.  No longer!
             final ObjectActionParameter parameter =
diff --git a/core/metamodel/src/main/java/org/apache/isis/metamodel/specloader/specimpl/ObjectActionMixedIn.java b/core/metamodel/src/main/java/org/apache/isis/metamodel/specloader/specimpl/ObjectActionMixedIn.java
index 5bfef89..d6117e5 100644
--- a/core/metamodel/src/main/java/org/apache/isis/metamodel/specloader/specimpl/ObjectActionMixedIn.java
+++ b/core/metamodel/src/main/java/org/apache/isis/metamodel/specloader/specimpl/ObjectActionMixedIn.java
@@ -92,7 +92,7 @@ public class ObjectActionMixedIn extends ObjectActionDefault implements MixedInM
 
         if(_Strings.isNullOrEmpty(name) || name.equalsIgnoreCase(mixinMethodName)) {
             String memberName = determineNameFrom(mixinAction);
-            FacetUtil.addFacet(new NamedFacetInferred(memberName, facetHolder));
+            super.addFacet(new NamedFacetInferred(memberName, facetHolder));
         }
 
         // calculate the identifier
diff --git a/core/metamodel/src/main/java/org/apache/isis/metamodel/specloader/specimpl/ObjectActionParameterAbstract.java b/core/metamodel/src/main/java/org/apache/isis/metamodel/specloader/specimpl/ObjectActionParameterAbstract.java
index 34deaf7..7e8c5dc 100644
--- a/core/metamodel/src/main/java/org/apache/isis/metamodel/specloader/specimpl/ObjectActionParameterAbstract.java
+++ b/core/metamodel/src/main/java/org/apache/isis/metamodel/specloader/specimpl/ObjectActionParameterAbstract.java
@@ -27,6 +27,7 @@ import java.util.stream.Stream;
 import org.apache.isis.applib.Identifier;
 import org.apache.isis.commons.internal.collections._Lists;
 import org.apache.isis.commons.internal.exceptions._Exceptions;
+import org.apache.isis.metamodel.MetaModelContext;
 import org.apache.isis.metamodel.adapter.ObjectAdapter;
 import org.apache.isis.metamodel.adapter.ObjectAdapterProvider;
 import org.apache.isis.metamodel.commons.ClassExtensions;
@@ -81,6 +82,11 @@ public abstract class ObjectActionParameterAbstract implements ObjectActionParam
         this.parentAction = objectAction;
         this.peer = peer;
     }
+    
+    @Override
+    public MetaModelContext getMetaModelContext() {
+        return parentAction.getMetaModelContext();
+    }
 
     @Override
     public FeatureType getFeatureType() {
@@ -132,7 +138,7 @@ public abstract class ObjectActionParameterAbstract implements ObjectActionParam
 
     @Override
     public ObjectSpecification getSpecification() {
-        return ObjectMemberAbstract.specificationOf(peer.getType());
+        return getSpecificationLoader().loadSpecification(peer.getType());
     }
 
     @Override
diff --git a/core/metamodel/src/main/java/org/apache/isis/metamodel/specloader/specimpl/ObjectMemberAbstract.java b/core/metamodel/src/main/java/org/apache/isis/metamodel/specloader/specimpl/ObjectMemberAbstract.java
index 82c60ad..b1e35a9 100644
--- a/core/metamodel/src/main/java/org/apache/isis/metamodel/specloader/specimpl/ObjectMemberAbstract.java
+++ b/core/metamodel/src/main/java/org/apache/isis/metamodel/specloader/specimpl/ObjectMemberAbstract.java
@@ -63,10 +63,10 @@ import lombok.val;
 
 public abstract class ObjectMemberAbstract implements ObjectMember, MetaModelContext.Delegating {
 
-    protected static ObjectSpecification specificationOf(final Class<?> type) {
-        return type == null 
-                ? null 
-                        : MetaModelContext.current().getSpecificationLoader().loadSpecification(type);
+    protected ObjectSpecification specificationOf(final Class<?> type) {
+        return type != null 
+                ? getMetaModelContext().getSpecificationLoader().loadSpecification(type)
+                        : null;
     }
 
     // -- fields
@@ -462,7 +462,7 @@ public abstract class ObjectMemberAbstract implements ObjectMember, MetaModelCon
 
     @Override
     public MetaModelContext getMetaModelContext() {
-        return MetaModelContext.current();
+        return facetedMethod.getMetaModelContext();
     }
 
 }
diff --git a/core/metamodel/src/main/java/org/apache/isis/metamodel/specloader/specimpl/ObjectSpecificationAbstract.java b/core/metamodel/src/main/java/org/apache/isis/metamodel/specloader/specimpl/ObjectSpecificationAbstract.java
index 69a454c..41a1430 100644
--- a/core/metamodel/src/main/java/org/apache/isis/metamodel/specloader/specimpl/ObjectSpecificationAbstract.java
+++ b/core/metamodel/src/main/java/org/apache/isis/metamodel/specloader/specimpl/ObjectSpecificationAbstract.java
@@ -39,12 +39,11 @@ import org.apache.isis.commons.internal.collections._Multimaps;
 import org.apache.isis.commons.internal.collections._Multimaps.ListMultimap;
 import org.apache.isis.commons.internal.collections._Sets;
 import org.apache.isis.commons.internal.collections._Streams;
-import org.apache.isis.commons.internal.ioc.ManagedBeanAdapter;
 import org.apache.isis.commons.internal.ioc.BeanSort;
+import org.apache.isis.commons.internal.ioc.ManagedBeanAdapter;
 import org.apache.isis.commons.internal.reflection._Reflect;
 import org.apache.isis.config.registry.IsisBeanTypeRegistry;
 import org.apache.isis.metamodel.JdoMetamodelUtil;
-import org.apache.isis.metamodel.MetaModelContext;
 import org.apache.isis.metamodel.commons.ClassExtensions;
 import org.apache.isis.metamodel.commons.ToString;
 import org.apache.isis.metamodel.consent.Consent;
@@ -141,9 +140,7 @@ public abstract class ObjectSpecificationAbstract extends FacetHolderImpl implem
 
     //protected final ServiceInjector servicesInjector;
 
-    private final MetaModelContext context;
     private final PostProcessor postProcessor;
-    private final SpecificationLoader specificationLoader;
     private final FacetProcessor facetProcessor;
 
     // -- ASSOCIATIONS
@@ -226,9 +223,6 @@ public abstract class ObjectSpecificationAbstract extends FacetHolderImpl implem
         this.identifier = Identifier.classIdentifier(introspectedClass);
 
         this.facetProcessor = facetProcessor;
-
-        this.context = MetaModelContext.current();
-        this.specificationLoader = context.getSpecificationLoader();
         this.postProcessor = postProcessor;
     }
 
@@ -766,10 +760,8 @@ public abstract class ObjectSpecificationAbstract extends FacetHolderImpl implem
                 .filter(ContributeeMember.Predicates.regularElse(contributed));
     }
 
-
-
     private Stream<ManagedBeanAdapter> streamManagedBeans() {
-        return context.getServiceRegistry().streamRegisteredBeans();
+        return getMetaModelContext().getServiceRegistry().streamRegisteredBeans();
     }
 
     // -- CONTRIBUTEE ASSOCIATIONS (PROPERTIES AND COLLECTIONS)
@@ -789,7 +781,7 @@ public abstract class ObjectSpecificationAbstract extends FacetHolderImpl implem
             Consumer<ObjectAssociation> onNewContributeeAssociation) {
 
         val serviceClass = serviceBean.getBeanClass();
-        val specification = specificationLoader.loadSpecification(serviceClass,
+        val specification = getSpecificationLoader().loadSpecification(serviceClass,
                 IntrospectionState.TYPE_AND_MEMBERS_INTROSPECTED);
         if (specification == this) {
             return;
@@ -1079,7 +1071,7 @@ public abstract class ObjectSpecificationAbstract extends FacetHolderImpl implem
     }
 
     protected SpecificationLoader getSpecificationLoader() {
-        return specificationLoader;
+        return getMetaModelContext().getSpecificationLoader();
     }
 
     protected BeanSort sortOf(ObjectSpecification spec) {
diff --git a/core/metamodel/src/main/java/org/apache/isis/metamodel/specloader/specimpl/OneToManyAssociationContributee.java b/core/metamodel/src/main/java/org/apache/isis/metamodel/specloader/specimpl/OneToManyAssociationContributee.java
index 68ebc37..92c2fe1 100644
--- a/core/metamodel/src/main/java/org/apache/isis/metamodel/specloader/specimpl/OneToManyAssociationContributee.java
+++ b/core/metamodel/src/main/java/org/apache/isis/metamodel/specloader/specimpl/OneToManyAssociationContributee.java
@@ -23,7 +23,6 @@ import java.util.List;
 import org.apache.isis.applib.Identifier;
 import org.apache.isis.applib.annotation.Where;
 import org.apache.isis.commons.internal.ioc.ManagedBeanAdapter;
-import org.apache.isis.metamodel.MetaModelContext;
 import org.apache.isis.metamodel.consent.Consent;
 import org.apache.isis.metamodel.consent.InteractionInitiatedBy;
 import org.apache.isis.metamodel.facetapi.FacetHolder;
@@ -41,7 +40,8 @@ import org.apache.isis.metamodel.interactions.VisibilityContext;
 import org.apache.isis.metamodel.spec.ManagedObject;
 import org.apache.isis.metamodel.spec.ObjectSpecification;
 import org.apache.isis.metamodel.spec.feature.ObjectAction;
-import org.apache.isis.metamodel.specloader.SpecificationLoader;
+
+import lombok.val;
 
 public class OneToManyAssociationContributee 
 extends OneToManyAssociationDefault implements ContributeeMember {
@@ -60,12 +60,12 @@ extends OneToManyAssociationDefault implements ContributeeMember {
 
     private static ObjectSpecification typeOfSpec(final ObjectActionDefault objectAction) {
 
-        final TypeOfFacet actionTypeOfFacet = objectAction.getFacet(TypeOfFacet.class);
-        final SpecificationLoader specificationLookup = MetaModelContext.current().getSpecificationLoader();
+        val actionTypeOfFacet = objectAction.getFacet(TypeOfFacet.class);
+        val specLoader = objectAction.getMetaModelContext().getSpecificationLoader();
         // TODO: a bit of a hack; ought really to set up a fallback TypeOfFacetDefault which ensures that there is always
         // a TypeOfFacet for any contributee associations created from contributed actions.
-        Class<? extends Object> cls = actionTypeOfFacet != null? actionTypeOfFacet.value(): Object.class;
-        return specificationLookup.loadSpecification(cls);
+        val type = actionTypeOfFacet != null? actionTypeOfFacet.value(): Object.class;
+        return specLoader.loadSpecification(type);
     }
 
     public OneToManyAssociationContributee(
diff --git a/core/metamodel/src/main/java/org/apache/isis/metamodel/specloader/specimpl/OneToManyAssociationDefault.java b/core/metamodel/src/main/java/org/apache/isis/metamodel/specloader/specimpl/OneToManyAssociationDefault.java
index 1e2d39f..21117b6 100644
--- a/core/metamodel/src/main/java/org/apache/isis/metamodel/specloader/specimpl/OneToManyAssociationDefault.java
+++ b/core/metamodel/src/main/java/org/apache/isis/metamodel/specloader/specimpl/OneToManyAssociationDefault.java
@@ -52,7 +52,8 @@ public class OneToManyAssociationDefault
 extends ObjectAssociationAbstract implements OneToManyAssociation {
 
     public OneToManyAssociationDefault(final FacetedMethod facetedMethod) {
-        this(facetedMethod, specificationOf(facetedMethod.getType()));
+        this(facetedMethod, facetedMethod.getMetaModelContext()
+                .getSpecificationLoader().loadSpecification(facetedMethod.getType()));
     }
 
     protected OneToManyAssociationDefault(
diff --git a/core/metamodel/src/main/java/org/apache/isis/metamodel/specloader/specimpl/OneToManyAssociationMixedIn.java b/core/metamodel/src/main/java/org/apache/isis/metamodel/specloader/specimpl/OneToManyAssociationMixedIn.java
index 873dd4d..100429d 100644
--- a/core/metamodel/src/main/java/org/apache/isis/metamodel/specloader/specimpl/OneToManyAssociationMixedIn.java
+++ b/core/metamodel/src/main/java/org/apache/isis/metamodel/specloader/specimpl/OneToManyAssociationMixedIn.java
@@ -42,6 +42,8 @@ import org.apache.isis.metamodel.services.publishing.PublishingServiceInternal;
 import org.apache.isis.metamodel.spec.ManagedObject;
 import org.apache.isis.metamodel.spec.ObjectSpecification;
 
+import lombok.val;
+
 public class OneToManyAssociationMixedIn extends OneToManyAssociationDefault implements MixedInMember {
 
     /**
@@ -71,11 +73,15 @@ public class OneToManyAssociationMixedIn extends OneToManyAssociationDefault imp
     private static ObjectSpecification typeOfSpec(
             final ObjectActionDefault objectAction) {
 
-        final TypeOfFacet actionTypeOfFacet = objectAction.getFacet(TypeOfFacet.class);
-        // TODO: a bit of a hack; ought really to set up a fallback TypeOfFacetDefault which ensures that there is always
-        // a TypeOfFacet for any mixedIn associations created from mixin actions.
-        Class<? extends Object> cls = actionTypeOfFacet != null? actionTypeOfFacet.value(): Object.class;
-        return specificationOf(cls);
+        val actionTypeOfFacet = objectAction.getFacet(TypeOfFacet.class);
+        // TODO: a bit of a hack; ought really to set up a fallback TypeOfFacetDefault, 
+        // which ensures that there is always a TypeOfFacet for any mixedIn associations 
+        // created from mixin actions.
+        val type = actionTypeOfFacet != null
+                ? actionTypeOfFacet.value()
+                        : Object.class;
+                
+        return objectAction.getSpecificationLoader().loadSpecification(type);
     }
 
     public OneToManyAssociationMixedIn(
diff --git a/core/metamodel/src/main/java/org/apache/isis/metamodel/specloader/specimpl/OneToOneAssociationDefault.java b/core/metamodel/src/main/java/org/apache/isis/metamodel/specloader/specimpl/OneToOneAssociationDefault.java
index 5c93c27..61406c1 100644
--- a/core/metamodel/src/main/java/org/apache/isis/metamodel/specloader/specimpl/OneToOneAssociationDefault.java
+++ b/core/metamodel/src/main/java/org/apache/isis/metamodel/specloader/specimpl/OneToOneAssociationDefault.java
@@ -61,7 +61,8 @@ import lombok.val;
 public class OneToOneAssociationDefault extends ObjectAssociationAbstract implements OneToOneAssociation {
 
     public OneToOneAssociationDefault(final FacetedMethod facetedMethod) {
-        this(facetedMethod, specificationOf(facetedMethod.getType()));
+        this(facetedMethod, facetedMethod.getMetaModelContext()
+                .getSpecificationLoader().loadSpecification(facetedMethod.getType()));
     }
 
     protected OneToOneAssociationDefault(
diff --git a/core/metamodel/src/main/java/org/apache/isis/metamodel/specloader/specimpl/dflt/ObjectSpecificationDefault.java b/core/metamodel/src/main/java/org/apache/isis/metamodel/specloader/specimpl/dflt/ObjectSpecificationDefault.java
index 3f9d383..10e46d0 100644
--- a/core/metamodel/src/main/java/org/apache/isis/metamodel/specloader/specimpl/dflt/ObjectSpecificationDefault.java
+++ b/core/metamodel/src/main/java/org/apache/isis/metamodel/specloader/specimpl/dflt/ObjectSpecificationDefault.java
@@ -30,6 +30,7 @@ import org.apache.isis.applib.annotation.NatureOfService;
 import org.apache.isis.commons.internal.base._Lazy;
 import org.apache.isis.commons.internal.collections._Lists;
 import org.apache.isis.commons.internal.collections._Maps;
+import org.apache.isis.metamodel.MetaModelContext;
 import org.apache.isis.metamodel.commons.StringExtensions;
 import org.apache.isis.metamodel.commons.ToString;
 import org.apache.isis.metamodel.facetapi.Facet;
@@ -60,7 +61,6 @@ import org.apache.isis.metamodel.specloader.classsubstitutor.ClassSubstitutor;
 import org.apache.isis.metamodel.specloader.facetprocessor.FacetProcessor;
 import org.apache.isis.metamodel.specloader.postprocessor.PostProcessor;
 import org.apache.isis.metamodel.specloader.specimpl.FacetedMethodsBuilder;
-import org.apache.isis.metamodel.specloader.specimpl.FacetedMethodsBuilderContext;
 import org.apache.isis.metamodel.specloader.specimpl.IntrospectionState;
 import org.apache.isis.metamodel.specloader.specimpl.ObjectActionDefault;
 import org.apache.isis.metamodel.specloader.specimpl.ObjectSpecificationAbstract;
@@ -98,17 +98,19 @@ public class ObjectSpecificationDefault extends ObjectSpecificationAbstract impl
 
     public ObjectSpecificationDefault(
             final Class<?> correspondingClass,
-            final FacetedMethodsBuilderContext facetedMethodsBuilderContext,
+            final MetaModelContext metaModelContext,
             final FacetProcessor facetProcessor,
             final String nameIfIsManagedBean,
             final PostProcessor postProcessor) {
         super(correspondingClass, determineShortName(correspondingClass), facetProcessor, postProcessor);
 
+        setMetaModelContext(metaModelContext);
+        
         this.nameIfIsManagedBean = nameIfIsManagedBean;
-
-        this.facetedMethodsBuilder = new FacetedMethodsBuilder(this, facetedMethodsBuilderContext);
+        this.facetedMethodsBuilder = new FacetedMethodsBuilder(this, facetProcessor);
 
         facetProcessor.processObjectSpecId(correspondingClass, this);
+        
     }
 
     @Override
diff --git a/core/metamodel/src/main/java/org/apache/isis/metamodel/specloader/validator/MetaModelValidatorAbstract.java b/core/metamodel/src/main/java/org/apache/isis/metamodel/specloader/validator/MetaModelValidatorAbstract.java
index 3606b86..c5bd3f3 100644
--- a/core/metamodel/src/main/java/org/apache/isis/metamodel/specloader/validator/MetaModelValidatorAbstract.java
+++ b/core/metamodel/src/main/java/org/apache/isis/metamodel/specloader/validator/MetaModelValidatorAbstract.java
@@ -22,15 +22,21 @@ package org.apache.isis.metamodel.specloader.validator;
 import org.apache.isis.applib.Identifier;
 import org.apache.isis.config.IsisConfiguration;
 import org.apache.isis.metamodel.MetaModelContext;
+import org.apache.isis.metamodel.MetaModelContextAware;
 import org.apache.isis.metamodel.facetapi.FacetHolder;
 
+import lombok.Getter;
 import lombok.NonNull;
+import lombok.Setter;
 
 public abstract class MetaModelValidatorAbstract 
-implements MetaModelValidator {
+implements MetaModelValidator, MetaModelContextAware {
 
     protected final ValidationFailures failures = new ValidationFailures();
     
+    @Getter @Setter(onMethod = @__(@Override))
+    private MetaModelContext metaModelContext;
+    
     /**
      * Collect any {@link ValidationFailure} to given validationFailures. 
      *  
@@ -52,7 +58,7 @@ implements MetaModelValidator {
     }
     
     protected IsisConfiguration getConfiguration() {
-        return MetaModelContext.current().getConfiguration();
+        return metaModelContext.getConfiguration();
     }
     
 }
diff --git a/core/metamodel/src/main/java/org/apache/isis/metamodel/specloader/validator/MetaModelValidatorForConflictingOptionality.java b/core/metamodel/src/main/java/org/apache/isis/metamodel/specloader/validator/MetaModelValidatorForConflictingOptionality.java
index 753f802..4e0c0fd 100644
--- a/core/metamodel/src/main/java/org/apache/isis/metamodel/specloader/validator/MetaModelValidatorForConflictingOptionality.java
+++ b/core/metamodel/src/main/java/org/apache/isis/metamodel/specloader/validator/MetaModelValidatorForConflictingOptionality.java
@@ -27,9 +27,6 @@ import lombok.val;
 
 public class MetaModelValidatorForConflictingOptionality extends MetaModelValidatorAbstract {
 
-    public MetaModelValidatorForConflictingOptionality() {
-    }
-    
     public Facet flagIfConflict(final MandatoryFacet facet, final String message) {
         if(conflictingOptionality(facet)) {
             addFailure(facet, message);
diff --git a/core/metamodel/src/main/java/org/apache/isis/metamodel/specloader/validator/MetaModelValidatorForDeprecatedAbstract.java b/core/metamodel/src/main/java/org/apache/isis/metamodel/specloader/validator/MetaModelValidatorForDeprecatedAbstract.java
index 1953a7f..7a488d2 100644
--- a/core/metamodel/src/main/java/org/apache/isis/metamodel/specloader/validator/MetaModelValidatorForDeprecatedAbstract.java
+++ b/core/metamodel/src/main/java/org/apache/isis/metamodel/specloader/validator/MetaModelValidatorForDeprecatedAbstract.java
@@ -24,7 +24,8 @@ import org.apache.isis.metamodel.facets.FacetFactory;
 
 import lombok.val;
 
-public abstract class MetaModelValidatorForDeprecatedAbstract extends MetaModelValidatorAbstract {
+@Deprecated //not used any more?
+abstract class MetaModelValidatorForDeprecatedAbstract extends MetaModelValidatorAbstract {
 
     /**
      * @param facet
diff --git a/core/metamodel/src/main/java/org/apache/isis/metamodel/specloader/validator/MetaModelValidatorForDeprecatedAnnotation.java b/core/metamodel/src/main/java/org/apache/isis/metamodel/specloader/validator/MetaModelValidatorForDeprecatedAnnotation.java
index 34e5e1a..9b0d842 100644
--- a/core/metamodel/src/main/java/org/apache/isis/metamodel/specloader/validator/MetaModelValidatorForDeprecatedAnnotation.java
+++ b/core/metamodel/src/main/java/org/apache/isis/metamodel/specloader/validator/MetaModelValidatorForDeprecatedAnnotation.java
@@ -23,7 +23,8 @@ import org.apache.isis.metamodel.facetapi.Facet;
 import org.apache.isis.metamodel.facetapi.IdentifiedHolder;
 import org.apache.isis.metamodel.facets.FacetFactory;
 
-public class MetaModelValidatorForDeprecatedAnnotation extends MetaModelValidatorForDeprecatedAbstract{
+@Deprecated //not used any more?
+class MetaModelValidatorForDeprecatedAnnotation extends MetaModelValidatorForDeprecatedAbstract{
 
     private String annotationName;
 
diff --git a/core/metamodel/src/main/java/org/apache/isis/metamodel/specloader/validator/MetaModelValidatorForDeprecatedMethodPrefix.java b/core/metamodel/src/main/java/org/apache/isis/metamodel/specloader/validator/MetaModelValidatorForDeprecatedMethodPrefix.java
index 9d83cdb..9eed91c 100644
--- a/core/metamodel/src/main/java/org/apache/isis/metamodel/specloader/validator/MetaModelValidatorForDeprecatedMethodPrefix.java
+++ b/core/metamodel/src/main/java/org/apache/isis/metamodel/specloader/validator/MetaModelValidatorForDeprecatedMethodPrefix.java
@@ -23,7 +23,8 @@ import org.apache.isis.metamodel.facetapi.Facet;
 import org.apache.isis.metamodel.facetapi.IdentifiedHolder;
 import org.apache.isis.metamodel.facets.FacetFactory;
 
-public class MetaModelValidatorForDeprecatedMethodPrefix extends MetaModelValidatorForDeprecatedAbstract {
+@Deprecated //not used any more?
+class MetaModelValidatorForDeprecatedMethodPrefix extends MetaModelValidatorForDeprecatedAbstract {
 
     private final String methodPrefix;
 
diff --git a/core/metamodel/src/main/java/org/apache/isis/metamodel/specloader/validator/MetaModelValidatorForValidationFailures.java b/core/metamodel/src/main/java/org/apache/isis/metamodel/specloader/validator/MetaModelValidatorForValidationFailures.java
index 67febcd..e9b262a 100644
--- a/core/metamodel/src/main/java/org/apache/isis/metamodel/specloader/validator/MetaModelValidatorForValidationFailures.java
+++ b/core/metamodel/src/main/java/org/apache/isis/metamodel/specloader/validator/MetaModelValidatorForValidationFailures.java
@@ -18,18 +18,8 @@
  */
 package org.apache.isis.metamodel.specloader.validator;
 
-import org.apache.isis.applib.Identifier;
-import org.apache.isis.metamodel.facetapi.Facet;
-import org.apache.isis.metamodel.facetapi.FacetUtil;
-import org.apache.isis.metamodel.facetapi.IdentifiedHolder;
-
-import lombok.val;
-
 public class MetaModelValidatorForValidationFailures extends MetaModelValidatorAbstract {
 
-    public MetaModelValidatorForValidationFailures() {
-    }
-
 //    public void addFailure(Identifier identifier, String pattern, Object... arguments) {
 //        failures.add(identifier, pattern, arguments);
 //    }
diff --git a/core/metamodel/src/main/java/org/apache/isis/metamodel/specloader/validator/MetaModelValidatorVisiting.java b/core/metamodel/src/main/java/org/apache/isis/metamodel/specloader/validator/MetaModelValidatorVisiting.java
index a6b568b..8b4b0fe 100644
--- a/core/metamodel/src/main/java/org/apache/isis/metamodel/specloader/validator/MetaModelValidatorVisiting.java
+++ b/core/metamodel/src/main/java/org/apache/isis/metamodel/specloader/validator/MetaModelValidatorVisiting.java
@@ -19,14 +19,11 @@
 
 package org.apache.isis.metamodel.specloader.validator;
 
-import java.util.Collection;
-import java.util.List;
 import java.util.concurrent.atomic.LongAdder;
 
-import org.apache.isis.commons.internal.collections._Lists;
-import org.apache.isis.commons.internal.debug._Probe;
 import org.apache.isis.metamodel.MetaModelContext;
 import org.apache.isis.metamodel.spec.ObjectSpecification;
+import org.apache.isis.metamodel.specloader.SpecificationLoader;
 import org.apache.isis.metamodel.specloader.SpecificationLoaderDefault;
 
 import lombok.NonNull;
@@ -36,6 +33,8 @@ import lombok.val;
 @RequiredArgsConstructor(staticName = "of")
 public class MetaModelValidatorVisiting extends MetaModelValidatorAbstract {
 
+    // -- INTERFACES
+    
     @FunctionalInterface
     public interface Visitor {
         /**
@@ -48,8 +47,10 @@ public class MetaModelValidatorVisiting extends MetaModelValidatorAbstract {
         void summarize(MetaModelValidator validator);
     }
     
+    // -- IMPLEMENTATION
+    
     @NonNull private final Visitor visitor;
-
+    
     @Override
     public void collectFailuresInto(@NonNull ValidationFailures validationFailures) {
         validateAll();
@@ -58,11 +59,11 @@ public class MetaModelValidatorVisiting extends MetaModelValidatorAbstract {
         super.collectFailuresInto(validationFailures);
     }
 
-    private static _Probe probe = _Probe.unlimited().label("spec");
+//    private static _Probe probe = _Probe.unlimited().label("spec");
     
     private void validateAll() {
 
-        val specLoader = (SpecificationLoaderDefault)MetaModelContext.current().getSpecificationLoader();
+        val specLoader = (SpecificationLoaderDefault)super.getMetaModelContext().getSpecificationLoader();
         val ladd = new LongAdder();
         
         specLoader.forEach(spec->{
@@ -74,62 +75,62 @@ public class MetaModelValidatorVisiting extends MetaModelValidatorAbstract {
 
     }
     
-    //TODO[2158] cleanup legacy  
-    private void validateAllLegacy() {
-
-        val shouldRunConcurrent = getConfiguration().getReflector().getIntrospector().isParallelize();
-        val specsValidated = _Lists.<ObjectSpecification>newArrayList();
-        
-        while(validateSpecs(specsValidated)) {
-            // validate in a loop, because the act of validating might cause additional specs to be uncovered
-        }
-        
-        probe.println("specsToValidate " + specsValidated.size());
-
-    }
-
-    private boolean validateSpecs(List<ObjectSpecification> specsAlreadyValidated) {
-
-        val specLoader = MetaModelContext.current().getSpecificationLoader();
-        
-        // all currently known specs
-        // (previously we took a protective copy to avoid a concurrent modification exception,
-        // but this is now done by SpecificationLoader itself)
-        final Collection<ObjectSpecification> specsToValidate = 
-                specLoader.snapshotSpecifications();
-
-        // don't validate any specs already processed
-        specsToValidate.removeAll(specsAlreadyValidated);
-        
-        if(specsToValidate.isEmpty()) {
-            // don't call us again
-            return false;
-        }
-
-        
-        // validate anything new
-        
-        // add the new specs just validated to the list (for next time)
-        specsAlreadyValidated.addAll(specsToValidate);
-        
-        val isConcurrentFromConfig = getConfiguration().getReflector().getIntrospector().isParallelize();
-        val runSequential = !isConcurrentFromConfig;
-        if(runSequential) { 
-            
-            for (val spec : specsToValidate) {
-                if(!visitor.visit(spec, this)) {
-                    break;
-                }
-            }
-
-        } else {
-            specsToValidate.parallelStream()
-            .forEach(spec -> visitor.visit(spec, this));
-        }
-
-        // go round the loop again
-        return true;
-    }
+//    //TODO[2158] cleanup legacy  
+//    private void validateAllLegacy() {
+//
+//        val shouldRunConcurrent = getConfiguration().getReflector().getIntrospector().isParallelize();
+//        val specsValidated = _Lists.<ObjectSpecification>newArrayList();
+//        
+//        while(validateSpecs(specsValidated)) {
+//            // validate in a loop, because the act of validating might cause additional specs to be uncovered
+//        }
+//        
+//        probe.println("specsToValidate " + specsValidated.size());
+//
+//    }
+//
+//    private boolean validateSpecs(List<ObjectSpecification> specsAlreadyValidated) {
+//
+//        val specLoader = MetaModelContext.current().getSpecificationLoader();
+//        
+//        // all currently known specs
+//        // (previously we took a protective copy to avoid a concurrent modification exception,
+//        // but this is now done by SpecificationLoader itself)
+//        final Collection<ObjectSpecification> specsToValidate = 
+//                specLoader.snapshotSpecifications();
+//
+//        // don't validate any specs already processed
+//        specsToValidate.removeAll(specsAlreadyValidated);
+//        
+//        if(specsToValidate.isEmpty()) {
+//            // don't call us again
+//            return false;
+//        }
+//
+//        
+//        // validate anything new
+//        
+//        // add the new specs just validated to the list (for next time)
+//        specsAlreadyValidated.addAll(specsToValidate);
+//        
+//        val isConcurrentFromConfig = getConfiguration().getReflector().getIntrospector().isParallelize();
+//        val runSequential = !isConcurrentFromConfig;
+//        if(runSequential) { 
+//            
+//            for (val spec : specsToValidate) {
+//                if(!visitor.visit(spec, this)) {
+//                    break;
+//                }
+//            }
+//
+//        } else {
+//            specsToValidate.parallelStream()
+//            .forEach(spec -> visitor.visit(spec, this));
+//        }
+//
+//        // go round the loop again
+//        return true;
+//    }
 
     private void summarize() {
         if(visitor instanceof SummarizingVisitor) {
diff --git a/core/metamodel/src/main/java/org/apache/isis/metamodel/util/snapshot/XmlSnapshot.java b/core/metamodel/src/main/java/org/apache/isis/metamodel/util/snapshot/XmlSnapshot.java
index 5aea13d..bf50daa 100644
--- a/core/metamodel/src/main/java/org/apache/isis/metamodel/util/snapshot/XmlSnapshot.java
+++ b/core/metamodel/src/main/java/org/apache/isis/metamodel/util/snapshot/XmlSnapshot.java
@@ -50,7 +50,6 @@ import org.apache.isis.applib.services.xmlsnapshot.XmlSnapshotService.Snapshot;
 import org.apache.isis.applib.snapshot.SnapshottableWithInclusions;
 import org.apache.isis.commons.exceptions.IsisException;
 import org.apache.isis.commons.internal.collections._Maps;
-import org.apache.isis.metamodel.adapter.ObjectAdapter;
 import org.apache.isis.metamodel.consent.InteractionInitiatedBy;
 import org.apache.isis.metamodel.facetapi.FacetUtil;
 import org.apache.isis.metamodel.facets.collections.modify.CollectionFacet;
@@ -125,14 +124,14 @@ public class XmlSnapshot implements Snapshot {
      * Start a snapshot at the root object, using own namespace manager.
      *
      */
-    public XmlSnapshot(final ObjectAdapter rootAdapter) {
+    public XmlSnapshot(final ManagedObject rootAdapter) {
         this(rootAdapter, new XmlSchema());
     }
 
     /**
      * Start a snapshot at the root object, using supplied namespace manager.
      */
-    public XmlSnapshot(final ObjectAdapter rootAdapter, final XmlSchema schema) {
+    public XmlSnapshot(final ManagedObject rootAdapter, final XmlSchema schema) {
 
         if (log.isDebugEnabled()) {
             log.debug(".ctor({}{}{})", log("rootObj", rootAdapter), andlog("schema", schema),
@@ -178,7 +177,7 @@ public class XmlSnapshot implements Snapshot {
         return paths;
     }
 
-    private String andlog(final String label, final ObjectAdapter object) {
+    private String andlog(final String label, final ManagedObject object) {
         return ", " + log(label, object);
     }
 
@@ -196,7 +195,7 @@ public class XmlSnapshot implements Snapshot {
      * this is achieved simply by using appendXml passing in a new schemaManager -
      * see {@link XmlSnapshot}).
      */
-    private Place appendXml(final ObjectAdapter object) {
+    private Place appendXml(final ManagedObject object) {
 
         if (log.isDebugEnabled()) {
             log.debug("appendXml({})", log("obj", object));
@@ -546,7 +545,7 @@ public class XmlSnapshot implements Snapshot {
         // case.
     }
 
-    private String log(final String label, final ObjectAdapter adapter) {
+    private String log(final String label, final ManagedObject adapter) {
         return log(label, (adapter == null ? "(null)" : adapter.titleString() + "[" + oidAsString(adapter) + "]"));
     }
 
diff --git a/core/metamodel/src/test/java/org/apache/isis/metamodel/MetaModelContext_configTest.java b/core/metamodel/src/test/java/org/apache/isis/metamodel/MetaModelContext_configTest.java
index da1d311..2b97fc4 100644
--- a/core/metamodel/src/test/java/org/apache/isis/metamodel/MetaModelContext_configTest.java
+++ b/core/metamodel/src/test/java/org/apache/isis/metamodel/MetaModelContext_configTest.java
@@ -21,7 +21,6 @@ package org.apache.isis.metamodel;
 import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.Test;
 
-import org.apache.isis.commons.internal.context._Context;
 import org.apache.isis.config.IsisConfigurationLegacy;
 import org.apache.isis.config.internal._Config;
 
@@ -32,9 +31,12 @@ import lombok.val;
 
 class MetaModelContext_configTest {
 
+    private MetaModelContext mmc;
+    
     @BeforeEach
     void setUp() {
-        _Context.clear();
+        _Config.clear();
+        mmc = MetaModelContext_forTesting.buildDefault();
     }
 
     @Test
@@ -68,7 +70,7 @@ class MetaModelContext_configTest {
     // -- HELPER
 
     private IsisConfigurationLegacy config() {
-        return MetaModelContext.current().getConfigurationLegacy();
+        return mmc.getConfigurationLegacy();
     }
 
 }
diff --git a/core/metamodel/src/main/java/org/apache/isis/metamodel/MetaModelContext_forTesting.java b/core/metamodel/src/test/java/org/apache/isis/metamodel/MetaModelContext_forTesting.java
similarity index 66%
rename from core/metamodel/src/main/java/org/apache/isis/metamodel/MetaModelContext_forTesting.java
rename to core/metamodel/src/test/java/org/apache/isis/metamodel/MetaModelContext_forTesting.java
index 32ed533..d2a9da3 100644
--- a/core/metamodel/src/main/java/org/apache/isis/metamodel/MetaModelContext_forTesting.java
+++ b/core/metamodel/src/test/java/org/apache/isis/metamodel/MetaModelContext_forTesting.java
@@ -33,35 +33,51 @@ import org.apache.isis.applib.services.xactn.TransactionService;
 import org.apache.isis.applib.services.xactn.TransactionState;
 import org.apache.isis.commons.internal.base._NullSafe;
 import org.apache.isis.commons.internal.collections._Lists;
+import org.apache.isis.commons.internal.environment.IsisSystemEnvironment;
 import org.apache.isis.config.IsisConfiguration;
 import org.apache.isis.config.IsisConfigurationLegacy;
 import org.apache.isis.config.internal._Config;
 import org.apache.isis.metamodel.adapter.ObjectAdapter;
 import org.apache.isis.metamodel.adapter.ObjectAdapterProvider;
+import org.apache.isis.metamodel.progmodel.ProgrammingModel;
 import org.apache.isis.metamodel.services.events.MetamodelEventService;
 import org.apache.isis.metamodel.services.homepage.HomePageAction;
 import org.apache.isis.metamodel.spec.ObjectSpecification;
 import org.apache.isis.metamodel.specloader.SpecificationLoader;
+import org.apache.isis.metamodel.specloader.SpecificationLoaderDefault;
 import org.apache.isis.security.authentication.AuthenticationSession;
 import org.apache.isis.security.authentication.AuthenticationSessionProvider;
 import org.apache.isis.security.authentication.manager.AuthenticationManager;
 import org.apache.isis.security.authorization.manager.AuthorizationManager;
 
+import static java.util.Objects.requireNonNull;
+
 import lombok.Builder;
 import lombok.Getter;
 import lombok.Singular;
 import lombok.val;
 
 @Builder @Getter
-final class MetaModelContext_forTesting implements MetaModelContext {
+public final class MetaModelContext_forTesting implements MetaModelContext {
+    
+//    public static MetaModelContext current() {
+//        return _Context.getElseFail(MetaModelContext.class);
+//    }
+    
+    public static MetaModelContext buildDefault() {
+        return MetaModelContext_forTesting.builder()
+        .build();
+    }
+    
+//    public static void preset(MetaModelContext primed) {
+//        _Context.clear();
+//        _Context.putSingleton(MetaModelContext.class, primed);
+//    }
 
     private ObjectAdapterProvider objectAdapterProvider;
 
-    @Builder.Default
-    private ServiceInjector serviceInjector = new ServiceInjector_forTesting();
-
-    @Builder.Default
-    private ServiceRegistry serviceRegistry = new ServiceRegistry_forTesting();
+    private ServiceInjector serviceInjector;
+    private ServiceRegistry serviceRegistry; 
 
     @Builder.Default
     private MetamodelEventService metamodelEventService = 
@@ -69,9 +85,14 @@ final class MetaModelContext_forTesting implements MetaModelContext {
     .build();
     
     @Builder.Default
-    private IsisConfiguration configuration = newIsisConfiguration(); // just config defaults
+    private IsisSystemEnvironment systemEnvironment = newIsisSystemEnvironment();
+    
+    @Builder.Default
+    private IsisConfiguration configuration = newIsisConfiguration();
 
     private SpecificationLoader specificationLoader;
+    
+    private ProgrammingModel programmingModel;
 
     private AuthenticationSessionProvider authenticationSessionProvider;
 
@@ -124,13 +145,21 @@ final class MetaModelContext_forTesting implements MetaModelContext {
         }
         return serviceAdaptersById.get(serviceId);
     }
+    
+    // -- LOOKUP
 
+    @Override
+    public <T> T getSingletonElseFail(Class<T> type) {
+        return getSystemEnvironment().ioc().getSingletonElseFail(type);
+    }
+    
     public Stream<Object> streamSingletons() {
 
         val fields = _Lists.of(
                 getConfigurationLegacy(),
                 getConfiguration(),
                 objectAdapterProvider,
+                systemEnvironment,
                 serviceInjector,
                 serviceRegistry,
                 metamodelEventService,
@@ -143,12 +172,21 @@ final class MetaModelContext_forTesting implements MetaModelContext {
                 titleService,
                 repositoryService,
                 transactionService,
-                transactionState);
+                transactionState,
+                this);
 
         return Stream.concat(fields.stream(), getSingletons().stream())
                 .filter(_NullSafe::isPresent);
     }
     
+    
+    
+    private static IsisSystemEnvironment newIsisSystemEnvironment() {
+        val env = new IsisSystemEnvironment();
+        env.setUnitTesting(true);
+        return env;
+    }
+    
     private static IsisConfiguration newIsisConfiguration() {
         val config = new IsisConfiguration();
         config.setEnvironment(new AbstractEnvironment() {
@@ -160,4 +198,42 @@ final class MetaModelContext_forTesting implements MetaModelContext {
         return config;
     }
 
+    @Override
+    public ServiceRegistry getServiceRegistry() {
+        if(serviceRegistry==null) {
+            serviceRegistry = new ServiceRegistry_forTesting((MetaModelContext)this);
+        }
+        return serviceRegistry;
+    }
+    
+    @Override
+    public ServiceInjector getServiceInjector() {
+        if(serviceInjector==null) {
+            serviceInjector = new ServiceInjector_forTesting((MetaModelContext)this);
+        }
+        return serviceInjector;
+    }
+    
+    @Override
+    public SpecificationLoader getSpecificationLoader() {
+        if(specificationLoader==null) {
+            
+            val configuration = requireNonNull(getConfiguration());
+            val environment = requireNonNull(getSystemEnvironment());
+            val serviceRegistry = requireNonNull(getServiceRegistry());
+            val serviceInjector = requireNonNull(getServiceInjector());
+            val programmingModel = requireNonNull(getProgrammingModel());
+
+            specificationLoader = SpecificationLoaderDefault.getInstance(
+                    configuration, 
+                    environment, 
+                    serviceRegistry, 
+                    serviceInjector, 
+                    programmingModel);
+            
+        }
+        return specificationLoader;
+    }
+
+
 }
\ No newline at end of file
diff --git a/core/metamodel/src/main/java/org/apache/isis/metamodel/ServiceInjector_forTesting.java b/core/metamodel/src/test/java/org/apache/isis/metamodel/ServiceInjector_forTesting.java
similarity index 92%
rename from core/metamodel/src/main/java/org/apache/isis/metamodel/ServiceInjector_forTesting.java
rename to core/metamodel/src/test/java/org/apache/isis/metamodel/ServiceInjector_forTesting.java
index 9e8bcab..b40cc70 100644
--- a/core/metamodel/src/main/java/org/apache/isis/metamodel/ServiceInjector_forTesting.java
+++ b/core/metamodel/src/test/java/org/apache/isis/metamodel/ServiceInjector_forTesting.java
@@ -28,10 +28,15 @@ import org.apache.isis.metamodel.specloader.InjectorMethodEvaluatorDefault;
 
 import static java.util.Objects.requireNonNull;
 
+import lombok.NonNull;
+import lombok.RequiredArgsConstructor;
 import lombok.val;
 
+@RequiredArgsConstructor
 class ServiceInjector_forTesting implements ServiceInjector {
 
+    @NonNull private final MetaModelContext metaModelContext;
+    
     private ServiceInjector delegate;
 
     @Override
@@ -40,7 +45,7 @@ class ServiceInjector_forTesting implements ServiceInjector {
         if(delegate==null) {
 
             // lookup the MetaModelContextBean's list of singletons
-            val mmc = MetaModelContext.current();
+            val mmc = metaModelContext;
             if(!(mmc instanceof MetaModelContext_forTesting)) {
                 return null;
             }
diff --git a/core/metamodel/src/main/java/org/apache/isis/metamodel/ServiceRegistry_forTesting.java b/core/metamodel/src/test/java/org/apache/isis/metamodel/ServiceRegistry_forTesting.java
similarity index 87%
rename from core/metamodel/src/main/java/org/apache/isis/metamodel/ServiceRegistry_forTesting.java
rename to core/metamodel/src/test/java/org/apache/isis/metamodel/ServiceRegistry_forTesting.java
index efc729e..d2c90d0 100644
--- a/core/metamodel/src/main/java/org/apache/isis/metamodel/ServiceRegistry_forTesting.java
+++ b/core/metamodel/src/test/java/org/apache/isis/metamodel/ServiceRegistry_forTesting.java
@@ -30,28 +30,39 @@ import org.apache.isis.commons.internal.base._NullSafe;
 import org.apache.isis.commons.internal.collections._Sets;
 import org.apache.isis.commons.internal.context._Context;
 import org.apache.isis.commons.internal.exceptions._Exceptions;
+import org.apache.isis.commons.internal.ioc.IocContainer;
 import org.apache.isis.commons.internal.ioc.ManagedBeanAdapter;
 import org.apache.isis.commons.internal.ioc.spring._Spring;
 import org.apache.isis.config.registry.IsisBeanTypeRegistry;
 
 import lombok.Builder;
+import lombok.Getter;
+import lombok.NonNull;
+import lombok.RequiredArgsConstructor;
+import lombok.Setter;
 import lombok.Value;
 import lombok.val;
 
+@RequiredArgsConstructor
 class ServiceRegistry_forTesting implements ServiceRegistry {
 
+    @NonNull private final MetaModelContext metaModelContext; 
+    
+    @Getter @Setter private IocContainer iocContainer;
     private final Set<ManagedBeanAdapter> registeredBeans = _Sets.newHashSet();
 
     @Override
     public <T> Bin<T> select(Class<T> type, Annotation[] qualifiers) {
 
-        if(_Spring.isContextAvailable()) {
-            return ServiceRegistry.super.select(type, qualifiers);
+        if(iocContainer!=null) {
+            return iocContainer
+                    .select(type, _Spring.filterQualifiers(qualifiers));
         }
 
-        if(qualifiers!=null && qualifiers.length>0) {
-            throw _Exceptions.notImplemented();
-        }
+// ignore        
+//        if(qualifiers!=null && qualifiers.length>0) {
+//            throw _Exceptions.notImplemented();
+//        }
 
         Optional<T> match = streamSingletons()
                 .filter(singleton->type.isAssignableFrom(singleton.getClass()))
@@ -102,7 +113,7 @@ class ServiceRegistry_forTesting implements ServiceRegistry {
 
     private Stream<Object> streamSingletons() {
         // lookup the MetaModelContextBean's list of singletons
-        val mmc = MetaModelContext.current();
+        val mmc = metaModelContext;
         if(mmc instanceof MetaModelContext_forTesting) {
             val mmcb = (MetaModelContext_forTesting) mmc;
             return mmcb.streamSingletons();
diff --git a/core/metamodel/src/test/java/org/apache/isis/metamodel/facets/AbstractFacetFactoryJUnit4TestCase.java b/core/metamodel/src/test/java/org/apache/isis/metamodel/facets/AbstractFacetFactoryJUnit4TestCase.java
index 9ef2513..174ed35 100644
--- a/core/metamodel/src/test/java/org/apache/isis/metamodel/facets/AbstractFacetFactoryJUnit4TestCase.java
+++ b/core/metamodel/src/test/java/org/apache/isis/metamodel/facets/AbstractFacetFactoryJUnit4TestCase.java
@@ -34,6 +34,8 @@ 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.metamodel.MetaModelContext;
+import org.apache.isis.metamodel.MetaModelContextAware;
+import org.apache.isis.metamodel.MetaModelContext_forTesting;
 import org.apache.isis.metamodel.adapter.ObjectAdapterProvider;
 import org.apache.isis.metamodel.facetapi.FacetHolder;
 import org.apache.isis.metamodel.facetapi.FeatureType;
@@ -56,35 +58,26 @@ public abstract class AbstractFacetFactoryJUnit4TestCase {
     @Rule
     public JUnitRuleMockery2 context = JUnitRuleMockery2.createFor(Mode.INTERFACES_AND_CLASSES);
 
-    @Mock
-    protected SpecificationLoader mockSpecificationLoader;
-    @Mock
-    protected PersistenceSessionServiceInternal mockPersistenceSessionServiceInternal;
-    @Mock
-    protected MethodRemover mockMethodRemover;
-    @Mock
-    protected FacetHolder mockFacetHolder;
-    @Mock
-    protected ServiceInjector mockServiceInjector;
-    @Mock
-    protected ServiceRegistry mockServiceRegistry;
-    @Mock
-    protected TranslationService mockTranslationService;
-    @Mock   
-    protected AuthenticationSessionProvider mockAuthenticationSessionProvider;
-
+    @Mock protected SpecificationLoader mockSpecificationLoader;
+    @Mock protected PersistenceSessionServiceInternal mockPersistenceSessionServiceInternal;
+    @Mock protected MethodRemover mockMethodRemover;
+    @Mock protected FacetHolder mockFacetHolder;
+    @Mock protected ServiceInjector mockServiceInjector;
+    @Mock protected ServiceRegistry mockServiceRegistry;
+    @Mock protected TranslationService mockTranslationService;
+    @Mock protected AuthenticationSessionProvider mockAuthenticationSessionProvider;
+
+    @Mock protected ObjectSpecification mockOnType;
+    @Mock protected ObjectSpecification mockObjSpec;
+    @Mock protected OneToOneAssociation mockOneToOneAssociation;
+    @Mock protected OneToManyAssociation mockOneToManyAssociation;
+    @Mock protected OneToOneActionParameter mockOneToOneActionParameter;
+    @Mock protected ObjectAdapterProvider mockObjectAdapterProvider;
+    @Mock protected MetamodelEventService mockMetamodelEventService;
+
+    
+    protected MetaModelContext metaModelContext;
     protected IdentifiedHolder facetHolder;
-
-    @Mock    protected ObjectSpecification mockOnType;
-    @Mock    protected ObjectSpecification mockObjSpec;
-    @Mock    protected OneToOneAssociation mockOneToOneAssociation;
-    @Mock    protected OneToManyAssociation mockOneToManyAssociation;
-    @Mock    protected OneToOneActionParameter mockOneToOneActionParameter;
-    //    @Mock    protected EventBusService mockEventBusService;
-    @Mock    protected ObjectAdapterProvider mockObjectAdapterProvider;
-
-    @Mock    protected MetamodelEventService mockMetamodelEventService;
-
     protected FacetedMethod facetedMethod;
     protected FacetedMethodParameter facetedMethodParameter;
 
@@ -105,12 +98,11 @@ public abstract class AbstractFacetFactoryJUnit4TestCase {
     public void setUpFacetedMethodAndParameter() throws Exception {
 
         // PRODUCTION
-
-        MetaModelContext.preset(MetaModelContext.builder()
-                .specificationLoader(mockSpecificationLoader)
-                .serviceInjector(mockServiceInjector)
-                .serviceRegistry(mockServiceRegistry)
-                .build());
+        metaModelContext = MetaModelContext_forTesting.builder()
+                        .specificationLoader(mockSpecificationLoader)
+                        .serviceInjector(mockServiceInjector)
+                        .serviceRegistry(mockServiceRegistry)
+                        .build();
 
         context.checking(new Expectations() {{
 
@@ -131,6 +123,11 @@ public abstract class AbstractFacetFactoryJUnit4TestCase {
         facetHolder = new AbstractFacetFactoryTest.IdentifiedHolderImpl(Identifier.propertyOrCollectionIdentifier(Customer.class, "firstName"));
         facetedMethod = FacetedMethod.createForProperty(AbstractFacetFactoryTest.Customer.class, "firstName");
         facetedMethodParameter = new FacetedMethodParameter(FeatureType.ACTION_PARAMETER_SCALAR, facetedMethod.getOwningType(), facetedMethod.getMethod(), String.class);
+        
+        ((MetaModelContextAware)facetHolder).setMetaModelContext(metaModelContext);
+        facetedMethod.setMetaModelContext(metaModelContext);
+        facetedMethodParameter.setMetaModelContext(metaModelContext);
+        
     }
 
     @After
diff --git a/core/metamodel/src/test/java/org/apache/isis/metamodel/facets/AbstractFacetFactoryTest.java b/core/metamodel/src/test/java/org/apache/isis/metamodel/facets/AbstractFacetFactoryTest.java
index f715811..1ffa85e 100644
--- a/core/metamodel/src/test/java/org/apache/isis/metamodel/facets/AbstractFacetFactoryTest.java
+++ b/core/metamodel/src/test/java/org/apache/isis/metamodel/facets/AbstractFacetFactoryTest.java
@@ -27,8 +27,8 @@ import org.junit.Rule;
 
 import org.apache.isis.applib.Identifier;
 import org.apache.isis.applib.services.i18n.TranslationService;
-import org.apache.isis.config.IsisConfiguration;
-import org.apache.isis.metamodel.MetaModelContext;
+import org.apache.isis.metamodel.MetaModelContextAware;
+import org.apache.isis.metamodel.MetaModelContext_forTesting;
 import org.apache.isis.metamodel.adapter.ObjectAdapterProvider;
 import org.apache.isis.metamodel.facetapi.FacetHolder;
 import org.apache.isis.metamodel.facetapi.FacetHolderImpl;
@@ -74,6 +74,7 @@ public abstract class AbstractFacetFactoryTest extends TestCase {
     protected FacetHolder facetHolder;
     protected FacetedMethod facetedMethod;
     protected FacetedMethodParameter facetedMethodParameter;
+    protected MetaModelContext_forTesting metaModelContext;
 
     public static class IdentifiedHolderImpl extends FacetHolderImpl implements IdentifiedHolder {
 
@@ -115,18 +116,22 @@ public abstract class AbstractFacetFactoryTest extends TestCase {
 
         mockObjectAdapterProvider = context.mock(ObjectAdapterProvider.class);
 
-        MetaModelContext.preset(MetaModelContext.builder()
+        metaModelContext = MetaModelContext_forTesting.builder()
                 .specificationLoader(mockSpecificationLoader)
                 .translationService(mockTranslationService)
                 .objectAdapterProvider(mockPersistenceSessionServiceInternal)
                 .authenticationSessionProvider(mockAuthenticationSessionProvider)
-                .build());
+                .build();
 
         context.checking(new Expectations() {{
 
             allowing(mockAuthenticationSessionProvider).getAuthenticationSession();
             will(returnValue(mockAuthenticationSession));
         }});
+        
+        ((MetaModelContextAware)facetHolder).setMetaModelContext(metaModelContext);
+        facetedMethod.setMetaModelContext(metaModelContext);
+        facetedMethodParameter.setMetaModelContext(metaModelContext);
     }
 
 
diff --git a/core/metamodel/src/test/java/org/apache/isis/metamodel/facets/actions/ActionMethodsFacetFactoryTest.java b/core/metamodel/src/test/java/org/apache/isis/metamodel/facets/actions/ActionMethodsFacetFactoryTest.java
index 2d329b3..a6dd0bd 100644
--- a/core/metamodel/src/test/java/org/apache/isis/metamodel/facets/actions/ActionMethodsFacetFactoryTest.java
+++ b/core/metamodel/src/test/java/org/apache/isis/metamodel/facets/actions/ActionMethodsFacetFactoryTest.java
@@ -61,6 +61,8 @@ import org.apache.isis.metamodel.testspec.ObjectSpecificationStub;
 import org.apache.isis.security.authentication.AuthenticationSession;
 import org.apache.isis.unittestsupport.jmocking.JUnitRuleMockery2;
 
+import lombok.val;
+
 public class ActionMethodsFacetFactoryTest extends AbstractFacetFactoryTest {
 
     private JUnitRuleMockery2 context = JUnitRuleMockery2.createFor(JUnitRuleMockery2.Mode.INTERFACES_AND_CLASSES);
@@ -128,7 +130,8 @@ public class ActionMethodsFacetFactoryTest extends AbstractFacetFactoryTest {
 
 
     public void testInstallsValidateMethodNoArgsFacetAndRemovesMethod() {
-        final ActionValidationFacetViaMethodFactory facetFactory = new ActionValidationFacetViaMethodFactory();
+        val facetFactory = new ActionValidationFacetViaMethodFactory();
+        facetFactory.setMetaModelContext(super.metaModelContext);
 
         // mockSpecificationLoader.setLoadSpecificationStringReturn(voidSpec);
         allowing_specificationLoader_loadSpecification_any_willReturn(this.voidSpec);
@@ -158,7 +161,8 @@ public class ActionMethodsFacetFactoryTest extends AbstractFacetFactoryTest {
     }
 
     public void testInstallsValidateMethodSomeArgsFacetAndRemovesMethod() {
-        final ActionValidationFacetViaMethodFactory facetFactory = new ActionValidationFacetViaMethodFactory();
+        val facetFactory = new ActionValidationFacetViaMethodFactory();
+        facetFactory.setMetaModelContext(super.metaModelContext);
 
         // mockSpecificationLoader.setLoadSpecificationStringReturn(voidSpec);
         allowing_specificationLoader_loadSpecification_any_willReturn(this.voidSpec);
@@ -188,7 +192,8 @@ public class ActionMethodsFacetFactoryTest extends AbstractFacetFactoryTest {
     }
 
     public void testInstallsParameterDefaultsMethodNoArgsFacetAndRemovesMethod() {
-        final ActionDefaultsFacetViaMethodFactory facetFactory = new ActionDefaultsFacetViaMethodFactory();
+        val facetFactory = new ActionDefaultsFacetViaMethodFactory();
+        facetFactory.setMetaModelContext(super.metaModelContext);
 
         // mockSpecificationLoader.setLoadSpecificationStringReturn(voidSpec);
         allowing_specificationLoader_loadSpecification_any_willReturn(this.voidSpec);
@@ -218,7 +223,8 @@ public class ActionMethodsFacetFactoryTest extends AbstractFacetFactoryTest {
     }
 
     public void testInstallsParameterDefaultsMethodSomeArgsIsIgnored() {
-        final ActionDefaultsFacetViaMethodFactory facetFactory = new ActionDefaultsFacetViaMethodFactory();
+        val facetFactory = new ActionDefaultsFacetViaMethodFactory();
+        facetFactory.setMetaModelContext(super.metaModelContext);
 
         // mockSpecificationLoader.setLoadSpecificationStringReturn(voidSpec);
         allowing_specificationLoader_loadSpecification_any_willReturn(this.voidSpec);
@@ -242,7 +248,8 @@ public class ActionMethodsFacetFactoryTest extends AbstractFacetFactoryTest {
     }
 
     public void testInstallsParameterChoicesMethodNoArgsFacetAndRemovesMethod() {
-        final ActionChoicesFacetViaMethodFactory facetFactory = new ActionChoicesFacetViaMethodFactory();
+        val facetFactory = new ActionChoicesFacetViaMethodFactory();
+        facetFactory.setMetaModelContext(super.metaModelContext);
 
         class Customer {
             @SuppressWarnings("unused")
@@ -271,7 +278,8 @@ public class ActionMethodsFacetFactoryTest extends AbstractFacetFactoryTest {
     }
 
     public void testInstallsParameterChoicesMethodSomeArgsIsIgnored() {
-        final ActionChoicesFacetViaMethodFactory facetFactory = new ActionChoicesFacetViaMethodFactory();
+        val facetFactory = new ActionChoicesFacetViaMethodFactory();
+        facetFactory.setMetaModelContext(super.metaModelContext);
 
         // mockSpecificationLoader.setLoadSpecificationStringReturn(voidSpec);
         allowing_specificationLoader_loadSpecification_any_willReturn(this.voidSpec);
@@ -337,7 +345,8 @@ public class ActionMethodsFacetFactoryTest extends AbstractFacetFactoryTest {
 
     public void testInstallsHiddenForSessionFacetAndRemovesMethod() {
 
-        final HideForSessionFacetViaMethodFactory facetFactory = new HideForSessionFacetViaMethodFactory();
+        val facetFactory = new HideForSessionFacetViaMethodFactory();
+        facetFactory.setMetaModelContext(super.metaModelContext);
 
         // mockSpecificationLoader.setLoadSpecificationStringReturn(voidSpec);
         allowing_specificationLoader_loadSpecification_any_willReturn(this.voidSpec);
@@ -357,7 +366,8 @@ public class ActionMethodsFacetFactoryTest extends AbstractFacetFactoryTest {
     }
 
     public void testInstallsDisabledForSessionFacetAndRemovesMethod() {
-        final DisableForSessionFacetViaMethodFactory facetFactory = new DisableForSessionFacetViaMethodFactory();
+        val facetFactory = new DisableForSessionFacetViaMethodFactory();
+        facetFactory.setMetaModelContext(super.metaModelContext);
 
         allowing_specificationLoader_loadSpecification_any_willReturn(this.voidSpec);
 
@@ -376,7 +386,8 @@ public class ActionMethodsFacetFactoryTest extends AbstractFacetFactoryTest {
     }
 
     public void testInstallsParameterDefaultsMethodAndRemovesMethod() {
-        final ActionParameterDefaultsFacetViaMethodFactory facetFactory = new ActionParameterDefaultsFacetViaMethodFactory();
+        val facetFactory = new ActionParameterDefaultsFacetViaMethodFactory();
+        facetFactory.setMetaModelContext(super.metaModelContext);
 
         allowing_specificationLoader_loadSpecification_any_willReturn(this.voidSpec);
 
@@ -423,7 +434,8 @@ public class ActionMethodsFacetFactoryTest extends AbstractFacetFactoryTest {
     }
 
     public void testInstallsParameterChoicesMethodAndRemovesMethod() {
-        final ActionParameterChoicesFacetViaMethodFactory facetFactory = new ActionParameterChoicesFacetViaMethodFactory();
+        val facetFactory = new ActionParameterChoicesFacetViaMethodFactory();
+        facetFactory.setMetaModelContext(super.metaModelContext);
 
         // mockSpecificationLoader.setLoadSpecificationStringReturn(voidSpec);
         allowing_specificationLoader_loadSpecification_any_willReturn(this.voidSpec);
@@ -486,7 +498,8 @@ public class ActionMethodsFacetFactoryTest extends AbstractFacetFactoryTest {
     }
 
     public void testInstallsParameterAutoCompleteMethodAndRemovesMethod() {
-        final ActionParameterAutoCompleteFacetViaMethodFactory facetFactory = new ActionParameterAutoCompleteFacetViaMethodFactory();
+        val facetFactory = new ActionParameterAutoCompleteFacetViaMethodFactory();
+        facetFactory.setMetaModelContext(super.metaModelContext);
 
         // mockSpecificationLoader.setLoadSpecificationStringReturn(voidSpec);
         allowing_specificationLoader_loadSpecification_any_willReturn(this.voidSpec);
@@ -520,7 +533,8 @@ public class ActionMethodsFacetFactoryTest extends AbstractFacetFactoryTest {
 
     public void testBothChoicesMethodCausesException() {
 
-        final ActionChoicesFacetViaMethodFactory facetFactory = new ActionChoicesFacetViaMethodFactory();
+        val facetFactory = new ActionChoicesFacetViaMethodFactory();
+        facetFactory.setMetaModelContext(super.metaModelContext);
 
         //        mockSpecificationLoader.setLoadSpecificationStringReturn(voidSpec);
         allowing_specificationLoader_loadSpecification_any_willReturn(this.voidSpec);
@@ -564,7 +578,8 @@ public class ActionMethodsFacetFactoryTest extends AbstractFacetFactoryTest {
     }
 
     public void testBothDefaultMethodCausesException() {
-        final ActionDefaultsFacetViaMethodFactory facetFactory = new ActionDefaultsFacetViaMethodFactory();
+        val facetFactory = new ActionDefaultsFacetViaMethodFactory();
+        facetFactory.setMetaModelContext(super.metaModelContext);
 
         // mockSpecificationLoader.setLoadSpecificationStringReturn(voidSpec);
         allowing_specificationLoader_loadSpecification_any_willReturn(this.voidSpec);
diff --git a/core/metamodel/src/test/java/org/apache/isis/metamodel/facets/actions/action/ActionAnnotationFacetFactoryTest.java b/core/metamodel/src/test/java/org/apache/isis/metamodel/facets/actions/action/ActionAnnotationFacetFactoryTest.java
index 8720701..22809e7 100644
--- a/core/metamodel/src/test/java/org/apache/isis/metamodel/facets/actions/action/ActionAnnotationFacetFactoryTest.java
+++ b/core/metamodel/src/test/java/org/apache/isis/metamodel/facets/actions/action/ActionAnnotationFacetFactoryTest.java
@@ -28,8 +28,6 @@ import org.junit.After;
 import org.junit.Before;
 
 import org.apache.isis.applib.services.HasUniqueId;
-import org.apache.isis.config.IsisConfiguration;
-import org.apache.isis.metamodel.MetaModelContext;
 import org.apache.isis.metamodel.facets.AbstractFacetFactoryJUnit4TestCase;
 import org.apache.isis.metamodel.facets.actions.action.command.CommandActionsConfiguration;
 import org.apache.isis.metamodel.facets.actions.action.publishing.PublishActionsConfiguration;
@@ -69,6 +67,7 @@ public class ActionAnnotationFacetFactoryTest extends AbstractFacetFactoryJUnit4
         // PRODUCTION
 
         facetFactory = new ActionAnnotationFacetFactory();
+        facetFactory.setMetaModelContext(super.metaModelContext);
 
         context.checking(new Expectations() {{
             allowing(mockServiceRegistry).lookupServiceElseFail(AuthenticationSessionProvider.class);
@@ -80,6 +79,7 @@ public class ActionAnnotationFacetFactoryTest extends AbstractFacetFactoryJUnit4
         }});
 
         actionMethod = findMethod(Customer.class, "someAction");
+        
     }
 
     @Override
@@ -106,21 +106,13 @@ public class ActionAnnotationFacetFactoryTest extends AbstractFacetFactoryJUnit4
     }
 
     void allowingCommandConfigurationToReturn(CommandActionsConfiguration value) {
-        val config = new IsisConfiguration();
+        val config = metaModelContext.getConfiguration();
         config.getServices().getCommand().setActions(value);
-        
-        MetaModelContext.preset(MetaModelContext.builder()
-                .configuration(config)
-                .build());
     }
 
     void allowingPublishingConfigurationToReturn(PublishActionsConfiguration value) {
-        val config = new IsisConfiguration();
+        val config = metaModelContext.getConfiguration();
         config.getServices().getPublish().setActions(value);
-        
-        MetaModelContext.preset(MetaModelContext.builder()
-                .configuration(config)
-                .build());
     }
 
 }
diff --git a/core/metamodel/src/test/java/org/apache/isis/metamodel/facets/actions/action/ActionAnnotationFacetFactoryTest_ActionInvocation.java b/core/metamodel/src/test/java/org/apache/isis/metamodel/facets/actions/action/ActionAnnotationFacetFactoryTest_ActionInvocation.java
index 17a6f49..d807bd6 100644
--- a/core/metamodel/src/test/java/org/apache/isis/metamodel/facets/actions/action/ActionAnnotationFacetFactoryTest_ActionInvocation.java
+++ b/core/metamodel/src/test/java/org/apache/isis/metamodel/facets/actions/action/ActionAnnotationFacetFactoryTest_ActionInvocation.java
@@ -22,6 +22,7 @@ package org.apache.isis.metamodel.facets.actions.action;
 import java.lang.reflect.Method;
 
 import org.apache.isis.applib.annotation.Action;
+import org.apache.isis.metamodel.MetaModelContext_forTesting;
 import org.apache.isis.metamodel.facetapi.Facet;
 import org.apache.isis.metamodel.facets.AbstractFacetFactoryTest;
 import org.apache.isis.metamodel.facets.FacetFactory.ProcessMethodContext;
@@ -48,6 +49,7 @@ public class ActionAnnotationFacetFactoryTest_ActionInvocation extends AbstractF
 
     private void processInvocation(
             ActionAnnotationFacetFactory facetFactory, ProcessMethodContext processMethodContext) {
+
         val actionIfAny = processMethodContext.synthesizeOnMethod(Action.class);
         facetFactory.processInvocation(processMethodContext, actionIfAny);
     }
@@ -56,6 +58,7 @@ public class ActionAnnotationFacetFactoryTest_ActionInvocation extends AbstractF
     public void setUp() throws Exception {
         super.setUp();
         this.facetFactory =  new ActionAnnotationFacetFactory();
+        facetFactory.setMetaModelContext(super.metaModelContext);
     }
 
     public void testActionInvocationFacetIsInstalledAndMethodRemoved() {
@@ -152,7 +155,8 @@ public class ActionAnnotationFacetFactoryTest_ActionInvocation extends AbstractF
         final Method actionMethod = findMethod(CustomerEx.class, "someAction", new Class[] { int.class, long.class });
 
         final FacetedMethod facetHolderWithParms = FacetedMethod.createForAction(CustomerEx.class, actionMethod);
-
+        facetHolderWithParms.setMetaModelContext(super.metaModelContext);
+        
         processInvocation(facetFactory, new ProcessMethodContext(CustomerEx.class, null, actionMethod, methodRemover, facetHolderWithParms));
 
         final Facet facet0 = facetHolderWithParms.getFacet(ActionInvocationFacet.class);
@@ -163,9 +167,12 @@ public class ActionAnnotationFacetFactoryTest_ActionInvocation extends AbstractF
 
         allowing_specificationLoader_loadSpecification_any_willReturn(voidSpec);
 
-        final ActionParameterChoicesFacetViaMethodFactory facetFactoryForChoices = new ActionParameterChoicesFacetViaMethodFactory();
-        final DisableForContextFacetViaMethodFactory facetFactoryForDisable = new DisableForContextFacetViaMethodFactory();
-
+        val facetFactoryForChoices = new ActionParameterChoicesFacetViaMethodFactory();
+        val facetFactoryForDisable = new DisableForContextFacetViaMethodFactory();
+        facetFactoryForChoices.setMetaModelContext(metaModelContext);
+        facetFactoryForDisable.setMetaModelContext(metaModelContext);
+        
+        
         class Customer {
             @SuppressWarnings("unused")
             public void someAction(final int x, final long y) {
@@ -200,6 +207,7 @@ public class ActionAnnotationFacetFactoryTest_ActionInvocation extends AbstractF
         final Method disableMethod = findMethod(CustomerEx.class, "disableSomeAction", new Class[] { int.class, long.class });
 
         final FacetedMethod facetHolderWithParms = FacetedMethod.createForAction(CustomerEx.class, actionMethod);
+        facetHolderWithParms.setMetaModelContext(metaModelContext);
 
         final ProcessMethodContext processMethodContext = new ProcessMethodContext(CustomerEx.class, null, actionMethod, methodRemover, facetHolderWithParms);
         processInvocation(facetFactory, processMethodContext);
diff --git a/core/metamodel/src/test/java/org/apache/isis/metamodel/facets/actions/action/ActionAnnotationFacetFactoryTest_Hidden.java b/core/metamodel/src/test/java/org/apache/isis/metamodel/facets/actions/action/ActionAnnotationFacetFactoryTest_Hidden.java
index b1b4e50..733caef 100644
--- a/core/metamodel/src/test/java/org/apache/isis/metamodel/facets/actions/action/ActionAnnotationFacetFactoryTest_Hidden.java
+++ b/core/metamodel/src/test/java/org/apache/isis/metamodel/facets/actions/action/ActionAnnotationFacetFactoryTest_Hidden.java
@@ -23,7 +23,6 @@ import org.junit.Test;
 
 import org.apache.isis.applib.annotation.Action;
 import org.apache.isis.applib.annotation.Where;
-import org.apache.isis.metamodel.facetapi.Facet;
 import org.apache.isis.metamodel.facets.FacetFactory.ProcessMethodContext;
 import org.apache.isis.metamodel.facets.actions.action.hidden.HiddenFacetForActionAnnotation;
 import org.apache.isis.metamodel.facets.all.hide.HiddenFacet;
@@ -37,6 +36,7 @@ public class ActionAnnotationFacetFactoryTest_Hidden extends ActionAnnotationFac
 
     private void processHidden(
             ActionAnnotationFacetFactory facetFactory, ProcessMethodContext processMethodContext) {
+        
         val actionIfAny = processMethodContext.synthesizeOnMethod(Action.class);
         facetFactory.processHidden(processMethodContext, actionIfAny);
     }
@@ -51,20 +51,20 @@ public class ActionAnnotationFacetFactoryTest_Hidden extends ActionAnnotationFac
         }
 
         // given
-        final Class<?> cls = Customer.class;
+        val cls = Customer.class;
         actionMethod = findMethod(cls, "someAction");
 
         // when
-        final ProcessMethodContext processMethodContext = new ProcessMethodContext(
+        val processMethodContext = new ProcessMethodContext(
                 cls, null, actionMethod, mockMethodRemover, facetedMethod);
         processHidden(facetFactory, processMethodContext);
 
         // then
-        final HiddenFacet hiddenFacet = facetedMethod.getFacet(HiddenFacet.class);
+        val hiddenFacet = facetedMethod.getFacet(HiddenFacet.class);
         Assert.assertNotNull(hiddenFacet);
         assertThat(hiddenFacet.where(), is(Where.REFERENCES_PARENT));
 
-        final Facet hiddenFacetImpl = facetedMethod.getFacet(HiddenFacetForActionAnnotation.class);
+        val hiddenFacetImpl = facetedMethod.getFacet(HiddenFacetForActionAnnotation.class);
         Assert.assertNotNull(hiddenFacetImpl);
         Assert.assertTrue(hiddenFacet == hiddenFacetImpl);
     }
diff --git a/core/metamodel/src/test/java/org/apache/isis/metamodel/facets/actions/action/ActionAnnotationFacetFactoryTest_Invocation.java b/core/metamodel/src/test/java/org/apache/isis/metamodel/facets/actions/action/ActionAnnotationFacetFactoryTest_Invocation.java
index 85e0f40..c443754 100644
--- a/core/metamodel/src/test/java/org/apache/isis/metamodel/facets/actions/action/ActionAnnotationFacetFactoryTest_Invocation.java
+++ b/core/metamodel/src/test/java/org/apache/isis/metamodel/facets/actions/action/ActionAnnotationFacetFactoryTest_Invocation.java
@@ -66,8 +66,9 @@ public class ActionAnnotationFacetFactoryTest_Invocation extends ActionAnnotatio
         // expect
         allowingLoadSpecificationRequestsFor(cls, actionMethod.getReturnType());
         expectRemoveMethod(actionMethod);
-
-        _Config.put("isis.reflector.facet.actionAnnotation.domainEvent.postForDefault", true);
+        
+        super.metaModelContext.getConfiguration()
+        .getReflector().getFacet().getActionAnnotation().getDomainEvent().setPostForDefault(true);
 
         // when
         final ProcessMethodContext processMethodContext = new ProcessMethodContext(
@@ -186,7 +187,8 @@ public class ActionAnnotationFacetFactoryTest_Invocation extends ActionAnnotatio
         allowingLoadSpecificationRequestsFor(cls, actionMethod.getReturnType());
         expectRemoveMethod(actionMethod);
 
-        _Config.put("isis.reflector.facet.actionAnnotation.domainEvent.postForDefault", true);
+        super.metaModelContext.getConfiguration()
+        .getReflector().getFacet().getActionAnnotation().getDomainEvent().setPostForDefault(true);
 
         // when
         final ProcessMethodContext processMethodContext = new ProcessMethodContext(
diff --git a/core/metamodel/src/test/java/org/apache/isis/metamodel/facets/actions/action/PrototypeFacetAnnotationFactoryTest.java b/core/metamodel/src/test/java/org/apache/isis/metamodel/facets/actions/action/PrototypeFacetAnnotationFactoryTest.java
index 4201bd2..7b9d81b 100644
--- a/core/metamodel/src/test/java/org/apache/isis/metamodel/facets/actions/action/PrototypeFacetAnnotationFactoryTest.java
+++ b/core/metamodel/src/test/java/org/apache/isis/metamodel/facets/actions/action/PrototypeFacetAnnotationFactoryTest.java
@@ -48,6 +48,7 @@ public class PrototypeFacetAnnotationFactoryTest extends AbstractFacetFactoryTes
         super.setUp();
 
         facetFactory = new ActionAnnotationFacetFactory();
+        facetFactory.setMetaModelContext(super.metaModelContext);
     }
 
     @Override
diff --git a/core/metamodel/src/test/java/org/apache/isis/metamodel/facets/actions/layout/ActionLayoutAnnotationFacetFactoryJunit4Test.java b/core/metamodel/src/test/java/org/apache/isis/metamodel/facets/actions/layout/ActionLayoutAnnotationFacetFactoryJunit4Test.java
index 86d3379..b375dde 100644
--- a/core/metamodel/src/test/java/org/apache/isis/metamodel/facets/actions/layout/ActionLayoutAnnotationFacetFactoryJunit4Test.java
+++ b/core/metamodel/src/test/java/org/apache/isis/metamodel/facets/actions/layout/ActionLayoutAnnotationFacetFactoryJunit4Test.java
@@ -50,6 +50,7 @@ public class ActionLayoutAnnotationFacetFactoryJunit4Test extends AbstractFacetF
     @Before
     public void setUp() throws Exception {
         facetFactory = new ActionLayoutFacetFactory();
+        facetFactory.setMetaModelContext(super.metaModelContext);
     }
 
     public static class Contributing extends ActionLayoutAnnotationFacetFactoryJunit4Test {
diff --git a/core/metamodel/src/test/java/org/apache/isis/metamodel/facets/actions/layout/ActionLayoutXmlLayoutAnnotationFacetFactoryTest.java b/core/metamodel/src/test/java/org/apache/isis/metamodel/facets/actions/layout/ActionLayoutXmlLayoutAnnotationFacetFactoryTest.java
index fad6f74..c3d9c71 100644
--- a/core/metamodel/src/test/java/org/apache/isis/metamodel/facets/actions/layout/ActionLayoutXmlLayoutAnnotationFacetFactoryTest.java
+++ b/core/metamodel/src/test/java/org/apache/isis/metamodel/facets/actions/layout/ActionLayoutXmlLayoutAnnotationFacetFactoryTest.java
@@ -48,6 +48,7 @@ public class ActionLayoutXmlLayoutAnnotationFacetFactoryTest extends AbstractFac
     @Before
     public void setUp() throws Exception {
         facetFactory = new ActionLayoutFacetFactory();
+        facetFactory.setMetaModelContext(super.metaModelContext);
     }
 
     @Test
diff --git a/core/metamodel/src/test/java/org/apache/isis/metamodel/facets/actions/notcontributed/derived/NotContributedFacetDerivedFromDomainServiceFacetFactoryTest.java b/core/metamodel/src/test/java/org/apache/isis/metamodel/facets/actions/notcontributed/derived/NotContributedFacetDerivedFromDomainServiceFacetFactoryTest.java
index 6a98380..02dc77b 100644
--- a/core/metamodel/src/test/java/org/apache/isis/metamodel/facets/actions/notcontributed/derived/NotContributedFacetDerivedFromDomainServiceFacetFactoryTest.java
+++ b/core/metamodel/src/test/java/org/apache/isis/metamodel/facets/actions/notcontributed/derived/NotContributedFacetDerivedFromDomainServiceFacetFactoryTest.java
@@ -45,6 +45,7 @@ public class NotContributedFacetDerivedFromDomainServiceFacetFactoryTest extends
     @Before
     public void setUp() throws Exception {
         facetFactory = new NotContributedFacetDerivedFromDomainServiceFacetFactory();
+        facetFactory.setMetaModelContext(super.metaModelContext);
     }
 
     //TODO[2142] NatureOfService.VIEW_MENU_ONLY was deprecated, remove ?
diff --git a/core/metamodel/src/test/java/org/apache/isis/metamodel/facets/actions/notinservicemenu/derived/NotInServiceMenuFacetDerivedFromDomainServiceFacetFactoryTest.java b/core/metamodel/src/test/java/org/apache/isis/metamodel/facets/actions/notinservicemenu/derived/NotInServiceMenuFacetDerivedFromDomainServiceFacetFactoryTest.java
index ef6ea12..2bded46 100644
--- a/core/metamodel/src/test/java/org/apache/isis/metamodel/facets/actions/notinservicemenu/derived/NotInServiceMenuFacetDerivedFromDomainServiceFacetFactoryTest.java
+++ b/core/metamodel/src/test/java/org/apache/isis/metamodel/facets/actions/notinservicemenu/derived/NotInServiceMenuFacetDerivedFromDomainServiceFacetFactoryTest.java
@@ -46,6 +46,7 @@ extends AbstractFacetFactoryJUnit4TestCase {
     @Before
     public void setUp() throws Exception {
         facetFactory = new NotInServiceMenuFacetDerivedFromDomainServiceFacetFactory();
+        facetFactory.setMetaModelContext(super.metaModelContext);
     }
 
     //TODO[2142] NatureOfService.VIEW_CONTRIBUTIONS_ONLY was deprecated, remove ?
@@ -109,6 +110,7 @@ extends AbstractFacetFactoryJUnit4TestCase {
         expectNoMethodsRemoved();
 
         facetedMethod = FacetedMethod.createForAction(CustomerService.class, "name");
+        facetFactory.setMetaModelContext(super.metaModelContext);
 
         // when
         facetFactory.process(new FacetFactory.ProcessMethodContext(CustomerService.class, null, facetedMethod.getMethod(), mockMethodRemover, facetedMethod));
diff --git a/core/metamodel/src/test/java/org/apache/isis/metamodel/facets/collections/CollectionFieldMethodsFacetFactoryTest.java b/core/metamodel/src/test/java/org/apache/isis/metamodel/facets/collections/CollectionFieldMethodsFacetFactoryTest.java
index ef2183d..2eb3e34 100644
--- a/core/metamodel/src/test/java/org/apache/isis/metamodel/facets/collections/CollectionFieldMethodsFacetFactoryTest.java
+++ b/core/metamodel/src/test/java/org/apache/isis/metamodel/facets/collections/CollectionFieldMethodsFacetFactoryTest.java
@@ -60,6 +60,8 @@ import org.apache.isis.metamodel.spec.ObjectSpecification;
 import org.apache.isis.unittestsupport.jmocking.JUnitRuleMockery2;
 import org.apache.isis.unittestsupport.jmocking.JUnitRuleMockery2.Mode;
 
+import lombok.val;
+
 public class CollectionFieldMethodsFacetFactoryTest extends AbstractFacetFactoryTest {
 
     @Rule
@@ -76,7 +78,8 @@ public class CollectionFieldMethodsFacetFactoryTest extends AbstractFacetFactory
     }
 
     public void testPropertyAccessorFacetIsInstalledForJavaUtilCollectionAndMethodRemoved() {
-        final CollectionAccessorFacetViaAccessorFactory facetFactory = new CollectionAccessorFacetViaAccessorFactory();
+        val facetFactory = new CollectionAccessorFacetViaAccessorFactory();
+        facetFactory.setMetaModelContext(super.metaModelContext);
 
         class Customer {
             @SuppressWarnings({ "rawtypes", "unused" })
@@ -99,8 +102,9 @@ public class CollectionFieldMethodsFacetFactoryTest extends AbstractFacetFactory
 
 
     public void testPropertyAccessorFacetIsInstalledForJavaUtilListAndMethodRemoved() {
-        final CollectionAccessorFacetViaAccessorFactory facetFactory = new CollectionAccessorFacetViaAccessorFactory();
-
+        val facetFactory = new CollectionAccessorFacetViaAccessorFactory();
+        facetFactory.setMetaModelContext(super.metaModelContext);
+        
         class Customer {
             @SuppressWarnings({ "rawtypes", "unused" })
             public List getOrders() {
@@ -122,7 +126,8 @@ public class CollectionFieldMethodsFacetFactoryTest extends AbstractFacetFactory
     }
 
     public void testPropertyAccessorFacetIsInstalledForJavaUtilSetAndMethodRemoved() {
-        final CollectionAccessorFacetViaAccessorFactory facetFactory = new CollectionAccessorFacetViaAccessorFactory();
+        val facetFactory = new CollectionAccessorFacetViaAccessorFactory();
+        facetFactory.setMetaModelContext(super.metaModelContext);
 
         class Customer {
             @SuppressWarnings({ "rawtypes", "unused" })
@@ -144,7 +149,8 @@ public class CollectionFieldMethodsFacetFactoryTest extends AbstractFacetFactory
     }
 
     public void testPropertyAccessorFacetIsInstalledForObjectArrayAndMethodRemoved() {
-        final CollectionAccessorFacetViaAccessorFactory facetFactory = new CollectionAccessorFacetViaAccessorFactory();
+        val facetFactory = new CollectionAccessorFacetViaAccessorFactory();
+        facetFactory.setMetaModelContext(super.metaModelContext);
 
         class Customer {
             @SuppressWarnings("unused")
@@ -166,7 +172,8 @@ public class CollectionFieldMethodsFacetFactoryTest extends AbstractFacetFactory
     }
 
     public void testPropertyAccessorFacetIsInstalledForOrderArrayAndMethodRemoved() {
-        final CollectionAccessorFacetViaAccessorFactory facetFactory = new CollectionAccessorFacetViaAccessorFactory();
+        val facetFactory = new CollectionAccessorFacetViaAccessorFactory();
+        facetFactory.setMetaModelContext(super.metaModelContext);
 
         @SuppressWarnings("hiding")
         class Order {
@@ -191,7 +198,8 @@ public class CollectionFieldMethodsFacetFactoryTest extends AbstractFacetFactory
     }
 
     public void testAddToFacetIsInstalledViaAccessorIfNoExplicitAddToMethodExists() {
-        final CollectionAddToRemoveFromAndValidateFacetFactory facetFactory = new CollectionAddToRemoveFromAndValidateFacetFactory();
+        val facetFactory = new CollectionAddToRemoveFromAndValidateFacetFactory();
+        facetFactory.setMetaModelContext(super.metaModelContext);
 
         @SuppressWarnings("hiding")
         class Order {
@@ -214,7 +222,8 @@ public class CollectionFieldMethodsFacetFactoryTest extends AbstractFacetFactory
     }
 
     public void testCannotInferTypeOfFacetIfNoExplicitAddToOrRemoveFromMethods() {
-        final CollectionAddToRemoveFromAndValidateFacetFactory facetFactory = new CollectionAddToRemoveFromAndValidateFacetFactory();
+        val facetFactory = new CollectionAddToRemoveFromAndValidateFacetFactory();
+        facetFactory.setMetaModelContext(super.metaModelContext);
 
         @SuppressWarnings("hiding")
         class Order {
@@ -233,7 +242,8 @@ public class CollectionFieldMethodsFacetFactoryTest extends AbstractFacetFactory
     }
 
     public void testRemoveFromFacetIsInstalledViaAccessorIfNoExplicitRemoveFromMethodExists() {
-        final CollectionAddToRemoveFromAndValidateFacetFactory facetFactory = new CollectionAddToRemoveFromAndValidateFacetFactory();
+        val facetFactory = new CollectionAddToRemoveFromAndValidateFacetFactory();
+        facetFactory.setMetaModelContext(super.metaModelContext);
 
         @SuppressWarnings("hiding")
         class Order {
@@ -256,7 +266,8 @@ public class CollectionFieldMethodsFacetFactoryTest extends AbstractFacetFactory
     }
 
     public void testAddToFacetIsInstalledAndMethodRemoved() {
-        final CollectionAddToRemoveFromAndValidateFacetFactory facetFactory = new CollectionAddToRemoveFromAndValidateFacetFactory();
+        val facetFactory = new CollectionAddToRemoveFromAndValidateFacetFactory();
+        facetFactory.setMetaModelContext(super.metaModelContext);
 
         @SuppressWarnings("hiding")
         class Order {
@@ -286,7 +297,8 @@ public class CollectionFieldMethodsFacetFactoryTest extends AbstractFacetFactory
     }
 
     public void testCanInferTypeOfFacetFromExplicitAddToMethod() {
-        final CollectionAddToRemoveFromAndValidateFacetFactory facetFactory = new CollectionAddToRemoveFromAndValidateFacetFactory();
+        val facetFactory = new CollectionAddToRemoveFromAndValidateFacetFactory();
+        facetFactory.setMetaModelContext(super.metaModelContext);
 
         @SuppressWarnings("hiding")
         class Order {
@@ -313,7 +325,8 @@ public class CollectionFieldMethodsFacetFactoryTest extends AbstractFacetFactory
     }
 
     public void testRemoveFromFacetIsInstalledAndMethodRemoved() {
-        final CollectionAddToRemoveFromAndValidateFacetFactory facetFactory = new CollectionAddToRemoveFromAndValidateFacetFactory();
+        val facetFactory = new CollectionAddToRemoveFromAndValidateFacetFactory();
+        facetFactory.setMetaModelContext(super.metaModelContext);
 
         @SuppressWarnings("hiding")
         class Order {
@@ -343,7 +356,8 @@ public class CollectionFieldMethodsFacetFactoryTest extends AbstractFacetFactory
     }
 
     public void testCanInferTypeOfFacetFromExplicitRemoveFromMethod() {
-        final CollectionAddToRemoveFromAndValidateFacetFactory facetFactory = new CollectionAddToRemoveFromAndValidateFacetFactory();
+        val facetFactory = new CollectionAddToRemoveFromAndValidateFacetFactory();
+        facetFactory.setMetaModelContext(super.metaModelContext);
 
         @SuppressWarnings("hiding")
         class Order {
@@ -370,7 +384,8 @@ public class CollectionFieldMethodsFacetFactoryTest extends AbstractFacetFactory
     }
 
     public void testClearFacetIsInstalledAndMethodRemoved() {
-        final CollectionClearFacetFactory facetFactory = new CollectionClearFacetFactory();
+        val facetFactory = new CollectionClearFacetFactory();
+        facetFactory.setMetaModelContext(super.metaModelContext);
 
         @SuppressWarnings({ "hiding", "unused" })
         class Order {
@@ -400,7 +415,8 @@ public class CollectionFieldMethodsFacetFactoryTest extends AbstractFacetFactory
     }
 
     public void testClearFacetIsInstalledViaAccessorIfNoExplicitClearMethod() {
-        final CollectionClearFacetFactory facetFactory = new CollectionClearFacetFactory();
+        val facetFactory = new CollectionClearFacetFactory();
+        facetFactory.setMetaModelContext(super.metaModelContext);
 
         @SuppressWarnings({ "hiding", "unused" })
         class Order {
@@ -423,8 +439,8 @@ public class CollectionFieldMethodsFacetFactoryTest extends AbstractFacetFactory
     }
 
     public void testValidateAddToFacetIsInstalledAndMethodRemoved() {
-
-        final CollectionAddToRemoveFromAndValidateFacetFactory facetFactory = new CollectionAddToRemoveFromAndValidateFacetFactory();
+        val facetFactory = new CollectionAddToRemoveFromAndValidateFacetFactory();
+        facetFactory.setMetaModelContext(super.metaModelContext);
 
         @SuppressWarnings("hiding")
         class Order {
@@ -459,7 +475,8 @@ public class CollectionFieldMethodsFacetFactoryTest extends AbstractFacetFactory
     }
 
     public void testValidateRemoveFromFacetIsInstalledAndMethodRemoved() {
-        final CollectionAddToRemoveFromAndValidateFacetFactory facetFactory = new CollectionAddToRemoveFromAndValidateFacetFactory();
+        val facetFactory = new CollectionAddToRemoveFromAndValidateFacetFactory();
+        facetFactory.setMetaModelContext(super.metaModelContext);
 
         @SuppressWarnings("hiding")
         class Order {
@@ -494,7 +511,8 @@ public class CollectionFieldMethodsFacetFactoryTest extends AbstractFacetFactory
     }
 
     public void testMethodFoundInSuperclass() {
-        final CollectionAccessorFacetViaAccessorFactory facetFactory = new CollectionAccessorFacetViaAccessorFactory();
+        val facetFactory = new CollectionAccessorFacetViaAccessorFactory();
+        facetFactory.setMetaModelContext(super.metaModelContext);
 
         @SuppressWarnings("hiding")
         class Order {
@@ -521,9 +539,10 @@ public class CollectionFieldMethodsFacetFactoryTest extends AbstractFacetFactory
     }
 
     public void testMethodFoundInSuperclassButHelpeMethodsFoundInSubclasses() {
-        final CollectionAccessorFacetViaAccessorFactory facetFactoryForAccessor = new CollectionAccessorFacetViaAccessorFactory();
-
-        final CollectionAddToRemoveFromAndValidateFacetFactory facetFactoryForHelpers = new CollectionAddToRemoveFromAndValidateFacetFactory();
+        val facetFactoryForAccessor = new CollectionAccessorFacetViaAccessorFactory();
+        val facetFactoryForHelpers = new CollectionAddToRemoveFromAndValidateFacetFactory();
+        facetFactoryForAccessor.setMetaModelContext(super.metaModelContext);
+        facetFactoryForHelpers.setMetaModelContext(super.metaModelContext);
 
         @SuppressWarnings("hiding")
         class Order {
@@ -615,7 +634,8 @@ public class CollectionFieldMethodsFacetFactoryTest extends AbstractFacetFactory
     }
 
     public void testInstallsHiddenForSessionFacetAndRemovesMethod() {
-        final HideForSessionFacetViaMethodFactory facetFactory = new HideForSessionFacetViaMethodFactory();
+        val facetFactory = new HideForSessionFacetViaMethodFactory();
+        facetFactory.setMetaModelContext(super.metaModelContext);
 
         final Method collectionAccessorMethod = findMethod(CustomerStatic.class, "getOrders");
         final Method hideMethod = findMethod(CustomerStatic.class, "hideOrders", new Class[] { UserMemento.class });
@@ -632,7 +652,8 @@ public class CollectionFieldMethodsFacetFactoryTest extends AbstractFacetFactory
     }
 
     public void testInstallsDisabledForSessionFacetAndRemovesMethod() {
-        final DisableForSessionFacetViaMethodFactory facetFactory = new DisableForSessionFacetViaMethodFactory();
+        val facetFactory = new DisableForSessionFacetViaMethodFactory();
+        facetFactory.setMetaModelContext(super.metaModelContext);
 
         final Method collectionAccessorMethod = findMethod(CustomerStatic.class, "getOrders");
         final Method disableMethod = findMethod(CustomerStatic.class, "disableOrders", new Class[] { UserMemento.class });
diff --git a/core/metamodel/src/test/java/org/apache/isis/metamodel/facets/collections/JavaCollectionFacetTest.java b/core/metamodel/src/test/java/org/apache/isis/metamodel/facets/collections/JavaCollectionFacetTest.java
index 959c177..7f5c68b 100644
--- a/core/metamodel/src/test/java/org/apache/isis/metamodel/facets/collections/JavaCollectionFacetTest.java
+++ b/core/metamodel/src/test/java/org/apache/isis/metamodel/facets/collections/JavaCollectionFacetTest.java
@@ -29,6 +29,7 @@ import org.junit.Before;
 import org.junit.Rule;
 import org.junit.Test;
 
+import org.apache.isis.metamodel.MetaModelContext_forTesting;
 import org.apache.isis.metamodel.adapter.ObjectAdapter;
 import org.apache.isis.metamodel.adapter.ObjectAdapterProvider;
 import org.apache.isis.metamodel.facetapi.FacetHolder;
@@ -47,18 +48,20 @@ public class JavaCollectionFacetTest {
     @Rule
     public JUnitRuleMockery2 context = JUnitRuleMockery2.createFor(Mode.INTERFACES_AND_CLASSES);
 
-    @Mock
-    private FacetHolder mockFacetHolder;
-    @Mock
-    private ObjectAdapter mockCollection;
-    @Mock
-    private Collection<ObjectAdapter> mockWrappedCollection;
-    @Mock
-    private ObjectAdapterProvider mockOAProvider;
+    @Mock private FacetHolder mockFacetHolder;
+    @Mock private ObjectAdapter mockCollection;
+    @Mock private Collection<ObjectAdapter> mockWrappedCollection;
+    @Mock private ObjectAdapterProvider mockOAProvider;
+
+    private MetaModelContext_forTesting metaModelContext;
 
     @Before
     public void setUp() throws Exception {
         facet = new JavaCollectionFacet(mockFacetHolder);
+        
+        metaModelContext = MetaModelContext_forTesting.builder()
+                .objectAdapterProvider(mockOAProvider)
+                .build();
     }
 
     @After
@@ -75,6 +78,9 @@ public class JavaCollectionFacetTest {
 
                 oneOf(mockWrappedCollection).stream();
                 will(returnValue(Stream.empty()));
+                
+                oneOf(mockFacetHolder).getMetaModelContext();
+                will(returnValue(metaModelContext));
 
             }
         });
diff --git a/core/metamodel/src/test/java/org/apache/isis/metamodel/facets/collections/collection/CollectionAnnotationFacetFactoryTest_typeOf.java b/core/metamodel/src/test/java/org/apache/isis/metamodel/facets/collections/collection/CollectionAnnotationFacetFactoryTest_typeOf.java
index 6a0a869..76d2bc7 100644
--- a/core/metamodel/src/test/java/org/apache/isis/metamodel/facets/collections/collection/CollectionAnnotationFacetFactoryTest_typeOf.java
+++ b/core/metamodel/src/test/java/org/apache/isis/metamodel/facets/collections/collection/CollectionAnnotationFacetFactoryTest_typeOf.java
@@ -41,6 +41,7 @@ public class CollectionAnnotationFacetFactoryTest_typeOf extends AbstractFacetFa
     protected void setUp() throws Exception {
         super.setUp();
         facetFactory = new CollectionAnnotationFacetFactory();
+        facetFactory.setMetaModelContext(super.metaModelContext);
     }
 
     @Override
diff --git a/core/metamodel/src/test/java/org/apache/isis/metamodel/facets/collections/layout/annotation/NamedFacetForCollectionLayoutAnnotationFactoryTest.java b/core/metamodel/src/test/java/org/apache/isis/metamodel/facets/collections/layout/annotation/NamedFacetForCollectionLayoutAnnotationFactoryTest.java
index 830d6c7..aefd530 100644
--- a/core/metamodel/src/test/java/org/apache/isis/metamodel/facets/collections/layout/annotation/NamedFacetForCollectionLayoutAnnotationFactoryTest.java
+++ b/core/metamodel/src/test/java/org/apache/isis/metamodel/facets/collections/layout/annotation/NamedFacetForCollectionLayoutAnnotationFactoryTest.java
@@ -37,10 +37,13 @@ import static org.hamcrest.Matchers.is;
 import static org.hamcrest.Matchers.notNullValue;
 import static org.junit.Assert.assertThat;
 
+import lombok.val;
+
 public class NamedFacetForCollectionLayoutAnnotationFactoryTest extends AbstractFacetFactoryTest {
 
     public void testCollectionLayoutAnnotationNamed() {
-        final CollectionLayoutFacetFactory facetFactory = new CollectionLayoutFacetFactory();
+        val facetFactory = new CollectionLayoutFacetFactory();
+        facetFactory.setMetaModelContext(super.metaModelContext);
 
         class Customer {
             @CollectionLayout(named = "1st names")
@@ -60,7 +63,8 @@ public class NamedFacetForCollectionLayoutAnnotationFactoryTest extends Abstract
     }
 
     public void testCollectionLayoutAnnotationNamedEscapedFalse() {
-        final CollectionLayoutFacetFactory facetFactory = new CollectionLayoutFacetFactory();
+        val facetFactory = new CollectionLayoutFacetFactory();
+        facetFactory.setMetaModelContext(super.metaModelContext);
 
         class Customer {
             @CollectionLayout(named = "1st names", namedEscaped = false)
diff --git a/core/metamodel/src/test/java/org/apache/isis/metamodel/facets/object/ViewModelSemanticCheckingFacetFactoryTest.java b/core/metamodel/src/test/java/org/apache/isis/metamodel/facets/object/ViewModelSemanticCheckingFacetFactoryTest.java
index 573a1ee..b5add14 100644
--- a/core/metamodel/src/test/java/org/apache/isis/metamodel/facets/object/ViewModelSemanticCheckingFacetFactoryTest.java
+++ b/core/metamodel/src/test/java/org/apache/isis/metamodel/facets/object/ViewModelSemanticCheckingFacetFactoryTest.java
@@ -30,6 +30,8 @@ import org.apache.isis.commons.internal.context._Context;
 import org.apache.isis.config.IsisConfiguration;
 import org.apache.isis.config.internal._Config;
 import org.apache.isis.metamodel.MetaModelContext;
+import org.apache.isis.metamodel.MetaModelContextAware;
+import org.apache.isis.metamodel.MetaModelContext_forTesting;
 import org.apache.isis.metamodel.facetapi.FacetHolderImpl;
 import org.apache.isis.metamodel.facets.FacetFactory;
 import org.apache.isis.metamodel.progmodel.ProgrammingModelAbstract;
@@ -53,15 +55,18 @@ public class ViewModelSemanticCheckingFacetFactoryTest {
     @Mock
     private ServiceInjector mockServicesInjector;
 
+    private MetaModelContext metaModelContext;
     private ViewModelSemanticCheckingFacetFactory facetFactory;
 
     private ValidationFailures processThenValidate(final Class<?> cls) {
         
         val programmingModel = new ProgrammingModelAbstract() {};
         facetFactory.refineProgrammingModel(programmingModel);
-        programmingModel.init(new ProgrammingModelInitFilterDefault());
+        programmingModel.init(new ProgrammingModelInitFilterDefault(), metaModelContext);
         
-        facetFactory.process(new FacetFactory.ProcessClassContext(cls, null, new FacetHolderImpl()));
+        val holder = new FacetHolderImpl();
+        ((MetaModelContextAware)holder).setMetaModelContext(metaModelContext);
+        facetFactory.process(new FacetFactory.ProcessClassContext(cls, null, holder));
         
         val validationFailures = new ValidationFailures();
         
@@ -80,11 +85,12 @@ public class ViewModelSemanticCheckingFacetFactoryTest {
         val configuration = new IsisConfiguration();
         configuration.getReflector().getFacets().getViewModelSemanticCheckingFacetFactory().setEnable(true);
 
-        MetaModelContext.preset(MetaModelContext.builder()
+        metaModelContext = MetaModelContext_forTesting.builder()
                 .configuration(configuration)
-                .build());
+                .build();
 
         facetFactory = new ViewModelSemanticCheckingFacetFactory();
+        facetFactory.setMetaModelContext(metaModelContext);
     }
 
     @Test
diff --git a/core/metamodel/src/test/java/org/apache/isis/metamodel/facets/object/defaults/DefaultedFacetFactoryTest.java b/core/metamodel/src/test/java/org/apache/isis/metamodel/facets/object/defaults/DefaultedFacetFactoryTest.java
index 1d205d8..966c588 100644
--- a/core/metamodel/src/test/java/org/apache/isis/metamodel/facets/object/defaults/DefaultedFacetFactoryTest.java
+++ b/core/metamodel/src/test/java/org/apache/isis/metamodel/facets/object/defaults/DefaultedFacetFactoryTest.java
@@ -35,6 +35,7 @@ public class DefaultedFacetFactoryTest extends AbstractFacetFactoryTest {
         super.setUp();
 
         facetFactory = new DefaultedFacetAnnotationElseConfigurationFactory();
+        facetFactory.setMetaModelContext(super.metaModelContext);
     }
 
     @Override
diff --git a/core/metamodel/src/test/java/org/apache/isis/metamodel/facets/object/disabled/ObjectDisabledMethodFacetFactoryTest.java b/core/metamodel/src/test/java/org/apache/isis/metamodel/facets/object/disabled/ObjectDisabledMethodFacetFactoryTest.java
index cbda26c..384cba1 100644
--- a/core/metamodel/src/test/java/org/apache/isis/metamodel/facets/object/disabled/ObjectDisabledMethodFacetFactoryTest.java
+++ b/core/metamodel/src/test/java/org/apache/isis/metamodel/facets/object/disabled/ObjectDisabledMethodFacetFactoryTest.java
@@ -40,6 +40,7 @@ public class ObjectDisabledMethodFacetFactoryTest extends AbstractFacetFactoryTe
     public void setUp() throws Exception {
         super.setUp();
         facetFactory = new DisabledObjectFacetViaMethodFactory();
+        facetFactory.setMetaModelContext(super.metaModelContext);
     }
 
     @Override
diff --git a/core/metamodel/src/test/java/org/apache/isis/metamodel/facets/object/domainobject/DomainObjectAnnotationFacetFactoryTest.java b/core/metamodel/src/test/java/org/apache/isis/metamodel/facets/object/domainobject/DomainObjectAnnotationFacetFactoryTest.java
index fd2d5fb..711bf40 100644
--- a/core/metamodel/src/test/java/org/apache/isis/metamodel/facets/object/domainobject/DomainObjectAnnotationFacetFactoryTest.java
+++ b/core/metamodel/src/test/java/org/apache/isis/metamodel/facets/object/domainobject/DomainObjectAnnotationFacetFactoryTest.java
@@ -30,9 +30,7 @@ import org.junit.Test;
 import org.apache.isis.applib.annotation.Bounding;
 import org.apache.isis.applib.annotation.DomainObject;
 import org.apache.isis.applib.services.HasUniqueId;
-import org.apache.isis.config.IsisConfiguration;
 import org.apache.isis.config.internal._Config;
-import org.apache.isis.metamodel.MetaModelContext;
 import org.apache.isis.metamodel.facetapi.Facet;
 import org.apache.isis.metamodel.facets.AbstractFacetFactoryJUnit4TestCase;
 import org.apache.isis.metamodel.facets.FacetFactory.ProcessClassContext;
@@ -74,6 +72,7 @@ public class DomainObjectAnnotationFacetFactoryTest extends AbstractFacetFactory
     public void setUp() throws Exception {
         _Config.clear();
         facetFactory = new DomainObjectAnnotationFacetFactory();
+        facetFactory.setMetaModelContext(super.metaModelContext);
     }
 
     @Override
@@ -96,39 +95,24 @@ public class DomainObjectAnnotationFacetFactoryTest extends AbstractFacetFactory
     }
     
     void allowingAuditObjectsToReturn(AuditObjectsConfiguration value) {
-        
-        val config = new IsisConfiguration();
-        
         if(value!=null) {
+            val config = super.metaModelContext.getConfiguration();
             config.getServices().getAudit().setObjects(value);
         }
-        
-        MetaModelContext.preset(MetaModelContext.builder()
-                .configuration(config)
-                .build());
     }
     
     void allowingPublishObjectsToReturn(PublishObjectsConfiguration value) {
-        val config = new IsisConfiguration();
         if(value!=null) {
+            val config = super.metaModelContext.getConfiguration();
             config.getServices().getPublish().setObjects(value);
         }
-        MetaModelContext.preset(MetaModelContext.builder()
-                .configuration(config)
-                .build());
     }
     
     void allowingObjectsEditingToReturn(EditingObjectsConfiguration value) {
-        
-        val config = new IsisConfiguration();
-
         if(value!=null) {
+            val config = super.metaModelContext.getConfiguration();
             config.getObjects().setEditing(value);
         }
-        
-        MetaModelContext.preset(MetaModelContext.builder()
-                .configuration(config)
-                .build());
     }
 
 
diff --git a/core/metamodel/src/test/java/org/apache/isis/metamodel/facets/object/domainobjectlayout/DomainObjectLayoutFactoryTest.java b/core/metamodel/src/test/java/org/apache/isis/metamodel/facets/object/domainobjectlayout/DomainObjectLayoutFactoryTest.java
index ddd6f93..f391755 100644
--- a/core/metamodel/src/test/java/org/apache/isis/metamodel/facets/object/domainobjectlayout/DomainObjectLayoutFactoryTest.java
+++ b/core/metamodel/src/test/java/org/apache/isis/metamodel/facets/object/domainobjectlayout/DomainObjectLayoutFactoryTest.java
@@ -59,6 +59,7 @@ public class DomainObjectLayoutFactoryTest extends AbstractFacetFactoryJUnit4Tes
     public void setUp() throws Exception {
         _Config.clear();
         facetFactory = new DomainObjectLayoutFacetFactory();
+        facetFactory.setMetaModelContext(super.metaModelContext);
     }
 
     @Override
diff --git a/core/metamodel/src/test/java/org/apache/isis/metamodel/facets/object/ident/title/TitleFacetViaMethodTest.java b/core/metamodel/src/test/java/org/apache/isis/metamodel/facets/object/ident/title/TitleFacetViaMethodTest.java
index 368dc0d..1894bf5 100644
--- a/core/metamodel/src/test/java/org/apache/isis/metamodel/facets/object/ident/title/TitleFacetViaMethodTest.java
+++ b/core/metamodel/src/test/java/org/apache/isis/metamodel/facets/object/ident/title/TitleFacetViaMethodTest.java
@@ -30,6 +30,8 @@ import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 
+import org.apache.isis.metamodel.MetaModelContext;
+import org.apache.isis.metamodel.MetaModelContext_forTesting;
 import org.apache.isis.metamodel.adapter.ObjectAdapter;
 import org.apache.isis.metamodel.facetapi.FacetHolder;
 import org.apache.isis.metamodel.facets.object.title.methods.TitleFacetViaTitleMethod;
@@ -49,6 +51,8 @@ public class TitleFacetViaMethodTest {
 
     private DomainObjectWithProblemInItsTitleMethod pojo;
 
+    private MetaModelContext metaModelContext;
+
     public static class DomainObjectWithProblemInItsTitleMethod {
         public String title() {
             throw new NullPointerException();
@@ -58,6 +62,9 @@ public class TitleFacetViaMethodTest {
     @Before
     public void setUp() throws Exception {
 
+        metaModelContext = MetaModelContext_forTesting.builder()
+                .build();
+        
         pojo = new DomainObjectWithProblemInItsTitleMethod();
         mockFacetHolder = mockery.mock(FacetHolder.class);
         mockOwningAdapter = mockery.mock(ObjectAdapter.class);
@@ -66,6 +73,10 @@ public class TitleFacetViaMethodTest {
 
         mockery.checking(new Expectations() {
             {
+                
+                allowing(mockFacetHolder).getMetaModelContext();
+                will(returnValue(metaModelContext));
+                
                 allowing(mockOwningAdapter).getPojo();
                 will(returnValue(pojo));
             }
diff --git a/core/metamodel/src/test/java/org/apache/isis/metamodel/facets/object/ident/title/TitleFacetViaMethodsFactoryTest.java b/core/metamodel/src/test/java/org/apache/isis/metamodel/facets/object/ident/title/TitleFacetViaMethodsFactoryTest.java
index 721b1d7..23df184 100644
--- a/core/metamodel/src/test/java/org/apache/isis/metamodel/facets/object/ident/title/TitleFacetViaMethodsFactoryTest.java
+++ b/core/metamodel/src/test/java/org/apache/isis/metamodel/facets/object/ident/title/TitleFacetViaMethodsFactoryTest.java
@@ -43,6 +43,7 @@ public class TitleFacetViaMethodsFactoryTest extends AbstractFacetFactoryTest {
         super.setUp();
 
         facetFactory = new TitleFacetViaMethodsFactory();
+        facetFactory.setMetaModelContext(super.metaModelContext);
     }
 
 
diff --git a/core/metamodel/src/test/java/org/apache/isis/metamodel/facets/object/ident/title/annotation/TitleFacetViaTitleAnnotationTest.java b/core/metamodel/src/test/java/org/apache/isis/metamodel/facets/object/ident/title/annotation/TitleFacetViaTitleAnnotationTest.java
index 373fa66..f5df297 100644
--- a/core/metamodel/src/test/java/org/apache/isis/metamodel/facets/object/ident/title/annotation/TitleFacetViaTitleAnnotationTest.java
+++ b/core/metamodel/src/test/java/org/apache/isis/metamodel/facets/object/ident/title/annotation/TitleFacetViaTitleAnnotationTest.java
@@ -31,6 +31,7 @@ import org.junit.Test;
 import org.apache.isis.applib.annotation.Title;
 import org.apache.isis.commons.internal.collections._Lists;
 import org.apache.isis.metamodel.MetaModelContext;
+import org.apache.isis.metamodel.MetaModelContext_forTesting;
 import org.apache.isis.metamodel.adapter.ObjectAdapter;
 import org.apache.isis.metamodel.adapter.ObjectAdapterProvider;
 import org.apache.isis.metamodel.facetapi.FacetHolder;
@@ -49,15 +50,12 @@ public class TitleFacetViaTitleAnnotationTest {
     @Rule
     public JUnitRuleMockery2 context = JUnitRuleMockery2.createFor(Mode.INTERFACES_ONLY);
 
-    @Mock
-    private FacetHolder mockFacetHolder;
-
-    @Mock
-    private ObjectAdapter mockObjectAdapter;
-
-    @Mock
-    private ObjectAdapterProvider mockAdapterManager;
+    @Mock private FacetHolder mockFacetHolder;
+    @Mock private ObjectAdapter mockObjectAdapter;
+    @Mock private ObjectAdapterProvider mockAdapterManager;
 
+    protected MetaModelContext metaModelContext;
+    
     protected static class DomainObjectWithProblemInItsAnnotatedTitleMethod {
 
         @Title
@@ -88,12 +86,11 @@ public class TitleFacetViaTitleAnnotationTest {
 
     @Before
     public void setUp() {
-        MetaModelContext.preset(MetaModelContext.builder()
+        metaModelContext = MetaModelContext_forTesting.builder()
                 .objectAdapterProvider(mockAdapterManager)
-                .build());
+                .build();
     }
 
-
     @Test
     public void testTitle() throws Exception {
         final List<Annotations.Evaluator<Title>> evaluatorList = Annotations
@@ -107,6 +104,10 @@ public class TitleFacetViaTitleAnnotationTest {
         final Sequence sequence = context.sequence("in-title-element-order");
         context.checking(new Expectations() {
             {
+                
+                allowing(mockFacetHolder).getMetaModelContext();
+                will(returnValue(metaModelContext));
+                
                 allowing(mockObjectAdapter).getPojo();
                 will(returnValue(normalPojo));
 
@@ -136,6 +137,10 @@ public class TitleFacetViaTitleAnnotationTest {
         final DomainObjectWithProblemInItsAnnotatedTitleMethod screwedPojo = new DomainObjectWithProblemInItsAnnotatedTitleMethod();
         context.checking(new Expectations() {
             {
+                
+                allowing(mockFacetHolder).getMetaModelContext();
+                will(returnValue(metaModelContext));
+                
                 allowing(mockObjectAdapter).getPojo();
                 will(returnValue(screwedPojo));
             }
diff --git a/core/metamodel/src/test/java/org/apache/isis/metamodel/facets/object/parseable/ParseableFacetUsingParserTest.java b/core/metamodel/src/test/java/org/apache/isis/metamodel/facets/object/parseable/ParseableFacetUsingParserTest.java
index 169f343..0d05b0f 100644
--- a/core/metamodel/src/test/java/org/apache/isis/metamodel/facets/object/parseable/ParseableFacetUsingParserTest.java
+++ b/core/metamodel/src/test/java/org/apache/isis/metamodel/facets/object/parseable/ParseableFacetUsingParserTest.java
@@ -23,7 +23,6 @@ import java.util.IllegalFormatWidthException;
 import org.jmock.Expectations;
 import org.jmock.auto.Mock;
 import org.junit.Before;
-import org.junit.Ignore;
 import org.junit.Rule;
 import org.junit.Test;
 
@@ -32,6 +31,7 @@ import org.apache.isis.applib.adapters.ParsingException;
 import org.apache.isis.applib.services.inject.ServiceInjector;
 import org.apache.isis.applib.services.registry.ServiceRegistry;
 import org.apache.isis.metamodel.MetaModelContext;
+import org.apache.isis.metamodel.MetaModelContext_forTesting;
 import org.apache.isis.metamodel.consent.InteractionInitiatedBy;
 import org.apache.isis.metamodel.facetapi.FacetHolder;
 import org.apache.isis.metamodel.facets.object.parseable.parser.ParseableFacetUsingParser;
@@ -46,27 +46,22 @@ public class ParseableFacetUsingParserTest {
     @Rule
     public JUnitRuleMockery2 context = JUnitRuleMockery2.createFor(Mode.INTERFACES_AND_CLASSES);
 
-    @Mock
-    private FacetHolder mockFacetHolder;
-    @Mock
-    private AuthenticationSessionProvider mockAuthenticationSessionProvider;
-    @Mock
-    private ServiceInjector mockServicesInjector;
-    @Mock
-    private ServiceRegistry mockServiceRegistry;
-
-    @Mock
-    private ObjectAdapterService mockAdapterManager;
+    @Mock private FacetHolder mockFacetHolder;
+    @Mock private AuthenticationSessionProvider mockAuthenticationSessionProvider;
+    @Mock private ServiceInjector mockServicesInjector;
+    @Mock private ServiceRegistry mockServiceRegistry;
+    @Mock private ObjectAdapterService mockAdapterManager;
 
+    protected MetaModelContext metaModelContext;
     private ParseableFacetUsingParser parseableFacetUsingParser;
 
     @Before
     public void setUp() throws Exception {
 
-        MetaModelContext.preset(MetaModelContext.builder()
+        metaModelContext = MetaModelContext_forTesting.builder()
                 .authenticationSessionProvider(mockAuthenticationSessionProvider)
                 .objectAdapterProvider(mockAdapterManager)
-                .build());
+                .build();
 
 
         context.checking(new Expectations() {
@@ -74,6 +69,9 @@ public class ParseableFacetUsingParserTest {
                 never(mockAuthenticationSessionProvider);
                 never(mockAdapterManager);
 
+                allowing(mockFacetHolder).getMetaModelContext();
+                will(returnValue(metaModelContext));
+                
                 allowing(mockFacetHolder).containsFacet(ValueFacet.class);
                 will(returnValue(Boolean.FALSE));
 
@@ -118,32 +116,6 @@ public class ParseableFacetUsingParserTest {
         parseableFacetUsingParser = new ParseableFacetUsingParser(parser, mockFacetHolder);
     }
 
-    @Ignore
-    @Test
-    public void testParseNormalEntry() throws Exception {
-        // TODO why is this so complicated to check ?!
-        /*
-         * final AuthenticationSession session =
-         * mockery.mock(AuthenticationSession.class);
-         * 
-         * mockery.checking(new Expectations(){{
-         * oneOf(mockAdapterManager).adapterFor("XXX");
-         * will(returnValue(mockAdapter));
-         * 
-         * oneOf(mockAdapter).getSpecification();
-         * will(returnValue(mockSpecification));
-         * 
-         * oneOf(mockAuthenticationSessionProvider).getAuthenticationSession();
-         * will(returnValue(session));
-         * 
-         * allowing(mockSpecification).createValidityInteractionContext(session,
-         * InteractionInvocationMethod.USER, mockAdapter); }}); ObjectAdapter
-         * adapter = parseableFacetUsingParser.parseTextEntry(null, "xxx");
-         * 
-         * adapter.getObject();
-         */
-    }
-
     @Test(expected = TextEntryParseException.class)
     public void parsingExceptionRethrown() throws Exception {
         parseableFacetUsingParser.parseTextEntry(null, "invalid", InteractionInitiatedBy.USER);
diff --git a/core/metamodel/src/test/java/org/apache/isis/metamodel/facets/object/validating/validateobject/ObjectValidMethodFacetFactoryTest.java b/core/metamodel/src/test/java/org/apache/isis/metamodel/facets/object/validating/validateobject/ObjectValidMethodFacetFactoryTest.java
index 03aa0f1..d498454 100644
--- a/core/metamodel/src/test/java/org/apache/isis/metamodel/facets/object/validating/validateobject/ObjectValidMethodFacetFactoryTest.java
+++ b/core/metamodel/src/test/java/org/apache/isis/metamodel/facets/object/validating/validateobject/ObjectValidMethodFacetFactoryTest.java
@@ -38,6 +38,7 @@ public class ObjectValidMethodFacetFactoryTest extends AbstractFacetFactoryTest
     protected void setUp() throws Exception {
         super.setUp();
         facetFactory = new ValidateObjectFacetMethodFactory();
+        facetFactory.setMetaModelContext(super.metaModelContext);
     }
 
     @Override
diff --git a/core/metamodel/src/test/java/org/apache/isis/metamodel/facets/object/value/ValueFacetAnnotationOrConfigurationFactoryTest.java b/core/metamodel/src/test/java/org/apache/isis/metamodel/facets/object/value/ValueFacetAnnotationOrConfigurationFactoryTest.java
index 58a5402..dfa95b7 100644
--- a/core/metamodel/src/test/java/org/apache/isis/metamodel/facets/object/value/ValueFacetAnnotationOrConfigurationFactoryTest.java
+++ b/core/metamodel/src/test/java/org/apache/isis/metamodel/facets/object/value/ValueFacetAnnotationOrConfigurationFactoryTest.java
@@ -49,6 +49,7 @@ public class ValueFacetAnnotationOrConfigurationFactoryTest extends AbstractFace
         super.setUp();
 
         facetFactory = new ValueFacetAnnotationOrConfigurationFactory();
+        facetFactory.setMetaModelContext(super.metaModelContext);
     }
 
     @Override
diff --git a/core/metamodel/src/test/java/org/apache/isis/metamodel/facets/ordering/memberorder/MemberOrderAnnotationFacetFactoryTest.java b/core/metamodel/src/test/java/org/apache/isis/metamodel/facets/ordering/memberorder/MemberOrderAnnotationFacetFactoryTest.java
index 4019fdf..9bd8168 100644
--- a/core/metamodel/src/test/java/org/apache/isis/metamodel/facets/ordering/memberorder/MemberOrderAnnotationFacetFactoryTest.java
+++ b/core/metamodel/src/test/java/org/apache/isis/metamodel/facets/ordering/memberorder/MemberOrderAnnotationFacetFactoryTest.java
@@ -65,6 +65,7 @@ public class MemberOrderAnnotationFacetFactoryTest extends AbstractFacetFactoryT
 
 
         facetFactory = new MemberOrderFacetFactory();
+        facetFactory.setMetaModelContext(super.metaModelContext);
 
     }
 
diff --git a/core/metamodel/src/test/java/org/apache/isis/metamodel/facets/param/parameter/ParameterAnnotationFacetFactoryTest.java b/core/metamodel/src/test/java/org/apache/isis/metamodel/facets/param/parameter/ParameterAnnotationFacetFactoryTest.java
index cb42146..90e1844 100644
--- a/core/metamodel/src/test/java/org/apache/isis/metamodel/facets/param/parameter/ParameterAnnotationFacetFactoryTest.java
+++ b/core/metamodel/src/test/java/org/apache/isis/metamodel/facets/param/parameter/ParameterAnnotationFacetFactoryTest.java
@@ -54,10 +54,8 @@ public class ParameterAnnotationFacetFactoryTest extends AbstractFacetFactoryJUn
     ParameterAnnotationFacetFactory facetFactory;
     Method actionMethod;
 
-    @Mock
-    ObjectSpecification mockTypeSpec;
-    @Mock
-    ObjectSpecification mockReturnTypeSpec;
+    @Mock ObjectSpecification mockTypeSpec;
+    @Mock ObjectSpecification mockReturnTypeSpec;
 
     void expectRemoveMethod(final Method actionMethod) {
         context.checking(new Expectations() {{
@@ -78,6 +76,7 @@ public class ParameterAnnotationFacetFactoryTest extends AbstractFacetFactoryJUn
     @Before
     public void setUp() throws Exception {
         facetFactory = new ParameterAnnotationFacetFactory();
+        facetFactory.setMetaModelContext(super.metaModelContext);
     }
 
     @Override
diff --git a/core/metamodel/src/test/java/org/apache/isis/metamodel/facets/param/parameter/RegExAnnotationOnParameterFacetFactoryTest.java b/core/metamodel/src/test/java/org/apache/isis/metamodel/facets/param/parameter/RegExAnnotationOnParameterFacetFactoryTest.java
index 5f36c97..df4068b 100644
--- a/core/metamodel/src/test/java/org/apache/isis/metamodel/facets/param/parameter/RegExAnnotationOnParameterFacetFactoryTest.java
+++ b/core/metamodel/src/test/java/org/apache/isis/metamodel/facets/param/parameter/RegExAnnotationOnParameterFacetFactoryTest.java
@@ -40,6 +40,7 @@ public class RegExAnnotationOnParameterFacetFactoryTest extends AbstractFacetFac
     public void setUp() throws Exception {
         super.setUp();
         facetFactory = new ParameterAnnotationFacetFactory();
+        facetFactory.setMetaModelContext(super.metaModelContext);
     }
 
     public void testRegExAnnotationPickedUpOnActionParameter() {
diff --git a/core/metamodel/src/test/java/org/apache/isis/metamodel/facets/properties/PropertyMethodsFacetFactoryTest.java b/core/metamodel/src/test/java/org/apache/isis/metamodel/facets/properties/PropertyMethodsFacetFactoryTest.java
index d01fa27..6de8cc1 100644
--- a/core/metamodel/src/test/java/org/apache/isis/metamodel/facets/properties/PropertyMethodsFacetFactoryTest.java
+++ b/core/metamodel/src/test/java/org/apache/isis/metamodel/facets/properties/PropertyMethodsFacetFactoryTest.java
@@ -71,6 +71,8 @@ import org.apache.isis.metamodel.facets.properties.validating.method.PropertyVal
 import org.apache.isis.metamodel.spec.ObjectSpecification;
 import org.apache.isis.unittestsupport.jmocking.JUnitRuleMockery2;
 
+import lombok.val;
+
 public class PropertyMethodsFacetFactoryTest extends AbstractFacetFactoryTest {
 
     private JUnitRuleMockery2 context = JUnitRuleMockery2.createFor(JUnitRuleMockery2.Mode.INTERFACES_AND_CLASSES);
@@ -88,7 +90,8 @@ public class PropertyMethodsFacetFactoryTest extends AbstractFacetFactoryTest {
     }
 
     public void testPropertyAccessorFacetIsInstalledAndMethodRemoved() {
-        final PropertyAccessorFacetViaAccessorFactory facetFactory = new PropertyAccessorFacetViaAccessorFactory();
+        val facetFactory = new PropertyAccessorFacetViaAccessorFactory();
+        facetFactory.setMetaModelContext(super.metaModelContext);
 
         class Customer {
             @SuppressWarnings("unused")
@@ -110,7 +113,8 @@ public class PropertyMethodsFacetFactoryTest extends AbstractFacetFactoryTest {
     }
 
     public void testSetterFacetIsInstalledForSetterMethodAndMethodRemoved() {
-        final PropertySetAndClearFacetFactory facetFactory = new PropertySetAndClearFacetFactory();
+        val facetFactory = new PropertySetAndClearFacetFactory();
+        facetFactory.setMetaModelContext(super.metaModelContext);
 
         class Customer {
             @SuppressWarnings("unused")
@@ -137,7 +141,8 @@ public class PropertyMethodsFacetFactoryTest extends AbstractFacetFactoryTest {
     }
 
     public void testInitializationFacetIsInstalledForSetterMethodAndMethodRemoved() {
-        final PropertySetAndClearFacetFactory facetFactory = new PropertySetAndClearFacetFactory();
+        val facetFactory = new PropertySetAndClearFacetFactory();
+        facetFactory.setMetaModelContext(super.metaModelContext);
 
         class Customer {
             @SuppressWarnings("unused")
@@ -164,7 +169,8 @@ public class PropertyMethodsFacetFactoryTest extends AbstractFacetFactoryTest {
     }
 
     public void testSetterFacetIsInstalledMeansNoDisabledOrDerivedFacetsInstalled() {
-        final PropertySetAndClearFacetFactory facetFactory = new PropertySetAndClearFacetFactory();
+        val facetFactory = new PropertySetAndClearFacetFactory();
+        facetFactory.setMetaModelContext(super.metaModelContext);
 
         class Customer {
             @SuppressWarnings("unused")
@@ -186,8 +192,10 @@ public class PropertyMethodsFacetFactoryTest extends AbstractFacetFactoryTest {
 
     public void testSetterFacetIsInstalledForModifyMethodAndMethodRemoved() {
 
-        final PropertyModifyFacetFactory facetFactoryForModify = new PropertyModifyFacetFactory();
-        final PropertySetAndClearFacetFactory facetFactoryForSetter = new PropertySetAndClearFacetFactory();
+        val facetFactoryForModify = new PropertyModifyFacetFactory();
+        val facetFactoryForSetter = new PropertySetAndClearFacetFactory();
+        facetFactoryForModify.setMetaModelContext(super.metaModelContext);
+        facetFactoryForSetter.setMetaModelContext(super.metaModelContext);
 
         class Customer {
             @SuppressWarnings("unused")
@@ -217,9 +225,12 @@ public class PropertyMethodsFacetFactoryTest extends AbstractFacetFactoryTest {
     }
 
     public void testModifyMethodWithNoSetterInstallsNotPersistedFacetButDoesNotInstallADisabledFacets() {
-        final PropertySetAndClearFacetFactory facetFactory = new PropertySetAndClearFacetFactory();
-        final PropertyModifyFacetFactory facetFactoryForModify = new PropertyModifyFacetFactory();
-        final DisabledFacetOnPropertyInferredFactory disabledFacetOnPropertyInferredFactory = new DisabledFacetOnPropertyInferredFactory();
+        val facetFactory = new PropertySetAndClearFacetFactory();
+        val facetFactoryForModify = new PropertyModifyFacetFactory();
+        val disabledFacetOnPropertyInferredFactory = new DisabledFacetOnPropertyInferredFactory();
+        facetFactory.setMetaModelContext(super.metaModelContext);
+        facetFactoryForModify.setMetaModelContext(super.metaModelContext);
+        disabledFacetOnPropertyInferredFactory.setMetaModelContext(super.metaModelContext);
 
         class Customer {
             @SuppressWarnings("unused")
@@ -249,8 +260,10 @@ public class PropertyMethodsFacetFactoryTest extends AbstractFacetFactoryTest {
 
     public void testIfHaveSetterAndModifyFacetThenTheModifyFacetWinsOut() {
 
-        final PropertySetAndClearFacetFactory facetFactory = new PropertySetAndClearFacetFactory();
-        final PropertyModifyFacetFactory facetFactoryForModify = new PropertyModifyFacetFactory();
+        val facetFactory = new PropertySetAndClearFacetFactory();
+        val facetFactoryForModify = new PropertyModifyFacetFactory();
+        facetFactory.setMetaModelContext(super.metaModelContext);
+        facetFactoryForModify.setMetaModelContext(super.metaModelContext);
 
         class Customer {
             @SuppressWarnings("unused")
@@ -286,7 +299,8 @@ public class PropertyMethodsFacetFactoryTest extends AbstractFacetFactoryTest {
     }
 
     public void testClearFacet() {
-        final PropertySetAndClearFacetFactory facetFactory = new PropertySetAndClearFacetFactory();
+        val facetFactory = new PropertySetAndClearFacetFactory();
+        facetFactory.setMetaModelContext(super.metaModelContext);
 
         class Customer {
             @SuppressWarnings("unused")
@@ -313,7 +327,8 @@ public class PropertyMethodsFacetFactoryTest extends AbstractFacetFactoryTest {
     }
 
     public void testClearFacetViaSetterIfNoExplicitClearMethod() {
-        final PropertySetAndClearFacetFactory facetFactory = new PropertySetAndClearFacetFactory();
+        val facetFactory = new PropertySetAndClearFacetFactory();
+        facetFactory.setMetaModelContext(super.metaModelContext);
 
         class Customer {
             @SuppressWarnings("unused")
@@ -338,7 +353,8 @@ public class PropertyMethodsFacetFactoryTest extends AbstractFacetFactoryTest {
     }
 
     public void testChoicesFacetFoundAndMethodRemoved() {
-        final PropertyChoicesFacetViaMethodFactory facetFactory = new PropertyChoicesFacetViaMethodFactory();
+        val facetFactory = new PropertyChoicesFacetViaMethodFactory();
+        facetFactory.setMetaModelContext(super.metaModelContext);
 
         class Customer {
             @SuppressWarnings("unused")
@@ -367,7 +383,8 @@ public class PropertyMethodsFacetFactoryTest extends AbstractFacetFactoryTest {
 
     public void testAutoCompleteFacetFoundAndMethodRemoved() {
 
-        final PropertyAutoCompleteFacetMethodFactory facetFactory = new PropertyAutoCompleteFacetMethodFactory();
+        val facetFactory = new PropertyAutoCompleteFacetMethodFactory();
+        facetFactory.setMetaModelContext(super.metaModelContext);
 
         //        context.checking(new Expectations(){{
         //            allowing(mockServicesInjector).lookupService(AuthenticationSessionProvider.class);
@@ -406,7 +423,8 @@ public class PropertyMethodsFacetFactoryTest extends AbstractFacetFactoryTest {
     }
 
     public void testDefaultFacetFoundAndMethodRemoved() {
-        final PropertyDefaultFacetViaMethodFactory facetFactory = new PropertyDefaultFacetViaMethodFactory();
+        val facetFactory = new PropertyDefaultFacetViaMethodFactory();
+        facetFactory.setMetaModelContext(super.metaModelContext);
 
         class Customer {
             @SuppressWarnings("unused")
@@ -434,7 +452,8 @@ public class PropertyMethodsFacetFactoryTest extends AbstractFacetFactoryTest {
     }
 
     public void testValidateFacetFoundAndMethodRemoved() {
-        final PropertyValidateFacetViaMethodFactory facetFactory = new PropertyValidateFacetViaMethodFactory();
+        val facetFactory = new PropertyValidateFacetViaMethodFactory();
+        facetFactory.setMetaModelContext(super.metaModelContext);
 
         class Customer {
             @SuppressWarnings("unused")
@@ -462,7 +481,8 @@ public class PropertyMethodsFacetFactoryTest extends AbstractFacetFactoryTest {
     }
 
     public void testDisableFacetFoundAndMethodRemoved() {
-        final DisableForContextFacetViaMethodFactory facetFactory = new DisableForContextFacetViaMethodFactory();
+        val facetFactory = new DisableForContextFacetViaMethodFactory();
+        facetFactory.setMetaModelContext(super.metaModelContext);
 
         class Customer {
             @SuppressWarnings("unused")
@@ -491,7 +511,8 @@ public class PropertyMethodsFacetFactoryTest extends AbstractFacetFactoryTest {
 
     public void testDisableFacetNoArgsFoundAndMethodRemoved() {
 
-        final DisableForContextFacetViaMethodFactory facetFactory = new DisableForContextFacetViaMethodFactory();
+        val facetFactory = new DisableForContextFacetViaMethodFactory();
+        facetFactory.setMetaModelContext(super.metaModelContext);
 
         class Customer {
             @SuppressWarnings("unused")
@@ -519,7 +540,8 @@ public class PropertyMethodsFacetFactoryTest extends AbstractFacetFactoryTest {
     }
 
     public void testHiddenFacetFoundAndMethodRemoved() {
-        final HideForContextFacetViaMethodFactory facetFactory = new HideForContextFacetViaMethodFactory();
+        val facetFactory = new HideForContextFacetViaMethodFactory();
+        facetFactory.setMetaModelContext(super.metaModelContext);
 
         class Customer {
             @SuppressWarnings("unused")
@@ -547,7 +569,8 @@ public class PropertyMethodsFacetFactoryTest extends AbstractFacetFactoryTest {
     }
 
     public void testHiddenFacetWithNoArgFoundAndMethodRemoved() {
-        final HideForContextFacetViaMethodFactory facetFactory = new HideForContextFacetViaMethodFactory();
+        val facetFactory = new HideForContextFacetViaMethodFactory();
+        facetFactory.setMetaModelContext(super.metaModelContext);
 
         class Customer {
             @SuppressWarnings("unused")
@@ -575,7 +598,8 @@ public class PropertyMethodsFacetFactoryTest extends AbstractFacetFactoryTest {
     }
 
     public void testPropertyFoundOnSuperclass() {
-        final PropertyAccessorFacetViaAccessorFactory facetFactory = new PropertyAccessorFacetViaAccessorFactory();
+        val facetFactory = new PropertyAccessorFacetViaAccessorFactory();
+        facetFactory.setMetaModelContext(super.metaModelContext);
 
         class Customer {
             @SuppressWarnings("unused")
@@ -599,9 +623,13 @@ public class PropertyMethodsFacetFactoryTest extends AbstractFacetFactoryTest {
     }
 
     public void testPropertyFoundOnSuperclassButHelperMethodFoundOnSubclass() {
-        final PropertyAccessorFacetViaAccessorFactory facetFactory = new PropertyAccessorFacetViaAccessorFactory();
-        final HideForContextFacetViaMethodFactory facetFactoryForHide = new HideForContextFacetViaMethodFactory();
-        final DisableForContextFacetViaMethodFactory facetFactoryForDisable = new DisableForContextFacetViaMethodFactory();
+        val facetFactory = new PropertyAccessorFacetViaAccessorFactory();
+        val facetFactoryForHide = new HideForContextFacetViaMethodFactory();
+        val facetFactoryForDisable = new DisableForContextFacetViaMethodFactory();
+        
+        facetFactory.setMetaModelContext(super.metaModelContext);
+        facetFactoryForHide.setMetaModelContext(super.metaModelContext);
+        facetFactoryForDisable.setMetaModelContext(super.metaModelContext);
 
         class Customer {
             @SuppressWarnings("unused")
@@ -698,7 +726,8 @@ public class PropertyMethodsFacetFactoryTest extends AbstractFacetFactoryTest {
 
 
     public void testInstallsHiddenForSessionFacetAndRemovesMethod() {
-        final HideForSessionFacetViaMethodFactory facetFactory = new HideForSessionFacetViaMethodFactory();
+        val facetFactory = new HideForSessionFacetViaMethodFactory();
+        facetFactory.setMetaModelContext(super.metaModelContext);
 
         final Method propertyAccessorMethod = findMethod(CustomerStatic.class, "getFirstName");
         final Method hideMethod = findMethod(CustomerStatic.class, "hideFirstName", new Class[] { UserMemento.class });
@@ -716,7 +745,8 @@ public class PropertyMethodsFacetFactoryTest extends AbstractFacetFactoryTest {
     }
 
     public void testInstallsDisabledForSessionFacetAndRemovesMethod() {
-        final DisableForSessionFacetViaMethodFactory facetFactory = new DisableForSessionFacetViaMethodFactory();
+        val facetFactory = new DisableForSessionFacetViaMethodFactory();
+        facetFactory.setMetaModelContext(super.metaModelContext);
 
         final Method propertyAccessorMethod = findMethod(CustomerStatic.class, "getFirstName");
         final Method disableMethod = findMethod(CustomerStatic.class, "disableFirstName", new Class[] { UserMemento.class });
diff --git a/core/metamodel/src/test/java/org/apache/isis/metamodel/facets/properties/property/PropertyAnnotationFacetFactoryTest.java b/core/metamodel/src/test/java/org/apache/isis/metamodel/facets/properties/property/PropertyAnnotationFacetFactoryTest.java
index 1393dfa..0a468c3 100644
--- a/core/metamodel/src/test/java/org/apache/isis/metamodel/facets/properties/property/PropertyAnnotationFacetFactoryTest.java
+++ b/core/metamodel/src/test/java/org/apache/isis/metamodel/facets/properties/property/PropertyAnnotationFacetFactoryTest.java
@@ -86,10 +86,8 @@ public class PropertyAnnotationFacetFactoryTest extends AbstractFacetFactoryJUni
     PropertyAnnotationFacetFactory facetFactory;
     Method propertyMethod;
 
-    @Mock
-    ObjectSpecification mockTypeSpec;
-    @Mock
-    ObjectSpecification mockReturnTypeSpec;
+    @Mock ObjectSpecification mockTypeSpec;
+    @Mock ObjectSpecification mockReturnTypeSpec;
 
     void expectRemoveMethod(final Method actionMethod) {
         context.checking(new Expectations() {{
@@ -165,6 +163,7 @@ public class PropertyAnnotationFacetFactoryTest extends AbstractFacetFactoryJUni
     public void setUp() throws Exception {
         _Config.clear();
         facetFactory = new PropertyAnnotationFacetFactory();
+        facetFactory.setMetaModelContext(super.metaModelContext);
     }
 
     @Override
diff --git a/core/metamodel/src/test/java/org/apache/isis/metamodel/facets/propparam/specification/MustSatisfySpecificationValidatingInteractionMoreTest.java b/core/metamodel/src/test/java/org/apache/isis/metamodel/facets/propparam/specification/MustSatisfySpecificationValidatingInteractionMoreTest.java
deleted file mode 100644
index c0f7ae7..0000000
--- a/core/metamodel/src/test/java/org/apache/isis/metamodel/facets/propparam/specification/MustSatisfySpecificationValidatingInteractionMoreTest.java
+++ /dev/null
@@ -1,147 +0,0 @@
-/*
- *  Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you under the Apache License, Version 2.0 (the
- *  "License"); you may not use this file except in compliance
- *  with the License.  You may obtain a copy of the License at
- *
- *        http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing,
- *  software distributed under the License is distributed on an
- *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- *  KIND, either express or implied.  See the License for the
- *  specific language governing permissions and limitations
- *  under the License.
- */
-
-package org.apache.isis.metamodel.facets.propparam.specification;
-
-import java.util.Collections;
-import java.util.Optional;
-
-import org.jmock.Expectations;
-import org.jmock.auto.Mock;
-import org.junit.After;
-import org.junit.Before;
-import org.junit.Rule;
-import org.junit.Test;
-
-import org.apache.isis.applib.Identifier;
-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.metamodel.adapter.ObjectAdapter;
-import org.apache.isis.metamodel.facetapi.IdentifiedHolder;
-import org.apache.isis.metamodel.facets.AbstractFacetFactoryTest;
-import org.apache.isis.metamodel.facets.object.validating.mustsatisfyspec.MustSatisfySpecificationFromMustSatisfyAnnotationOnTypeFacet;
-import org.apache.isis.metamodel.interactions.PropertyModifyContext;
-import org.apache.isis.unittestsupport.jmocking.JUnitRuleMockery2;
-
-import static org.hamcrest.CoreMatchers.is;
-import static org.hamcrest.CoreMatchers.not;
-import static org.hamcrest.CoreMatchers.nullValue;
-import static org.junit.Assert.assertThat;
-
-public class MustSatisfySpecificationValidatingInteractionMoreTest {
-
-    @Rule
-    public JUnitRuleMockery2 context = JUnitRuleMockery2.createFor(JUnitRuleMockery2.Mode.INTERFACES_AND_CLASSES);
-
-    private MustSatisfySpecificationFromMustSatisfyAnnotationOnTypeFacet facetForSpecificationFirstLetterUpperCase;
-
-    @Mock
-    private IdentifiedHolder identifiedHolder;
-
-    @Mock
-    private ServiceInjector mockServicesInjector;
-
-    @Mock
-    private ServiceRegistry mockServiceRegistry;
-
-    @Mock
-    private TranslationService mockTranslationService;
-
-    @Mock
-    private PropertyModifyContext mockContext;
-
-    private ObjectAdapter mockProposedObjectAdapter;
-
-    private SpecificationRequiresFirstLetterToBeUpperCase requiresFirstLetterToBeUpperCase;
-
-    public static class Customer {}
-
-    @Before
-    public void setUp() throws Exception {
-
-        identifiedHolder = new AbstractFacetFactoryTest.IdentifiedHolderImpl(Identifier.propertyOrCollectionIdentifier(Customer.class, "lastName"));
-
-        context.checking(new Expectations() {{
-            allowing(mockServiceRegistry).lookupService(TranslationService.class);
-            will(returnValue(Optional.of(mockTranslationService)));
-        }});
-
-        requiresFirstLetterToBeUpperCase = new SpecificationRequiresFirstLetterToBeUpperCase();
-
-        facetForSpecificationFirstLetterUpperCase = 
-                new MustSatisfySpecificationFromMustSatisfyAnnotationOnTypeFacet(
-                        Collections.singletonList(requiresFirstLetterToBeUpperCase), 
-                        identifiedHolder, 
-                        mockServicesInjector);
-
-        mockProposedObjectAdapter = context.mock(ObjectAdapter.class, "proposed");
-    }
-
-    @After
-    public void tearDown() throws Exception {
-        identifiedHolder = null;
-        requiresFirstLetterToBeUpperCase = null;
-        mockContext = null;
-    }
-
-    /**
-     * As in:
-     * 
-     * <pre>
-     * [at]ValidatedBy(SpecificationRequiresFirstLetterToBeUpperCase.class)
-     * public void getLastName() { ... }
-     * </pre>
-     * 
-     * @see SpecificationRequiresFirstLetterToBeUpperCase
-     */
-    @Test
-    public void validatesUsingSpecificationIfProposedOkay() {
-        context.checking(new Expectations() {
-            {
-                oneOf(mockContext).getProposed();
-                will(returnValue(mockProposedObjectAdapter));
-
-                oneOf(mockProposedObjectAdapter).getPojo();
-                will(returnValue("This starts with an upper case letter and so is okay"));
-            }
-        });
-
-        final String reason = facetForSpecificationFirstLetterUpperCase.invalidates(mockContext);
-        assertThat(reason, is(nullValue()));
-    }
-
-    @Test
-    public void invalidatesUsingSpecificationIfProposedNotOkay() {
-        context.checking(new Expectations() {
-            {
-                oneOf(mockContext).getProposed();
-                will(returnValue(mockProposedObjectAdapter));
-
-                oneOf(mockProposedObjectAdapter).getPojo();
-                will(returnValue("this starts with an lower case letter and so is not okay"));
-            }
-        });
-
-        final String reason = facetForSpecificationFirstLetterUpperCase.invalidates(mockContext);
-        assertThat(reason, is(not(nullValue())));
-        assertThat(reason, is("Must start with upper case"));
-    }
-
-}
diff --git a/core/metamodel/src/test/java/org/apache/isis/metamodel/facets/propparam/specification/MustSatisfySpecificationValidatingInteractionTest.java b/core/metamodel/src/test/java/org/apache/isis/metamodel/facets/propparam/specification/MustSatisfySpecificationValidatingInteractionTest.java
deleted file mode 100644
index c163026..0000000
--- a/core/metamodel/src/test/java/org/apache/isis/metamodel/facets/propparam/specification/MustSatisfySpecificationValidatingInteractionTest.java
+++ /dev/null
@@ -1,141 +0,0 @@
-/*
- *  Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you under the Apache License, Version 2.0 (the
- *  "License"); you may not use this file except in compliance
- *  with the License.  You may obtain a copy of the License at
- *
- *        http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing,
- *  software distributed under the License is distributed on an
- *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- *  KIND, either express or implied.  See the License for the
- *  specific language governing permissions and limitations
- *  under the License.
- */
-
-package org.apache.isis.metamodel.facets.propparam.specification;
-
-import java.util.Collections;
-
-import org.jmock.Expectations;
-import org.jmock.auto.Mock;
-import org.junit.After;
-import org.junit.Before;
-import org.junit.Rule;
-import org.junit.Test;
-
-import org.apache.isis.applib.Identifier;
-import org.apache.isis.applib.services.i18n.TranslationService;
-import org.apache.isis.metamodel.MetaModelContext;
-import org.apache.isis.metamodel.adapter.ObjectAdapter;
-import org.apache.isis.metamodel.facetapi.IdentifiedHolder;
-import org.apache.isis.metamodel.facets.AbstractFacetFactoryTest;
-import org.apache.isis.metamodel.facets.object.validating.mustsatisfyspec.MustSatisfySpecificationFromMustSatisfyAnnotationOnTypeFacet;
-import org.apache.isis.metamodel.interactions.PropertyModifyContext;
-import org.apache.isis.unittestsupport.jmocking.JUnitRuleMockery2;
-
-import static org.hamcrest.CoreMatchers.is;
-import static org.hamcrest.CoreMatchers.not;
-import static org.hamcrest.CoreMatchers.nullValue;
-import static org.junit.Assert.assertThat;
-
-import lombok.val;
-
-public class MustSatisfySpecificationValidatingInteractionTest {
-
-    @Rule
-    public JUnitRuleMockery2 context = JUnitRuleMockery2.createFor(JUnitRuleMockery2.Mode.INTERFACES_AND_CLASSES);
-
-    private MustSatisfySpecificationFromMustSatisfyAnnotationOnTypeFacet facetForSpecificationAlwaysSatisfied;
-    private MustSatisfySpecificationFromMustSatisfyAnnotationOnTypeFacet facetForSpecificationNeverSatisfied;
-
-    private IdentifiedHolder identifiedHolder;
-
-    @Mock
-    private TranslationService mockTranslationService;
-
-    @Mock
-    private PropertyModifyContext mockContext;
-
-    private ObjectAdapter mockProposedObjectAdapter;
-    private ProposedObject mockProposedObject;
-
-    private SpecificationAlwaysSatisfied specificationAlwaysSatisfied;
-    private SpecificationNeverSatisfied specificationNeverSatisfied;
-
-    public static class ProposedObject {}
-
-    public static class Customer {}
-
-    @Before
-    public void setUp() throws Exception {
-
-        MetaModelContext mmc;
-
-        MetaModelContext.preset(mmc = MetaModelContext.builder()
-                .singleton(mockTranslationService)
-                .build());
-
-        val serviceInjector = mmc.getServiceInjector();
-
-        identifiedHolder = new AbstractFacetFactoryTest.IdentifiedHolderImpl(Identifier.propertyOrCollectionIdentifier(Customer.class, "lastName"));
-        context.checking(new Expectations() {{
-            //            allowing(mockServiceRegistry).lookupService(TranslationService.class);
-            //            will(returnValue(Optional.of(mockTranslationService)));
-        }});
-
-        specificationAlwaysSatisfied = new SpecificationAlwaysSatisfied();
-        specificationNeverSatisfied = new SpecificationNeverSatisfied();
-
-        facetForSpecificationAlwaysSatisfied = 
-                new MustSatisfySpecificationFromMustSatisfyAnnotationOnTypeFacet(
-                        Collections.singletonList(specificationAlwaysSatisfied), 
-                        identifiedHolder, 
-                        serviceInjector);
-
-        facetForSpecificationNeverSatisfied = 
-                new MustSatisfySpecificationFromMustSatisfyAnnotationOnTypeFacet(
-                        Collections.singletonList(specificationNeverSatisfied), 
-                        identifiedHolder, 
-                        serviceInjector);
-
-        mockProposedObjectAdapter = context.mock(ObjectAdapter.class, "proposed");
-        mockProposedObject = context.mock(ProposedObject.class, "proposedObject");
-
-        context.checking(new Expectations() {
-            {
-                oneOf(mockContext).getProposed();
-                will(returnValue(mockProposedObjectAdapter));
-
-                oneOf(mockProposedObjectAdapter).getPojo();
-                will(returnValue(mockProposedObject));
-            }
-        });
-    }
-
-    @After
-    public void tearDown() throws Exception {
-        identifiedHolder = null;
-        facetForSpecificationAlwaysSatisfied = null;
-        facetForSpecificationNeverSatisfied = null;
-        mockContext = null;
-    }
-
-    @Test
-    public void validatesWhenSpecificationDoesNotVeto() {
-        final String reason = facetForSpecificationAlwaysSatisfied.invalidates(mockContext);
-        assertThat(reason, is(nullValue()));
-    }
-
-    @Test
-    public void invalidatesWhenSpecificationVetoes() {
-        final String reason = facetForSpecificationNeverSatisfied.invalidates(mockContext);
-        assertThat(reason, is(not(nullValue())));
-        assertThat(reason, is("not satisfied"));
-    }
-
-}
diff --git a/core/metamodel/src/test/java/org/apache/isis/metamodel/facets/value/BigDecimalValueSemanticsProviderTest.java b/core/metamodel/src/test/java/org/apache/isis/metamodel/facets/value/BigDecimalValueSemanticsProviderTest.java
index 52af368..5ca94a8 100644
--- a/core/metamodel/src/test/java/org/apache/isis/metamodel/facets/value/BigDecimalValueSemanticsProviderTest.java
+++ b/core/metamodel/src/test/java/org/apache/isis/metamodel/facets/value/BigDecimalValueSemanticsProviderTest.java
@@ -25,6 +25,7 @@ import org.junit.Before;
 import org.junit.Test;
 
 import org.apache.isis.config.internal._Config;
+import org.apache.isis.metamodel.MetaModelContextAware;
 import org.apache.isis.metamodel.facetapi.FacetHolder;
 import org.apache.isis.metamodel.facetapi.FacetHolderImpl;
 import org.apache.isis.metamodel.facets.object.parseable.TextEntryParseException;
@@ -49,6 +50,7 @@ public class BigDecimalValueSemanticsProviderTest extends ValueSemanticsProvider
         bigDecimal = new BigDecimal("34132.199");
         allowMockAdapterToReturn(bigDecimal);
         holder = new FacetHolderImpl();
+        ((MetaModelContextAware)holder).setMetaModelContext(super.metaModelContext);
 
         setValue(value = new BigDecimalValueSemanticsProvider(holder));
     }
diff --git a/core/metamodel/src/test/java/org/apache/isis/metamodel/facets/value/BigIntValueSemanticsProviderTest.java b/core/metamodel/src/test/java/org/apache/isis/metamodel/facets/value/BigIntValueSemanticsProviderTest.java
index 2652b08..af4f4a7 100644
--- a/core/metamodel/src/test/java/org/apache/isis/metamodel/facets/value/BigIntValueSemanticsProviderTest.java
+++ b/core/metamodel/src/test/java/org/apache/isis/metamodel/facets/value/BigIntValueSemanticsProviderTest.java
@@ -25,6 +25,7 @@ import org.junit.Before;
 import org.junit.Test;
 
 import org.apache.isis.config.internal._Config;
+import org.apache.isis.metamodel.MetaModelContextAware;
 import org.apache.isis.metamodel.facetapi.FacetHolder;
 import org.apache.isis.metamodel.facetapi.FacetHolderImpl;
 import org.apache.isis.metamodel.facets.object.parseable.TextEntryParseException;
@@ -48,6 +49,8 @@ public class BigIntValueSemanticsProviderTest extends ValueSemanticsProviderAbst
         _Config.put("isis.value.format.int", null);
 
         holder = new FacetHolderImpl();
+        ((MetaModelContextAware)holder).setMetaModelContext(super.metaModelContext);
+        
         setValue(new BigIntegerValueSemanticsProvider(holder));
     }
 
diff --git a/core/metamodel/src/test/java/org/apache/isis/metamodel/facets/value/ByteValueSemanticsProviderTest.java b/core/metamodel/src/test/java/org/apache/isis/metamodel/facets/value/ByteValueSemanticsProviderTest.java
index d20b5ba..a692d8f 100644
--- a/core/metamodel/src/test/java/org/apache/isis/metamodel/facets/value/ByteValueSemanticsProviderTest.java
+++ b/core/metamodel/src/test/java/org/apache/isis/metamodel/facets/value/ByteValueSemanticsProviderTest.java
@@ -23,6 +23,7 @@ import org.junit.Before;
 import org.junit.Test;
 
 import org.apache.isis.config.internal._Config;
+import org.apache.isis.metamodel.MetaModelContextAware;
 import org.apache.isis.metamodel.facetapi.FacetHolder;
 import org.apache.isis.metamodel.facetapi.FacetHolderImpl;
 import org.apache.isis.metamodel.facets.object.parseable.TextEntryParseException;
@@ -44,6 +45,7 @@ public class ByteValueSemanticsProviderTest extends ValueSemanticsProviderAbstra
         byteObj = Byte.valueOf((byte) 102);
         allowMockAdapterToReturn(byteObj);
         holder = new FacetHolderImpl();
+        ((MetaModelContextAware)holder).setMetaModelContext(super.metaModelContext);
 
         _Config.put("isis.value.format.byte", null);
 
diff --git a/core/metamodel/src/test/java/org/apache/isis/metamodel/facets/value/DoubleValueSemanticsProviderTest.java b/core/metamodel/src/test/java/org/apache/isis/metamodel/facets/value/DoubleValueSemanticsProviderTest.java
index 55f99f1..ba64dd1 100644
--- a/core/metamodel/src/test/java/org/apache/isis/metamodel/facets/value/DoubleValueSemanticsProviderTest.java
+++ b/core/metamodel/src/test/java/org/apache/isis/metamodel/facets/value/DoubleValueSemanticsProviderTest.java
@@ -23,6 +23,7 @@ import org.junit.Before;
 import org.junit.Test;
 
 import org.apache.isis.config.internal._Config;
+import org.apache.isis.metamodel.MetaModelContextAware;
 import org.apache.isis.metamodel.facetapi.FacetHolder;
 import org.apache.isis.metamodel.facetapi.FacetHolderImpl;
 import org.apache.isis.metamodel.facets.object.parseable.TextEntryParseException;
@@ -43,6 +44,7 @@ public class DoubleValueSemanticsProviderTest extends ValueSemanticsProviderAbst
         _Config.put("isis.value.format.double", null);
 
         holder = new FacetHolderImpl();
+        ((MetaModelContextAware)holder).setMetaModelContext(super.metaModelContext);
         setValue(new DoubleWrapperValueSemanticsProvider(holder));
 
         doubleObj = new Double(32.5d);
diff --git a/core/metamodel/src/test/java/org/apache/isis/metamodel/facets/value/FloatValueSemanticsProviderTest.java b/core/metamodel/src/test/java/org/apache/isis/metamodel/facets/value/FloatValueSemanticsProviderTest.java
index 61c1103..fee732d 100644
--- a/core/metamodel/src/test/java/org/apache/isis/metamodel/facets/value/FloatValueSemanticsProviderTest.java
+++ b/core/metamodel/src/test/java/org/apache/isis/metamodel/facets/value/FloatValueSemanticsProviderTest.java
@@ -23,6 +23,7 @@ import org.junit.Before;
 import org.junit.Test;
 
 import org.apache.isis.config.internal._Config;
+import org.apache.isis.metamodel.MetaModelContextAware;
 import org.apache.isis.metamodel.facetapi.FacetHolder;
 import org.apache.isis.metamodel.facetapi.FacetHolderImpl;
 import org.apache.isis.metamodel.facets.object.parseable.TextEntryParseException;
@@ -47,6 +48,8 @@ public class FloatValueSemanticsProviderTest extends ValueSemanticsProviderAbstr
         allowMockAdapterToReturn(float1);
 
         holder = new FacetHolderImpl();
+        ((MetaModelContextAware)holder).setMetaModelContext(super.metaModelContext);
+        
         setValue(value = new FloatWrapperValueSemanticsProvider(holder));
     }
 
diff --git a/core/metamodel/src/test/java/org/apache/isis/metamodel/facets/value/IntValueSemanticsProviderTest.java b/core/metamodel/src/test/java/org/apache/isis/metamodel/facets/value/IntValueSemanticsProviderTest.java
index 3b9a1a9..0232297 100644
--- a/core/metamodel/src/test/java/org/apache/isis/metamodel/facets/value/IntValueSemanticsProviderTest.java
+++ b/core/metamodel/src/test/java/org/apache/isis/metamodel/facets/value/IntValueSemanticsProviderTest.java
@@ -23,6 +23,7 @@ import org.junit.Before;
 import org.junit.Test;
 
 import org.apache.isis.config.internal._Config;
+import org.apache.isis.metamodel.MetaModelContextAware;
 import org.apache.isis.metamodel.facetapi.FacetHolder;
 import org.apache.isis.metamodel.facetapi.FacetHolderImpl;
 import org.apache.isis.metamodel.facets.object.parseable.TextEntryParseException;
@@ -46,6 +47,8 @@ public class IntValueSemanticsProviderTest extends ValueSemanticsProviderAbstrac
         _Config.put("isis.value.format.int", null);
 
         holder = new FacetHolderImpl();
+        ((MetaModelContextAware)holder).setMetaModelContext(super.metaModelContext);
+        
         setValue(value = new IntWrapperValueSemanticsProvider(holder));
     }
 
diff --git a/core/metamodel/src/test/java/org/apache/isis/metamodel/facets/value/JavaSqlDateValueSemanticsProviderTest.java b/core/metamodel/src/test/java/org/apache/isis/metamodel/facets/value/JavaSqlDateValueSemanticsProviderTest.java
index c9a5e76..c6a0557 100644
--- a/core/metamodel/src/test/java/org/apache/isis/metamodel/facets/value/JavaSqlDateValueSemanticsProviderTest.java
+++ b/core/metamodel/src/test/java/org/apache/isis/metamodel/facets/value/JavaSqlDateValueSemanticsProviderTest.java
@@ -29,6 +29,7 @@ import org.junit.Before;
 import org.junit.Test;
 
 import org.apache.isis.config.internal._Config;
+import org.apache.isis.metamodel.MetaModelContextAware;
 import org.apache.isis.metamodel.facetapi.FacetHolder;
 import org.apache.isis.metamodel.facetapi.FacetHolderImpl;
 import org.apache.isis.metamodel.facets.object.parseable.TextEntryParseException;
@@ -51,6 +52,8 @@ public class JavaSqlDateValueSemanticsProviderTest extends ValueSemanticsProvide
         TestClock.initialize();
         date = new Date(0);
         holder = new FacetHolderImpl();
+        ((MetaModelContextAware)holder).setMetaModelContext(super.metaModelContext);
+        
         setValue(adapter = new JavaSqlDateValueSemanticsProvider(holder) {
             @Override
             protected String defaultFormat() {
diff --git a/core/metamodel/src/test/java/org/apache/isis/metamodel/facets/value/JavaSqlTimeValueSemanticsProviderTest.java b/core/metamodel/src/test/java/org/apache/isis/metamodel/facets/value/JavaSqlTimeValueSemanticsProviderTest.java
index 83df836..9d54014 100644
--- a/core/metamodel/src/test/java/org/apache/isis/metamodel/facets/value/JavaSqlTimeValueSemanticsProviderTest.java
+++ b/core/metamodel/src/test/java/org/apache/isis/metamodel/facets/value/JavaSqlTimeValueSemanticsProviderTest.java
@@ -28,6 +28,7 @@ import org.junit.Ignore;
 import org.junit.Test;
 
 import org.apache.isis.config.internal._Config;
+import org.apache.isis.metamodel.MetaModelContextAware;
 import org.apache.isis.metamodel.facetapi.FacetHolder;
 import org.apache.isis.metamodel.facetapi.FacetHolderImpl;
 import org.apache.isis.metamodel.facets.value.timesql.JavaSqlTimeValueSemanticsProvider;
@@ -61,6 +62,8 @@ public class JavaSqlTimeValueSemanticsProviderTest extends ValueSemanticsProvide
         twoOClock = new Time(c.getTimeInMillis());
 
         holder = new FacetHolderImpl();
+        ((MetaModelContextAware)holder).setMetaModelContext(super.metaModelContext);
+        
         setValue(value = new JavaSqlTimeValueSemanticsProvider(holder));
     }
 
diff --git a/core/metamodel/src/test/java/org/apache/isis/metamodel/facets/value/JavaUtilDateValueSemanticsProviderTest.java b/core/metamodel/src/test/java/org/apache/isis/metamodel/facets/value/JavaUtilDateValueSemanticsProviderTest.java
index 4b17dad..0176494 100644
--- a/core/metamodel/src/test/java/org/apache/isis/metamodel/facets/value/JavaUtilDateValueSemanticsProviderTest.java
+++ b/core/metamodel/src/test/java/org/apache/isis/metamodel/facets/value/JavaUtilDateValueSemanticsProviderTest.java
@@ -28,6 +28,7 @@ import org.junit.Before;
 import org.junit.Test;
 
 import org.apache.isis.config.internal._Config;
+import org.apache.isis.metamodel.MetaModelContextAware;
 import org.apache.isis.metamodel.facetapi.FacetHolder;
 import org.apache.isis.metamodel.facetapi.FacetHolderImpl;
 import org.apache.isis.metamodel.facets.object.parseable.TextEntryParseException;
@@ -50,6 +51,8 @@ public class JavaUtilDateValueSemanticsProviderTest extends ValueSemanticsProvid
         date = new java.util.Date(0);
 
         holder = new FacetHolderImpl();
+        ((MetaModelContextAware)holder).setMetaModelContext(super.metaModelContext);
+        
         setValue(new JavaUtilDateValueSemanticsProvider(holder) {
             @Override
             protected String defaultFormat() {
diff --git a/core/metamodel/src/test/java/org/apache/isis/metamodel/facets/value/LongValueSemanticsProviderTest.java b/core/metamodel/src/test/java/org/apache/isis/metamodel/facets/value/LongValueSemanticsProviderTest.java
index 3a8bb4e..d37cad6 100644
--- a/core/metamodel/src/test/java/org/apache/isis/metamodel/facets/value/LongValueSemanticsProviderTest.java
+++ b/core/metamodel/src/test/java/org/apache/isis/metamodel/facets/value/LongValueSemanticsProviderTest.java
@@ -23,6 +23,7 @@ import org.junit.Before;
 import org.junit.Test;
 
 import org.apache.isis.config.internal._Config;
+import org.apache.isis.metamodel.MetaModelContextAware;
 import org.apache.isis.metamodel.facetapi.FacetHolder;
 import org.apache.isis.metamodel.facetapi.FacetHolderImpl;
 import org.apache.isis.metamodel.facets.object.parseable.TextEntryParseException;
@@ -44,6 +45,7 @@ public class LongValueSemanticsProviderTest extends ValueSemanticsProviderAbstra
         longObj = new Long(367322);
         allowMockAdapterToReturn(longObj);
         holder = new FacetHolderImpl();
+        ((MetaModelContextAware)holder).setMetaModelContext(super.metaModelContext);
 
         _Config.put("isis.value.format.long", null);
 
diff --git a/core/metamodel/src/test/java/org/apache/isis/metamodel/facets/value/MoneyValueSemanticsProviderTest.java b/core/metamodel/src/test/java/org/apache/isis/metamodel/facets/value/MoneyValueSemanticsProviderTest.java
index b216987..8581bc1 100644
--- a/core/metamodel/src/test/java/org/apache/isis/metamodel/facets/value/MoneyValueSemanticsProviderTest.java
+++ b/core/metamodel/src/test/java/org/apache/isis/metamodel/facets/value/MoneyValueSemanticsProviderTest.java
@@ -25,6 +25,7 @@ import org.junit.Before;
 import org.junit.Test;
 
 import org.apache.isis.applib.value.Money;
+import org.apache.isis.metamodel.MetaModelContextAware;
 import org.apache.isis.metamodel.facetapi.FacetHolder;
 import org.apache.isis.metamodel.facetapi.FacetHolderImpl;
 import org.apache.isis.metamodel.facets.object.parseable.TextEntryParseException;
@@ -45,6 +46,8 @@ public class MoneyValueSemanticsProviderTest extends ValueSemanticsProviderAbstr
     public void setUpObjects() throws Exception {
         Locale.setDefault(Locale.UK);
         holder = new FacetHolderImpl();
+        ((MetaModelContextAware)holder).setMetaModelContext(super.metaModelContext);
+        
         setValue(adapter = new MoneyValueSemanticsProvider(holder));
     }
 
diff --git a/core/metamodel/src/test/java/org/apache/isis/metamodel/facets/value/PercentageValueSemanticsProviderTest.java b/core/metamodel/src/test/java/org/apache/isis/metamodel/facets/value/PercentageValueSemanticsProviderTest.java
index 9e0581d..5d4e5e4 100644
--- a/core/metamodel/src/test/java/org/apache/isis/metamodel/facets/value/PercentageValueSemanticsProviderTest.java
+++ b/core/metamodel/src/test/java/org/apache/isis/metamodel/facets/value/PercentageValueSemanticsProviderTest.java
@@ -24,6 +24,7 @@ import org.junit.Test;
 
 import org.apache.isis.applib.value.Percentage;
 import org.apache.isis.config.internal._Config;
+import org.apache.isis.metamodel.MetaModelContextAware;
 import org.apache.isis.metamodel.facetapi.FacetHolder;
 import org.apache.isis.metamodel.facetapi.FacetHolderImpl;
 import org.apache.isis.metamodel.facets.value.percentage.PercentageValueSemanticsProvider;
@@ -44,6 +45,7 @@ public class PercentageValueSemanticsProviderTest extends ValueSemanticsProvider
         allowMockAdapterToReturn(percentage);
 
         holder = new FacetHolderImpl();
+        ((MetaModelContextAware)holder).setMetaModelContext(super.metaModelContext);
 
         setValue(adapter = new PercentageValueSemanticsProvider(holder));
     }
diff --git a/core/metamodel/src/test/java/org/apache/isis/metamodel/facets/value/ShortValueSemanticsProviderTest.java b/core/metamodel/src/test/java/org/apache/isis/metamodel/facets/value/ShortValueSemanticsProviderTest.java
index 852ec02..cbb335e 100644
--- a/core/metamodel/src/test/java/org/apache/isis/metamodel/facets/value/ShortValueSemanticsProviderTest.java
+++ b/core/metamodel/src/test/java/org/apache/isis/metamodel/facets/value/ShortValueSemanticsProviderTest.java
@@ -23,6 +23,7 @@ import org.junit.Before;
 import org.junit.Test;
 
 import org.apache.isis.config.internal._Config;
+import org.apache.isis.metamodel.MetaModelContextAware;
 import org.apache.isis.metamodel.facetapi.FacetHolder;
 import org.apache.isis.metamodel.facetapi.FacetHolderImpl;
 import org.apache.isis.metamodel.facets.object.parseable.TextEntryParseException;
@@ -47,6 +48,7 @@ public class ShortValueSemanticsProviderTest extends ValueSemanticsProviderAbstr
         allowMockAdapterToReturn(short1);
 
         holder = new FacetHolderImpl();
+        ((MetaModelContextAware)holder).setMetaModelContext(super.metaModelContext);
 
         setValue(value = new ShortWrapperValueSemanticsProvider(holder));
     }
diff --git a/core/metamodel/src/test/java/org/apache/isis/metamodel/facets/value/ValueSemanticsProviderAbstractTestCase.java b/core/metamodel/src/test/java/org/apache/isis/metamodel/facets/value/ValueSemanticsProviderAbstractTestCase.java
index 6ed109d..0f225f8 100644
--- a/core/metamodel/src/test/java/org/apache/isis/metamodel/facets/value/ValueSemanticsProviderAbstractTestCase.java
+++ b/core/metamodel/src/test/java/org/apache/isis/metamodel/facets/value/ValueSemanticsProviderAbstractTestCase.java
@@ -31,6 +31,7 @@ import org.junit.Test;
 
 import org.apache.isis.config.internal._Config;
 import org.apache.isis.metamodel.MetaModelContext;
+import org.apache.isis.metamodel.MetaModelContext_forTesting;
 import org.apache.isis.metamodel.adapter.ObjectAdapter;
 import org.apache.isis.metamodel.facetapi.FacetHolder;
 import org.apache.isis.metamodel.facets.object.encodeable.EncodableFacet;
@@ -39,7 +40,6 @@ import org.apache.isis.metamodel.facets.object.parseable.ParseableFacet;
 import org.apache.isis.metamodel.facets.object.parseable.parser.ParseableFacetUsingParser;
 import org.apache.isis.metamodel.facets.object.value.vsp.ValueSemanticsProviderAndFacetAbstract;
 import org.apache.isis.metamodel.services.persistsession.ObjectAdapterService;
-import org.apache.isis.metamodel.specloader.SpecificationLoader;
 import org.apache.isis.security.authentication.AuthenticationSessionProvider;
 import org.apache.isis.unittestsupport.jmocking.JUnitRuleMockery2;
 import org.apache.isis.unittestsupport.jmocking.JUnitRuleMockery2.Mode;
@@ -56,41 +56,36 @@ public abstract class ValueSemanticsProviderAbstractTestCase {
     @Rule
     public JUnitRuleMockery2 context = JUnitRuleMockery2.createFor(Mode.INTERFACES_AND_CLASSES);
 
+    @Mock protected FacetHolder mockFacetHolder;
+    @Mock protected ObjectAdapterService mockSessionServiceInternal;
+    //@Mock protected SpecificationLoader mockSpecificationLoader;
+    @Mock protected AuthenticationSessionProvider mockAuthenticationSessionProvider;
+    @Mock protected ObjectAdapter mockAdapter;
+    
+    protected MetaModelContext metaModelContext;
+    
     private ValueSemanticsProviderAndFacetAbstract<?> valueSemanticsProvider;
     private EncodableFacetUsingEncoderDecoder encodeableFacet;
     private ParseableFacetUsingParser parseableFacet;
 
-    @Mock
-    protected FacetHolder mockFacetHolder;
-    @Mock
-    protected ObjectAdapterService mockSessionServiceInternal;
-    @Mock
-    protected SpecificationLoader mockSpecificationLoader;
-    @Mock
-    protected AuthenticationSessionProvider mockAuthenticationSessionProvider;
-    @Mock
-    protected ObjectAdapter mockAdapter;
-
     @Before
     public void setUp() throws Exception {
 
         _Config.clear();
         Locale.setDefault(Locale.UK);
 
-        MetaModelContext.preset(MetaModelContext.builder()
-                .specificationLoader(mockSpecificationLoader)
-                //                .translationService(mockTranslationService)
-                //                .objectAdapterProvider(mockPersistenceSessionServiceInternal)
+        metaModelContext = MetaModelContext_forTesting.builder()
                 .authenticationSessionProvider(mockAuthenticationSessionProvider)
-                .build());
+                .build();
 
         context.checking(new Expectations() {
             {
-                //                allowing(mockServicesInjector).getPersistenceSessionServiceInternal();
-                //                will(returnValue(mockSessionServiceInternal));
 
                 never(mockAuthenticationSessionProvider);
                 never(mockSessionServiceInternal);
+                
+                allowing(mockFacetHolder).getMetaModelContext();
+                will(returnValue(metaModelContext));
             }
         });
     }
diff --git a/core/metamodel/src/test/java/org/apache/isis/metamodel/facets/value/datetimejodalocal/JodaLocalDateTimeValueSemanticsProviderTest.java b/core/metamodel/src/test/java/org/apache/isis/metamodel/facets/value/datetimejodalocal/JodaLocalDateTimeValueSemanticsProviderTest.java
index 5157891..f9f3154 100644
--- a/core/metamodel/src/test/java/org/apache/isis/metamodel/facets/value/datetimejodalocal/JodaLocalDateTimeValueSemanticsProviderTest.java
+++ b/core/metamodel/src/test/java/org/apache/isis/metamodel/facets/value/datetimejodalocal/JodaLocalDateTimeValueSemanticsProviderTest.java
@@ -18,6 +18,7 @@
  */
 package org.apache.isis.metamodel.facets.value.datetimejodalocal;
 
+import org.jmock.Expectations;
 import org.jmock.auto.Mock;
 import org.joda.time.LocalDateTime;
 import org.junit.Before;
@@ -26,6 +27,7 @@ import org.junit.Test;
 
 import org.apache.isis.applib.services.inject.ServiceInjector;
 import org.apache.isis.config.internal._Config;
+import org.apache.isis.metamodel.MetaModelContext_forTesting;
 import org.apache.isis.metamodel.facetapi.FacetHolder;
 import org.apache.isis.unittestsupport.jmocking.JUnitRuleMockery2;
 
@@ -38,21 +40,30 @@ public class JodaLocalDateTimeValueSemanticsProviderTest {
     @Rule
     public JUnitRuleMockery2 context = JUnitRuleMockery2.createFor(JUnitRuleMockery2.Mode.INTERFACES_AND_CLASSES);
 
-    @Mock
-    FacetHolder mockFacetHolder;
+    @Mock FacetHolder mockFacetHolder;
+    @Mock ServiceInjector mockServicesInjector;
 
-    @Mock
-    ServiceInjector mockServicesInjector;
-
-    JodaLocalDateTimeValueSemanticsProvider provider;
+    private JodaLocalDateTimeValueSemanticsProvider provider;
+    private MetaModelContext_forTesting metaModelContext;
 
     @Before
     public void setUp() throws Exception {
 
         _Config.clear();
         _Config.put("isis.value.format.datetime", "iso_encoding");
+        
+        metaModelContext = MetaModelContext_forTesting.builder()
+                .build();
+
+        context.checking(new Expectations() {
+            {
+                oneOf(mockFacetHolder).getMetaModelContext();
+                will(returnValue(metaModelContext));
+            }
+        });
 
         provider = new JodaLocalDateTimeValueSemanticsProvider(mockFacetHolder);
+        
 
     }
 
diff --git a/core/metamodel/src/test/java/org/apache/isis/metamodel/services/ServiceInjectorDefaultTest_validateServices.java b/core/metamodel/src/test/java/org/apache/isis/metamodel/services/ServiceInjectorDefaultTest_validateServices.java
index 547f8c6..665078e 100644
--- a/core/metamodel/src/test/java/org/apache/isis/metamodel/services/ServiceInjectorDefaultTest_validateServices.java
+++ b/core/metamodel/src/test/java/org/apache/isis/metamodel/services/ServiceInjectorDefaultTest_validateServices.java
@@ -25,7 +25,6 @@ import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.Disabled;
 import org.junit.jupiter.api.Test;
 import org.springframework.boot.test.context.SpringBootTest;
-import org.springframework.context.ApplicationContext;
 import org.springframework.context.annotation.Profile;
 import org.springframework.stereotype.Component;
 import org.springframework.test.context.ActiveProfiles;
@@ -33,7 +32,6 @@ import org.springframework.test.context.ActiveProfiles;
 import org.apache.isis.applib.annotation.DomainService;
 import org.apache.isis.applib.services.registry.ServiceRegistry;
 import org.apache.isis.commons.internal.context._Context;
-import org.apache.isis.commons.internal.ioc.spring._Spring;
 import org.apache.isis.metamodel.services.registry.ServiceRegistryDefault;
 
 import static org.junit.jupiter.api.Assertions.assertEquals;
@@ -65,12 +63,10 @@ class ServiceInjectorDefaultTest_validateServices {
     // -- TESTS
 
     @Inject private ServiceRegistry serviceRegistry;
-    @Inject private ApplicationContext applicationContext;
 
     @BeforeEach
     void setup() {
         _Context.clear();
-        _Spring.init(applicationContext);    
     }
 
     @Test 
diff --git a/core/metamodel/src/test/java/org/apache/isis/metamodel/specloader/SpecificationLoaderTestAbstract.java b/core/metamodel/src/test/java/org/apache/isis/metamodel/specloader/SpecificationLoaderTestAbstract.java
index c8c85de0..a15d1a4 100644
--- a/core/metamodel/src/test/java/org/apache/isis/metamodel/specloader/SpecificationLoaderTestAbstract.java
+++ b/core/metamodel/src/test/java/org/apache/isis/metamodel/specloader/SpecificationLoaderTestAbstract.java
@@ -28,11 +28,12 @@ import org.springframework.core.env.ConfigurableEnvironment;
 import org.apache.isis.applib.services.grid.GridService;
 import org.apache.isis.applib.services.i18n.TranslationService;
 import org.apache.isis.applib.services.i18n.TranslationService.Mode;
+import org.apache.isis.applib.services.inject.ServiceInjector;
 import org.apache.isis.applib.services.message.MessageService;
 import org.apache.isis.commons.internal.base._Timing;
-import org.apache.isis.commons.internal.environment.IsisSystemEnvironment;
 import org.apache.isis.config.IsisConfiguration;
 import org.apache.isis.metamodel.MetaModelContext;
+import org.apache.isis.metamodel.MetaModelContext_forTesting;
 import org.apache.isis.metamodel.facetapi.Facet;
 import org.apache.isis.metamodel.facets.actcoll.typeof.TypeOfFacet;
 import org.apache.isis.metamodel.facets.all.describedas.DescribedAsFacet;
@@ -57,64 +58,48 @@ abstract class SpecificationLoaderTestAbstract {
 
     static class Producers {
 
-        //@Produces
         ConfigurableEnvironment newConfigurableEnvironment() {
             val mock = Mockito.mock(ConfigurableEnvironment.class);
             when(mock.getProperty("")).thenReturn("nop");
             return mock;
         }
 
-        
-        //@Produces
         IsisConfiguration newConfiguration() {
             val config = new IsisConfiguration(); // uses defaults!
             config.setEnvironment(newConfigurableEnvironment());
             return config;
         }
 
-        //@Produces
         AuthenticationSessionProvider mockAuthenticationSessionProvider() {
             return Mockito.mock(AuthenticationSessionProvider.class);
         }
 
-        //@Produces
         GridService mockGridService() {
             return Mockito.mock(GridService.class);
         }
 
-        //@Produces
         ObjectAdapterService mockPersistenceSessionServiceInternal() {
             return Mockito.mock(ObjectAdapterService.class);
         }
 
-        //@Produces
         MessageService mockMessageService() {
             return Mockito.mock(MessageService.class);
         }
 
-        //@Produces
         TranslationService mockTranslationService() {
             val mock = Mockito.mock(TranslationService.class);
             when(mock.getMode()).thenReturn(Mode.DISABLED);
             return mock;
         }
 
+        ServiceInjector getServiceInjector() {
+            return Mockito.mock(ServiceInjector.class);
+        }
         
         ProgrammingModel getProgrammingModel() {
-            return  new ProgrammingModelFacetsJava8();
+            return new ProgrammingModelFacetsJava8();
         }
         
-        //@Produces
-        SpecificationLoader getSpecificationLoader(
-                IsisConfiguration configuration,
-                ProgrammingModel programmingModel) {
-            
-            return SpecificationLoaderDefault.getInstance(
-                    configuration,
-                    new IsisSystemEnvironment(),
-                    programmingModel);
-        }
-
     }
 
     protected IsisConfiguration isisConfiguration;
@@ -123,13 +108,12 @@ abstract class SpecificationLoaderTestAbstract {
     protected GridService mockGridService;
     protected ObjectAdapterService mockPersistenceSessionServiceInternal;
     protected MessageService mockMessageService;
-
+    protected MetaModelContext metaModelContext;
 
 
     // is loaded by subclasses
     protected ObjectSpecification specification;
 
-
     @BeforeEach
     public void setUp() throws Exception {
 
@@ -139,22 +123,19 @@ abstract class SpecificationLoaderTestAbstract {
         
         val programmingModel = producers.getProgrammingModel();
 
-        MetaModelContext.preset(MetaModelContext.builder()
+        metaModelContext = MetaModelContext_forTesting.builder()
                 .configuration(isisConfiguration = producers.newConfiguration())
-                .specificationLoader(specificationLoader = producers
-                    .getSpecificationLoader(
-                            isisConfiguration,
-                            programmingModel
-                            )
-                    )
+                .programmingModel(programmingModel)
                 .translationService(producers.mockTranslationService())
                 .objectAdapterProvider(mockPersistenceSessionServiceInternal = producers.mockPersistenceSessionServiceInternal())
                 .authenticationSessionProvider(mockAuthenticationSessionProvider = producers.mockAuthenticationSessionProvider())
                 .singleton(mockMessageService = producers.mockMessageService())
                 .singleton(mockGridService = producers.mockGridService())
-                .build());
-
-        ((ProgrammingModelAbstract)programmingModel).init(new ProgrammingModelInitFilterDefault());
+                .build();
+        
+        specificationLoader = metaModelContext.getSpecificationLoader();
+        
+        ((ProgrammingModelAbstract)programmingModel).init(new ProgrammingModelInitFilterDefault(), metaModelContext);
 
         _Timing.runVerbose("specificationLoader.createMetaModel()", specificationLoader::createMetaModel);
 
diff --git a/core/plugins/jaxrs-resteasy-4/pom.xml b/core/plugins/jaxrs-resteasy-4/pom.xml
index 8cf2ddd..8116e7e 100644
--- a/core/plugins/jaxrs-resteasy-4/pom.xml
+++ b/core/plugins/jaxrs-resteasy-4/pom.xml
@@ -9,7 +9,8 @@
 	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"
+<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>
 
@@ -65,7 +66,7 @@
 				</exclusion>
 			</exclusions>
 		</dependency>
-		
+
 		<dependency>
 			<groupId>org.apache.isis.core</groupId>
 			<artifactId>isis-viewer-restfulobjects-server</artifactId>
@@ -76,9 +77,9 @@
 			<artifactId>resteasy-jackson-provider</artifactId>
 			<version>${resteasy4-jaxrs.version}</version>
 		</dependency>
-		
-		<!-- OVERRIDES RestEasy JAX-B 2.3, to be the newest,
-			such that code can run on JDK 11+ -->
+
+		<!-- OVERRIDES RestEasy JAX-B 2.3, to be the newest, such that code can 
+			run on JDK 11+ -->
 		<dependency>
 			<groupId>org.jboss.resteasy</groupId>
 			<artifactId>resteasy-jaxb-provider</artifactId>
@@ -153,31 +154,38 @@
 			<groupId>com.fasterxml.jackson.module</groupId>
 			<artifactId>jackson-module-jaxb-annotations</artifactId>
 		</dependency>
-		
+
 		<!-- TEST DEPENDENCIES -->
-		
+
 		<dependency>
-            <groupId>org.apache.isis.core</groupId>
-            <artifactId>isis-unittestsupport</artifactId>
-            <scope>test</scope>
-            <exclusions>
-            	<exclusion>
-            		<groupId>javax.xml.bind</groupId>
-            		<artifactId>jaxb-api</artifactId>
-            	</exclusion>
-            	<exclusion>
-            		<groupId>org.glassfish.jaxb</groupId>
-            		<artifactId>jaxb-runtime</artifactId>
-            	</exclusion>
-            </exclusions>
+			<groupId>org.apache.isis.core</groupId>
+			<artifactId>isis-unittestsupport</artifactId>
+			<scope>test</scope>
+			<exclusions>
+				<exclusion>
+					<groupId>javax.xml.bind</groupId>
+					<artifactId>jaxb-api</artifactId>
+				</exclusion>
+				<exclusion>
+					<groupId>org.glassfish.jaxb</groupId>
+					<artifactId>jaxb-runtime</artifactId>
+				</exclusion>
+			</exclusions>
+		</dependency>
+
+		<dependency>
+			<groupId>org.apache.isis.core</groupId>
+			<artifactId>isis-metamodel</artifactId>
+			<type>test-jar</type>
+			<scope>test</scope>
+		</dependency>
+
+		<dependency>
+			<groupId>org.apache.isis.core</groupId>
+			<artifactId>isis-viewer-restfulobjects-server</artifactId>
+			<type>test-jar</type>
+			<scope>test</scope>
 		</dependency>
-        
-        <dependency>
-            <groupId>org.apache.isis.core</groupId>
-            <artifactId>isis-viewer-restfulobjects-server</artifactId>
-            <type>test-jar</type>            
-            <scope>test</scope>
-        </dependency>
 
 		<dependency>
 			<groupId>org.apache.isis.core</groupId>
diff --git a/core/plugins/jaxrs-resteasy-4/src/main/java/org/apache/isis/viewer/restfulobjects/server/conneg/RestfulObjectsJaxbWriterForXml.java b/core/plugins/jaxrs-resteasy-4/src/main/java/org/apache/isis/viewer/restfulobjects/server/conneg/RestfulObjectsJaxbWriterForXml.java
index 9588a2a..8ed5043 100644
--- a/core/plugins/jaxrs-resteasy-4/src/main/java/org/apache/isis/viewer/restfulobjects/server/conneg/RestfulObjectsJaxbWriterForXml.java
+++ b/core/plugins/jaxrs-resteasy-4/src/main/java/org/apache/isis/viewer/restfulobjects/server/conneg/RestfulObjectsJaxbWriterForXml.java
@@ -21,6 +21,7 @@ package org.apache.isis.viewer.restfulobjects.server.conneg;
 import java.lang.annotation.Annotation;
 import java.lang.reflect.Type;
 
+import javax.inject.Inject;
 import javax.ws.rs.Produces;
 import javax.ws.rs.core.MediaType;
 import javax.ws.rs.ext.Provider;
@@ -28,23 +29,26 @@ import javax.xml.bind.Marshaller;
 
 import org.jboss.resteasy.plugins.providers.jaxb.JAXBXmlRootElementProvider;
 
-import org.apache.isis.applib.services.bookmark.BookmarkService;
-import org.apache.isis.applib.services.registry.ServiceRegistry;
-import org.apache.isis.runtime.system.context.IsisContext;
-import org.apache.isis.runtime.system.session.IsisSessionFactory;
+import org.apache.isis.applib.services.inject.ServiceInjector;
 import org.apache.isis.schema.utils.jaxbadapters.PersistentEntityAdapter;
 
+import lombok.val;
+
 @Provider
 @Produces({"application/xml", "application/*+xml", "text/*+xml"})
 public class RestfulObjectsJaxbWriterForXml extends JAXBXmlRootElementProvider {
+    
+    @Inject private ServiceInjector serviceInjector;
 
-    public RestfulObjectsJaxbWriterForXml(){
-        ;
-    }
-
-    @Override protected boolean isReadWritable(
-            final Class<?> type, final Type genericType, final Annotation[] annotations, final MediaType mediaType) {
-        return super.isReadWritable(type, genericType, annotations, mediaType) && hasXRoDomainTypeParameter(mediaType);
+    @Override 
+    protected boolean isReadWritable(
+            final Class<?> type, 
+            final Type genericType, 
+            final Annotation[] annotations, 
+            final MediaType mediaType) {
+        
+        return super.isReadWritable(type, genericType, annotations, mediaType) && 
+                hasXRoDomainTypeParameter(mediaType);
     }
 
     protected boolean hasXRoDomainTypeParameter(final MediaType mediaType) {
@@ -53,22 +57,16 @@ public class RestfulObjectsJaxbWriterForXml extends JAXBXmlRootElementProvider {
 
     @Override
     protected Marshaller getMarshaller(
-            final Class<?> type, final Annotation[] annotations, final MediaType mediaType) {
-        final Marshaller marshaller = super.getMarshaller(type, annotations, mediaType);
-        marshaller.setAdapter(PersistentEntityAdapter.class, new PersistentEntityAdapter() {
-            @Override
-            protected BookmarkService getBookmarkService() {
-                return getServiceRegistry().lookupServiceElseFail(BookmarkService.class);
-            }
-        });
+            final Class<?> type, 
+            final Annotation[] annotations, 
+            final MediaType mediaType) {
+        
+        val adapter = serviceInjector.injectServicesInto(new PersistentEntityAdapter());
+        
+        val marshaller = super.getMarshaller(type, annotations, mediaType);
+        marshaller.setAdapter(PersistentEntityAdapter.class, adapter);
         return marshaller;
     }
 
-    ServiceRegistry getServiceRegistry() {
-        return IsisContext.getServiceRegistry();
-    }
 
-    IsisSessionFactory getIsisSessionFactory() {
-        return IsisContext.getSessionFactory();
-    }
 }
diff --git a/core/plugins/jdo/common/src/main/java/org/apache/isis/jdo/datanucleus/service/JdoPersistenceLifecycleService.java b/core/plugins/jdo/common/src/main/java/org/apache/isis/jdo/datanucleus/service/JdoPersistenceLifecycleService.java
index 8612b1a..dd6a1d8 100644
--- a/core/plugins/jdo/common/src/main/java/org/apache/isis/jdo/datanucleus/service/JdoPersistenceLifecycleService.java
+++ b/core/plugins/jdo/common/src/main/java/org/apache/isis/jdo/datanucleus/service/JdoPersistenceLifecycleService.java
@@ -29,6 +29,7 @@ import org.springframework.stereotype.Service;
 import org.apache.isis.commons.internal.context._Context;
 import org.apache.isis.commons.internal.exceptions._Exceptions;
 import org.apache.isis.config.registry.IsisBeanTypeRegistry;
+import org.apache.isis.metamodel.MetaModelContext;
 import org.apache.isis.metamodel.specloader.SpecificationLoader;
 import org.apache.isis.runtime.persistence.IsisJdoRuntimePlugin;
 import org.apache.isis.runtime.system.context.session.AppLifecycleEvent;
@@ -43,7 +44,9 @@ import lombok.extern.log4j.Log4j2;
 @Service @Log4j2
 public class JdoPersistenceLifecycleService {
 
+    @Inject private MetaModelContext metaModelContext;
     @Inject private SpecificationLoader specificationLoader;
+    
     private PersistenceSessionFactory persistenceSessionFactory;
 
     @PostConstruct
@@ -139,7 +142,7 @@ public class JdoPersistenceLifecycleService {
     private void create() {
         persistenceSessionFactory = 
                 IsisJdoRuntimePlugin.get().getPersistenceSessionFactory();
-        persistenceSessionFactory.init();
+        persistenceSessionFactory.init(metaModelContext);
     }
 
     private void init() {
diff --git a/core/plugins/jdo/common/src/main/java/org/apache/isis/jdo/entities/JdoEntityTypeRegistry.java b/core/plugins/jdo/common/src/main/java/org/apache/isis/jdo/entities/JdoEntityTypeRegistry.java
index 391d375..e899f73 100644
--- a/core/plugins/jdo/common/src/main/java/org/apache/isis/jdo/entities/JdoEntityTypeRegistry.java
+++ b/core/plugins/jdo/common/src/main/java/org/apache/isis/jdo/entities/JdoEntityTypeRegistry.java
@@ -29,7 +29,6 @@ import org.apache.isis.commons.internal.collections._Lists;
 import org.apache.isis.commons.internal.context._Context;
 import org.apache.isis.config.registry.IsisBeanTypeRegistry;
 import org.apache.isis.metamodel.JdoMetamodelUtil;
-import org.apache.isis.runtime.system.context.IsisContext;
 
 import static org.apache.isis.commons.internal.base._NullSafe.stream;
 
@@ -54,11 +53,6 @@ public class JdoEntityTypeRegistry {
 
     private Set<String> findEntityTypes() {
 
-        val serviceRegistry = IsisContext.getServiceRegistry();
-        if(serviceRegistry == null) {
-            throw new IllegalStateException("ServiceRegistry is required");
-        }
-
         val entityTypes = new LinkedHashSet<String>();
 
         Set<Class<?>> persistenceCapableTypes = 
diff --git a/core/plugins/jdo/common/src/main/java/org/apache/isis/jdo/lifecycles/JdoStoreLifecycleListenerForIsis.java b/core/plugins/jdo/common/src/main/java/org/apache/isis/jdo/lifecycles/JdoStoreLifecycleListenerForIsis.java
index d795dbb..03c30c2 100644
--- a/core/plugins/jdo/common/src/main/java/org/apache/isis/jdo/lifecycles/JdoStoreLifecycleListenerForIsis.java
+++ b/core/plugins/jdo/common/src/main/java/org/apache/isis/jdo/lifecycles/JdoStoreLifecycleListenerForIsis.java
@@ -18,11 +18,10 @@
  */
 package org.apache.isis.jdo.lifecycles;
 
+import javax.inject.Inject;
 import javax.jdo.listener.InstanceLifecycleEvent;
 
-import org.apache.isis.commons.internal.base._Lazy;
 import org.apache.isis.metamodel.JdoMetamodelUtil;
-import org.apache.isis.runtime.system.context.IsisContext;
 import org.apache.isis.runtime.system.persistence.events.PersistenceEventService;
 import org.apache.isis.runtime.system.persistence.events.PostStoreEvent;
 import org.apache.isis.runtime.system.persistence.events.PreStoreEvent;
@@ -38,6 +37,8 @@ import lombok.val;
  */
 public class JdoStoreLifecycleListenerForIsis implements
 javax.jdo.listener.StoreLifecycleListener {
+    
+    @Inject private PersistenceEventService persistenceEventService;
 
     @Override
     public void preStore(InstanceLifecycleEvent instanceEvent) {
@@ -48,7 +49,7 @@ javax.jdo.listener.StoreLifecycleListener {
                 JdoMetamodelUtil.isPersistenceEnhanced(persistableObject.getClass())) {
 
             val event = PreStoreEvent.of(persistableObject);
-            persistenceEventService.get().firePreStoreEvent(event);
+            persistenceEventService.firePreStoreEvent(event);
         }
         
     }
@@ -62,18 +63,10 @@ javax.jdo.listener.StoreLifecycleListener {
                 JdoMetamodelUtil.isPersistenceEnhanced(persistableObject.getClass())) {
 
             val event = PostStoreEvent.of(persistableObject);
-            persistenceEventService.get().firePostStoreEvent(event);
+            persistenceEventService.firePostStoreEvent(event);
         }
         
     }
     
-    // -- HELPER
-    
-    private final _Lazy<PersistenceEventService> persistenceEventService = 
-            _Lazy.threadSafe(this::lookupPersistenceEventService);
-    
-    private PersistenceEventService lookupPersistenceEventService() {
-        return IsisContext.getServiceRegistry().lookupServiceElseFail(PersistenceEventService.class);
-    }
 
 }
diff --git a/core/plugins/jdo/common/src/main/java/org/apache/isis/jdo/metamodel/facets/object/query/JdoQueryAnnotationFacetFactory.java b/core/plugins/jdo/common/src/main/java/org/apache/isis/jdo/metamodel/facets/object/query/JdoQueryAnnotationFacetFactory.java
index dca4fc6..a71a401 100644
--- a/core/plugins/jdo/common/src/main/java/org/apache/isis/jdo/metamodel/facets/object/query/JdoQueryAnnotationFacetFactory.java
+++ b/core/plugins/jdo/common/src/main/java/org/apache/isis/jdo/metamodel/facets/object/query/JdoQueryAnnotationFacetFactory.java
@@ -26,7 +26,6 @@ import javax.jdo.annotations.Query;
 
 import org.apache.isis.metamodel.JdoMetamodelUtil;
 import org.apache.isis.metamodel.facetapi.FacetHolder;
-import org.apache.isis.metamodel.facetapi.FacetUtil;
 import org.apache.isis.metamodel.facetapi.FeatureType;
 import org.apache.isis.metamodel.facetapi.MetaModelRefiner;
 import org.apache.isis.metamodel.facets.Annotations;
@@ -55,14 +54,14 @@ implements MetaModelRefiner {
         final FacetHolder facetHolder = processClassContext.getFacetHolder();
 
         if (namedQueriesAnnotation != null) {
-            FacetUtil.addFacet(new JdoQueriesFacetAnnotation(
+            super.addFacet(new JdoQueriesFacetAnnotation(
                     namedQueriesAnnotation.value(), facetHolder));
             return;
         }
 
         final Query namedQueryAnnotation = Annotations.getAnnotation(cls, Query.class);
         if (namedQueryAnnotation != null) {
-            FacetUtil.addFacet(new JdoQueryFacetAnnotation(
+            super.addFacet(new JdoQueryFacetAnnotation(
                     namedQueryAnnotation, facetHolder));
         }
     }
diff --git a/core/plugins/jdo/common/src/main/java/org/apache/isis/jdo/metamodel/facets/prop/column/BigDecimalDerivedFromJdoColumnAnnotationFacetFactory.java b/core/plugins/jdo/common/src/main/java/org/apache/isis/jdo/metamodel/facets/prop/column/BigDecimalDerivedFromJdoColumnAnnotationFacetFactory.java
index 8e50b77..b12cfcd 100644
--- a/core/plugins/jdo/common/src/main/java/org/apache/isis/jdo/metamodel/facets/prop/column/BigDecimalDerivedFromJdoColumnAnnotationFacetFactory.java
+++ b/core/plugins/jdo/common/src/main/java/org/apache/isis/jdo/metamodel/facets/prop/column/BigDecimalDerivedFromJdoColumnAnnotationFacetFactory.java
@@ -26,7 +26,6 @@ import javax.jdo.annotations.IdentityType;
 
 import org.apache.isis.jdo.metamodel.facets.object.persistencecapable.JdoPersistenceCapableFacet;
 import org.apache.isis.jdo.metamodel.facets.prop.notpersistent.JdoNotPersistentFacet;
-import org.apache.isis.metamodel.facetapi.FacetUtil;
 import org.apache.isis.metamodel.facetapi.FeatureType;
 import org.apache.isis.metamodel.facetapi.MetaModelRefiner;
 import org.apache.isis.metamodel.facets.FacetFactoryAbstract;
@@ -74,7 +73,7 @@ implements MetaModelRefiner {
                 // do nothing
             } else {
                 final BigDecimalValueFacet facet = new BigDecimalFacetFallback(holder);
-                FacetUtil.addFacet(facet);
+                super.addFacet(facet);
             }
         } else {
 
@@ -91,7 +90,7 @@ implements MetaModelRefiner {
             Integer length = valueElseDefaults(jdoColumnAnnotation.length(), existingLength, DEFAULT_LENGTH);
             Integer scale = valueElseDefaults(jdoColumnAnnotation.scale(), existingScale, DEFAULT_SCALE);
             final BigDecimalValueFacet facet = new BigDecimalFacetDerivedFromJdoColumn(holder, length, scale);
-            FacetUtil.addFacet(facet);
+            super.addFacet(facet);
         }
     }
 
diff --git a/core/plugins/jdo/common/src/main/java/org/apache/isis/jdo/metamodel/facets/prop/primarykey/JdoPrimaryKeyAnnotationFacetFactory.java b/core/plugins/jdo/common/src/main/java/org/apache/isis/jdo/metamodel/facets/prop/primarykey/JdoPrimaryKeyAnnotationFacetFactory.java
index 37e9a83..0de23a1 100644
--- a/core/plugins/jdo/common/src/main/java/org/apache/isis/jdo/metamodel/facets/prop/primarykey/JdoPrimaryKeyAnnotationFacetFactory.java
+++ b/core/plugins/jdo/common/src/main/java/org/apache/isis/jdo/metamodel/facets/prop/primarykey/JdoPrimaryKeyAnnotationFacetFactory.java
@@ -21,7 +21,6 @@ package org.apache.isis.jdo.metamodel.facets.prop.primarykey;
 import javax.jdo.annotations.PrimaryKey;
 
 import org.apache.isis.metamodel.JdoMetamodelUtil;
-import org.apache.isis.metamodel.facetapi.FacetUtil;
 import org.apache.isis.metamodel.facetapi.FeatureType;
 import org.apache.isis.metamodel.facets.Annotations;
 import org.apache.isis.metamodel.facets.FacetFactoryAbstract;
@@ -49,8 +48,8 @@ public class JdoPrimaryKeyAnnotationFacetFactory extends FacetFactoryAbstract {
         }
 
         final FacetedMethod holder = processMethodContext.getFacetHolder();
-        FacetUtil.addFacet(new JdoPrimaryKeyFacetAnnotation(holder));
-        FacetUtil.addFacet(new OptionalFacetDerivedFromJdoPrimaryKeyAnnotation(holder));
-        FacetUtil.addFacet(new DisabledFacetDerivedFromJdoPrimaryKeyAnnotation(holder));
+        super.addFacet(new JdoPrimaryKeyFacetAnnotation(holder));
+        super.addFacet(new OptionalFacetDerivedFromJdoPrimaryKeyAnnotation(holder));
+        super.addFacet(new DisabledFacetDerivedFromJdoPrimaryKeyAnnotation(holder));
     }
 }
diff --git a/core/plugins/jdo/common/src/main/java/org/apache/isis/jdo/persistence/IsisPersistenceSessionJdoBase.java b/core/plugins/jdo/common/src/main/java/org/apache/isis/jdo/persistence/IsisPersistenceSessionJdoBase.java
index c55bc60..abec0c0 100644
--- a/core/plugins/jdo/common/src/main/java/org/apache/isis/jdo/persistence/IsisPersistenceSessionJdoBase.java
+++ b/core/plugins/jdo/common/src/main/java/org/apache/isis/jdo/persistence/IsisPersistenceSessionJdoBase.java
@@ -35,10 +35,10 @@ import org.apache.isis.applib.services.user.UserService;
 import org.apache.isis.commons.internal.collections._Maps;
 import org.apache.isis.config.IsisConfiguration;
 import org.apache.isis.jdo.datanucleus.persistence.queries.PersistenceQueryProcessor;
+import org.apache.isis.metamodel.MetaModelContext;
 import org.apache.isis.metamodel.commons.ToString;
 import org.apache.isis.metamodel.specloader.SpecificationLoader;
 import org.apache.isis.runtime.persistence.FixturesInstalledStateHolder;
-import org.apache.isis.runtime.system.context.IsisContext;
 import org.apache.isis.runtime.system.persistence.PersistenceQueryFactory;
 import org.apache.isis.runtime.system.transaction.ChangedObjectsServiceInternal;
 import org.apache.isis.security.authentication.AuthenticationSession;
@@ -57,8 +57,9 @@ abstract class IsisPersistenceSessionJdoBase implements IsisPersistenceSessionJd
     protected final SpecificationLoader specificationLoader;
     protected final AuthenticationSession authenticationSession;
 
-    @Getter 
-    protected final ServiceInjector serviceInjector;
+    @Getter protected final MetaModelContext metaModelContext;
+    @Getter protected final ServiceInjector serviceInjector;
+    
     protected final ServiceRegistry serviceRegistry;
 
     protected final CommandContext commandContext;
@@ -81,7 +82,7 @@ abstract class IsisPersistenceSessionJdoBase implements IsisPersistenceSessionJd
      * Used to create the {@link #persistenceManager} when {@link #open()}ed.
      */
     protected final PersistenceManagerFactory jdoPersistenceManagerFactory;
-
+    
     IsisTransactionManagerJdo transactionManager;
 
     /**
@@ -101,6 +102,7 @@ abstract class IsisPersistenceSessionJdoBase implements IsisPersistenceSessionJd
      * persisted objects and persist changes to the object that are saved.
      */
     protected IsisPersistenceSessionJdoBase(
+            final MetaModelContext metaModelContext,
             final AuthenticationSession authenticationSession,
             final PersistenceManagerFactory jdoPersistenceManagerFactory,
             final FixturesInstalledStateHolder fixturesInstalledStateHolder) {
@@ -109,14 +111,15 @@ abstract class IsisPersistenceSessionJdoBase implements IsisPersistenceSessionJd
             log.debug("creating {}", this);
         }
 
-        this.serviceInjector = IsisContext.getServiceInjector();
-        this.serviceRegistry = IsisContext.getServiceRegistry();
+        this.metaModelContext = metaModelContext;
+        this.serviceInjector = metaModelContext.getServiceInjector();
+        this.serviceRegistry = metaModelContext.getServiceRegistry();
         this.jdoPersistenceManagerFactory = jdoPersistenceManagerFactory;
         this.fixturesInstalledStateHolder = fixturesInstalledStateHolder;
 
         // injected
-        this.configuration = IsisContext.getConfiguration();
-        this.specificationLoader = IsisContext.getSpecificationLoader();
+        this.configuration = metaModelContext.getConfiguration();
+        this.specificationLoader = metaModelContext.getSpecificationLoader();
         this.authenticationSession = authenticationSession;
 
         this.commandContext = lookupService(CommandContext.class);
@@ -132,7 +135,7 @@ abstract class IsisPersistenceSessionJdoBase implements IsisPersistenceSessionJd
         this.persistenceQueryFactory = PersistenceQueryFactory.of(
                 obj->this.getObjectAdapterProvider().adapterFor(obj), 
                 this.specificationLoader);
-        this.transactionManager = new IsisTransactionManagerJdo(this);
+        this.transactionManager = new IsisTransactionManagerJdo(serviceRegistry, this);
 
         this.state = State.NOT_INITIALIZED;
     }
diff --git a/core/plugins/jdo/common/src/main/java/org/apache/isis/jdo/persistence/IsisTransactionJdo.java b/core/plugins/jdo/common/src/main/java/org/apache/isis/jdo/persistence/IsisTransactionJdo.java
index 8020ace..6cfeaf8 100644
--- a/core/plugins/jdo/common/src/main/java/org/apache/isis/jdo/persistence/IsisTransactionJdo.java
+++ b/core/plugins/jdo/common/src/main/java/org/apache/isis/jdo/persistence/IsisTransactionJdo.java
@@ -26,6 +26,7 @@ import javax.enterprise.inject.Vetoed;
 
 import org.apache.isis.applib.annotation.Programmatic;
 import org.apache.isis.applib.services.WithTransactionScope;
+import org.apache.isis.applib.services.registry.ServiceRegistry;
 import org.apache.isis.applib.services.xactn.Transaction;
 import org.apache.isis.applib.services.xactn.TransactionId;
 import org.apache.isis.applib.services.xactn.TransactionState;
@@ -161,14 +162,13 @@ public class IsisTransactionJdo implements TransactionScopedComponent, Transacti
     private IsisException abortCause;
 
     public IsisTransactionJdo(
+            final ServiceRegistry serviceRegistry,
             final UUID interactionId,
             final int sequence) {
 
         id = TransactionId.of(interactionId, sequence);
         //        this.authenticationSession = authenticationSession;
 
-        val serviceRegistry = IsisContext.getServiceRegistry();
-
         //        this.messageBroker = authenticationSession.getMessageBroker();
         this.publishingServiceInternal = serviceRegistry.lookupServiceElseFail(PublishingServiceInternal.class);
         this.auditingServiceInternal = serviceRegistry.lookupServiceElseFail(AuditingServiceInternal.class);
diff --git a/core/plugins/jdo/common/src/main/java/org/apache/isis/jdo/persistence/IsisTransactionManagerJdo.java b/core/plugins/jdo/common/src/main/java/org/apache/isis/jdo/persistence/IsisTransactionManagerJdo.java
index 83e6a29..8055ca8 100644
--- a/core/plugins/jdo/common/src/main/java/org/apache/isis/jdo/persistence/IsisTransactionManagerJdo.java
+++ b/core/plugins/jdo/common/src/main/java/org/apache/isis/jdo/persistence/IsisTransactionManagerJdo.java
@@ -29,7 +29,6 @@ import org.apache.isis.applib.services.registry.ServiceRegistry;
 import org.apache.isis.commons.exceptions.IsisException;
 import org.apache.isis.commons.internal.components.SessionScopedComponent;
 import org.apache.isis.runtime.persistence.objectstore.transaction.PersistenceCommand;
-import org.apache.isis.runtime.system.context.IsisContext;
 import org.apache.isis.runtime.system.persistence.PersistenceSession;
 import org.apache.isis.runtime.system.transaction.IsisTransactionAspectSupport;
 import org.apache.isis.runtime.system.transaction.IsisTransactionManagerException;
@@ -46,16 +45,15 @@ class IsisTransactionManagerJdo implements SessionScopedComponent {
 
     @Getter
     private final PersistenceSession persistenceSession;
-    private final ServiceRegistry serviceRegistry;
 
+    private final ServiceRegistry serviceRegistry;
     private final CommandContext commandContext;
     private final InteractionContext interactionContext;
 
-    IsisTransactionManagerJdo(PersistenceSession persistenceSession) {
+    IsisTransactionManagerJdo(ServiceRegistry serviceRegistry, PersistenceSession persistenceSession) {
 
+        this.serviceRegistry = serviceRegistry;
         this.persistenceSession = persistenceSession;
-        this.serviceRegistry = IsisContext.getServiceRegistry();
-
         this.commandContext = serviceRegistry.lookupServiceElseFail(CommandContext.class);
         this.interactionContext = serviceRegistry.lookupServiceElseFail(InteractionContext.class);
     }
@@ -101,7 +99,7 @@ class IsisTransactionManagerJdo implements SessionScopedComponent {
             val command = commandContext.getCommand();
             val transactionId = command.getUniqueId();
 
-            val currentTransaction = new IsisTransactionJdo(transactionId,
+            val currentTransaction = new IsisTransactionJdo(serviceRegistry, transactionId,
                     interaction.next(Interaction.Sequence.TRANSACTION.id()));
 
             persistenceSession.startTransaction();
diff --git a/core/plugins/jdo/common/src/test/java/org/apache/isis/jdo/metamodel/facets/object/version/JdoVersionAnnotationFacetFactoryTest_refineMetaModel.java b/core/plugins/jdo/common/src/test/java/org/apache/isis/jdo/metamodel/facets/object/version/JdoVersionAnnotationFacetFactoryTest_refineMetaModel.java
index 8f716e2..eebcb84 100644
--- a/core/plugins/jdo/common/src/test/java/org/apache/isis/jdo/metamodel/facets/object/version/JdoVersionAnnotationFacetFactoryTest_refineMetaModel.java
+++ b/core/plugins/jdo/common/src/test/java/org/apache/isis/jdo/metamodel/facets/object/version/JdoVersionAnnotationFacetFactoryTest_refineMetaModel.java
@@ -27,6 +27,7 @@ import org.junit.Rule;
 import org.junit.Test;
 
 import org.apache.isis.applib.Identifier;
+import org.apache.isis.metamodel.MetaModelContext;
 import org.apache.isis.metamodel.facets.all.deficiencies.DeficiencyFacet;
 import org.apache.isis.metamodel.spec.ObjectSpecification;
 import org.apache.isis.metamodel.specloader.validator.MetaModelValidator;
@@ -61,9 +62,16 @@ public class JdoVersionAnnotationFacetFactoryTest_refineMetaModel {
         mockParentType = context.mock(ObjectSpecification.class, "mockParenttype");
         mockGrandParentType = context.mock(ObjectSpecification.class, "mockGrandParenttype");
 
+        val mockMetaModelContext = context.mock(MetaModelContext.class, "mockMetaModelContext");
+        
         sequence = context.sequence("inorder");
 
-        validator = new MetaModelValidatorAbstract() {};
+        validator = new MetaModelValidatorAbstract() {
+            {
+                setMetaModelContext(mockMetaModelContext);
+            }
+        };
+        
         newValidatorVisitor = new JdoVersionAnnotationFacetFactory().newValidatorVisitor();
                 
     }
diff --git a/core/plugins/jdo/datanucleus-5/src/main/java/org/apache/isis/jdo/datanucleus/JDOStateManagerForIsis.java b/core/plugins/jdo/datanucleus-5/src/main/java/org/apache/isis/jdo/datanucleus/JDOStateManagerForIsis.java
index 2552405..a863283 100644
--- a/core/plugins/jdo/datanucleus-5/src/main/java/org/apache/isis/jdo/datanucleus/JDOStateManagerForIsis.java
+++ b/core/plugins/jdo/datanucleus-5/src/main/java/org/apache/isis/jdo/datanucleus/JDOStateManagerForIsis.java
@@ -27,13 +27,20 @@ import org.datanucleus.state.ReferentialStateManagerImpl;
 import org.datanucleus.store.FieldValues;
 import org.datanucleus.store.fieldmanager.FieldManager;
 
-import org.apache.isis.runtime.system.context.IsisContext;
-import org.apache.isis.runtime.system.session.IsisSessionFactory;
+import org.apache.isis.applib.services.inject.ServiceInjector;
 
+/**
+ * @deprecated This is bad practice: The lifecycle of persistent entities is usually decoupled from the lifecycle of a managed bean
+ */
+@Deprecated
 public class JDOStateManagerForIsis extends ReferentialStateManagerImpl {
 
+    private final ServiceInjector serviceInjector = null;
+    
     public JDOStateManagerForIsis(ExecutionContext ec, AbstractClassMetaData cmd) {
         super(ec, cmd);
+//        this.serviceInjector = (ServiceInjector) ec.getProperty("serviceInjector");
+//        requires(serviceInjector, "serviceInjector");
     }
 
     public enum Hint {
@@ -213,10 +220,9 @@ public class JDOStateManagerForIsis extends ReferentialStateManagerImpl {
     }
 
     protected void mapIntoIsis(Persistable pc) {
-        IsisContext.getServiceInjector().injectServicesInto(pc);
-    }
-
-    IsisSessionFactory getSessionFactory() {
-        return IsisContext.getSessionFactory();
+        if(serviceInjector!=null) {
+            serviceInjector.injectServicesInto(pc);
+        }
     }
+    
 }
diff --git a/core/plugins/jdo/datanucleus-5/src/main/java/org/apache/isis/jdo/datanucleus/persistence/queries/PersistenceQueryFindAllInstancesProcessor.java b/core/plugins/jdo/datanucleus-5/src/main/java/org/apache/isis/jdo/datanucleus/persistence/queries/PersistenceQueryFindAllInstancesProcessor.java
index 94fc3dd..df45def 100644
--- a/core/plugins/jdo/datanucleus-5/src/main/java/org/apache/isis/jdo/datanucleus/persistence/queries/PersistenceQueryFindAllInstancesProcessor.java
+++ b/core/plugins/jdo/datanucleus-5/src/main/java/org/apache/isis/jdo/datanucleus/persistence/queries/PersistenceQueryFindAllInstancesProcessor.java
@@ -20,14 +20,11 @@ package org.apache.isis.jdo.datanucleus.persistence.queries;
 
 import java.util.List;
 
-import javax.jdo.JDOQLTypedQuery;
-
-import org.apache.isis.jdo.jdosupport.IsisJdoSupport_v3_2;
 import org.apache.isis.jdo.persistence.PersistenceSession5;
 import org.apache.isis.metamodel.adapter.ObjectAdapter;
-import org.apache.isis.metamodel.spec.ObjectSpecification;
 import org.apache.isis.runtime.persistence.query.PersistenceQueryFindAllInstances;
 
+import lombok.val;
 import lombok.extern.log4j.Log4j2;
 
 @Log4j2
@@ -40,19 +37,20 @@ public class PersistenceQueryFindAllInstancesProcessor extends PersistenceQueryP
     @Override
     public List<ObjectAdapter> process(final PersistenceQueryFindAllInstances persistenceQuery) {
 
-        final IsisJdoSupport_v3_2 isisJdoSupport = isisJdoSupport();
-
-        final ObjectSpecification specification = persistenceQuery.getSpecification();
-        final Class<?> cls = specification.getCorrespondingClass();
+        val spec = persistenceQuery.getSpecification();
+        val cls = spec.getCorrespondingClass();
+        
+        val serviceRegistry = spec.getMetaModelContext().getServiceRegistry();
+        val isisJdoSupport = isisJdoSupport(serviceRegistry);
 
-        JDOQLTypedQuery<?> typesafeQuery = isisJdoSupport.newTypesafeQuery(cls);
+        val typesafeQuery = isisJdoSupport.newTypesafeQuery(cls);
         isisJdoSupport.disableMultivaluedFetch(typesafeQuery); // fetch optimization
 
         if (log.isDebugEnabled()) {
-            log.debug("allInstances(): class={}", specification.getFullIdentifier());
+            log.debug("allInstances(): class={}", spec.getFullIdentifier());
         }
 
-        final List<?> pojos = isisJdoSupport.executeQuery(cls);
+        val pojos = isisJdoSupport.executeQuery(cls);
         return loadAdapters(pojos);
 
     }
diff --git a/core/plugins/jdo/datanucleus-5/src/main/java/org/apache/isis/jdo/datanucleus/persistence/queries/PersistenceQueryFindUsingApplibQueryProcessor.java b/core/plugins/jdo/datanucleus-5/src/main/java/org/apache/isis/jdo/datanucleus/persistence/queries/PersistenceQueryFindUsingApplibQueryProcessor.java
index 27b1515..97a7c66 100644
--- a/core/plugins/jdo/datanucleus-5/src/main/java/org/apache/isis/jdo/datanucleus/persistence/queries/PersistenceQueryFindUsingApplibQueryProcessor.java
+++ b/core/plugins/jdo/datanucleus-5/src/main/java/org/apache/isis/jdo/datanucleus/persistence/queries/PersistenceQueryFindUsingApplibQueryProcessor.java
@@ -27,7 +27,6 @@ import javax.jdo.Query;
 import org.apache.isis.commons.internal.collections._Lists;
 import org.apache.isis.commons.internal.collections._Maps;
 import org.apache.isis.jdo.datanucleus.metamodel.JdoPropertyUtils;
-import org.apache.isis.jdo.jdosupport.IsisJdoSupport_v3_2;
 import org.apache.isis.jdo.persistence.PersistenceSession5;
 import org.apache.isis.metamodel.adapter.ObjectAdapter;
 import org.apache.isis.metamodel.services.container.query.QueryCardinality;
@@ -36,6 +35,7 @@ import org.apache.isis.metamodel.spec.ObjectSpecification;
 import org.apache.isis.metamodel.spec.feature.OneToOneAssociation;
 import org.apache.isis.runtime.persistence.query.PersistenceQueryFindUsingApplibQueryDefault;
 
+import lombok.val;
 import lombok.extern.log4j.Log4j2;
 
 @Log4j2
@@ -65,17 +65,18 @@ public class PersistenceQueryFindUsingApplibQueryProcessor extends PersistenceQu
     // special case handling
     private List<?> getResultsPk(final PersistenceQueryFindUsingApplibQueryDefault persistenceQuery) {
 
-        final IsisJdoSupport_v3_2 isisJdoSupport = isisJdoSupport();
-
-        final String queryName = persistenceQuery.getQueryName();
+        val queryName = persistenceQuery.getQueryName();
         final Map<String, Object> map = unwrap(persistenceQuery.getArgumentsAdaptersByParameterName());
-        final ObjectSpecification objectSpec = persistenceQuery.getSpecification();
+        val spec = persistenceQuery.getSpecification();
+        
... 19218 lines suppressed ...