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/01/06 07:52:24 UTC

[isis] 01/01: Merge branch 'v2' into 2033-IoC

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

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

commit b3f944302bfe029160bde0a6af26a55a248527cc
Merge: 0b8ada6 f965dc1
Author: andi-huber <ah...@apache.org>
AuthorDate: Sun Jan 6 08:51:31 2019 +0100

    Merge branch 'v2' into 2033-IoC
    
    Conflicts:
    	core/applib/src/main/java/org/apache/isis/applib/services/metamodel/MetaModelServicesMenu.java
    	core/config/src/main/java/org/apache/isis/config/AppConfigLocator.java
    	core/config/src/main/java/org/apache/isis/config/builder/IsisConfigurationDefault.java
    	core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainobject/DomainObjectAnnotationFacetFactory.java
    	core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/metamodel/MetaModelServiceDefault.java
    	core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/SpecificationLoader.java
    	core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectSpecificationAbstract.java
    	core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/dflt/ObjectSpecificationDefault.java
    	core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/standalonelist/ObjectSpecificationOnStandaloneList.java
    	core/metamodel/src/test/java/org/apache/isis/core/metamodel/specloader/SpecificationLoaderTestAbstract.java
    	core/metamodel/src/test/java/org/apache/isis/core/metamodel/specloader/SpecificationLoaderTest_array.java
    	core/metamodel/src/test/java/org/apache/isis/core/metamodel/specloader/SpecificationLoaderTest_collection.java
    	core/metamodel/src/test/java/org/apache/isis/core/metamodel/specloader/SpecificationLoaderTest_value.java
    	core/plugins/jdo-datanucleus-4/src/test/java/org/apache/isis/core/metamodel/specloader/ObjectReflectorDefaultTest_object.java
    	core/plugins/jdo-datanucleus-4/src/test/java/org/apache/isis/core/runtime/system/ObjectMemberAbstractTest.java
    	core/plugins/jdo-datanucleus-4/src/test/java/org/apache/isis/core/wrapper/WrapperFactoryDefaultTest_wrappedObject.java
    	core/plugins/jdo-datanucleus-5/src/test/java/org/apache/isis/core/metamodel/specloader/ObjectReflectorDefaultTest_object.java
    	core/pom.xml
    	core/viewer-wicket-impl/src/main/java/org/apache/isis/viewer/wicket/viewer/IsisWicketApplication.java
    	core/viewer-wicket-impl/src/main/java/org/apache/isis/viewer/wicket/viewer/IsisWicketModule.java
    	core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/pages/PageAbstract.java

 README.adoc                                        | 113 ++-
 STATUS                                             |  14 +-
 .../src/main/asciidoc/__versions.adoc              |   1 -
 .../guides/cgcom/_cgcom_cutting-a-release.adoc     | 182 +++--
 .../cgcom/_cgcom_post-release-successful.adoc      |  57 +-
 .../guides/cgcom/_cgcom_verifying-releases.adoc    | 211 ++---
 .../guides/dg/_dg_hints-and-tips_enhance-only.adoc |   2 +-
 .../main/asciidoc/guides/dg/_dg_ide_intellij.adoc  |  12 +-
 .../guides/rgant/_rgant-Action_domainEvent.adoc    |   2 +-
 .../guides/rgant/_rgant-Action_publishing.adoc     |   2 +-
 .../asciidoc/guides/rgant/_rgant-DomainObject.adoc |   7 +-
 .../guides/rgant/_rgant-DomainObject_auditing.adoc |   4 +-
 ..._rgant-DomainObject_autoCompleteRepository.adoc |   5 +-
 ...nded.adoc => _rgant-DomainObject_bounding.adoc} |  16 +-
 .../_rgant-DomainObject_collectionDomainEvent.adoc |   2 +-
 .../guides/rgant/_rgant-DomainObject_nature.adoc   |  19 +-
 .../_rgant-DomainObject_propertyDomainEvent.adoc   |   2 +-
 .../rgant/_rgant-DomainObject_publishing.adoc      |   2 +-
 .../guides/rgant/_rgant-Property_publishing.adoc   |   2 +-
 .../guides/rgcfg/_rgcfg_configuring-core.adoc      |  37 +
 .../guides/rgcfg/_rgcfg_deployment-types.adoc      |  17 +-
 .../guides/rgcfg/_rgcfg_specifying-components.adoc |   4 +-
 .../_rgcms_classes_AppManifest-bootstrapping.adoc  |  40 +-
 .../_rgcms_classes_AppManifest2-bootstrapping.adoc |   4 +-
 ...rgcms_classes_contributee_HasTransactionId.adoc |  19 +
 ...ms_classes_domainevent_AbstractDomainEvent.adoc |  64 +-
 ...gcms_classes_domainevent_ActionDomainEvent.adoc |  10 +-
 .../asciidoc/guides/rgcms/_rgcms_schema-chg.adoc   |  35 +-
 .../asciidoc/guides/rgcms/_rgcms_schema-cmd.adoc   |   9 +-
 .../guides/rgcms/_rgcms_schema-common.adoc         |   7 +-
 .../asciidoc/guides/rgcms/_rgcms_schema-ixn.adoc   |   6 +-
 .../asciidoc/guides/rgcms/_rgcms_schema-mml.adoc   | 362 +++++++++
 .../main/asciidoc/guides/rgcms/_rgcms_schema.adoc  |   3 +
 .../src/main/asciidoc/guides/rgmvn/_rgmvn_xsd.adoc |   2 +-
 ...rgsvc_application-layer-api_WrapperFactory.adoc |  72 +-
 ...c_application-layer-spi_HealthCheckService.adoc |   2 +
 .../rgsvc/_rgsvc_integration-api_EmailService.adoc |   4 +-
 .../_rgsvc_metadata-api_MetamodelService.adoc      |  25 +-
 ..._rgsvc_persistence-layer-api_H2ManagerMenu.adoc |  89 +++
 ...c_presentation-layer-api_GuiceBeanProvider.adoc |  10 +-
 ...esentation-layer-spi_ContentMappingService.adoc |   4 +-
 ...esentation-layer-spi_ErrorReportingService.adoc |  22 +-
 ..._presentation-layer-spi_TranslationService.adoc |  12 +-
 ...gbtb_deployment_externalized-configuration.adoc |   8 +-
 .../guides/ugbtb/_ugbtb_headless-access.adoc       |   4 +-
 .../main/asciidoc/guides/ugbtb/_ugbtb_i18n.adoc    |  13 +-
 .../guides/ugbtb/_ugbtb_other-techniques.adoc      |   2 +-
 .../main/asciidoc/guides/ugbtb/_ugbtb_web-xml.adoc |  10 +-
 .../guides/ugfun/_ugfun_core-concepts.adoc         |   2 +-
 ...re-concepts_apache-isis-vs_mvc-server-side.adoc |   2 +-
 .../ugfun/_ugfun_core-concepts_philosophy_aop.adoc |   4 +-
 .../ugfun/_ugfun_drop-downs-and-defaults.adoc      |   2 +-
 ...ugfun_getting-started_helloworld-archetype.adoc | 135 ++--
 ..._ugfun_getting-started_simpleapp-archetype.adoc | 312 +++++---
 .../_ugsec_configuring-isis-to-use-shiro.adoc      |   3 +
 ...entations_isisaddons-security-module-realm.adoc |   2 +-
 ...sec_shiro-realm-implementations_jdbc-realm.adoc |   2 +-
 .../guides/ugsec/_ugsec_usage-by-isis-viewers.adoc |  10 +-
 .../_ugtst_integ-test-support_bootstrapping.adoc   |  18 +
 .../asciidoc/guides/ugtst/_ugtst_overview.adoc     |   2 +-
 .../asciidoc/guides/ugvro/_ugvro_health-check.adoc |  71 ++
 .../guides/ugvro/_ugvro_hints-and-tips.adoc        |   1 +
 .../_ugvro_hints-and-tips_troubleshooting.adoc     |  89 +++
 .../src/main/asciidoc/guides/ugvro/ugvro.adoc      |   1 +
 .../ugvw/_ugvw_configuration-properties.adoc       | 187 ++++-
 ..._ugvw_customisation_cheap-n-cheerful-theme.adoc |   2 +-
 .../_ugvw_customisation_request-parameters.adoc    |   2 +-
 .../_ugvw_extending_custom-bootstrap-theme.adoc    |   2 +-
 .../guides/ugvw/_ugvw_extending_custom-pages.adoc  |   2 +-
 ...extending_login-via-query-args-prototyping.adoc |   4 +-
 .../_ugvw_extending_replacing-page-elements.adoc   |   2 +-
 .../main/asciidoc/guides/ugvw/_ugvw_features.adoc  |   3 +-
 .../ugvw/_ugvw_features_blob-attachments.adoc      |   2 +-
 .../_ugvw_features_sidebar-vs-modal-dialogs.adoc   |  34 +
 .../guides/ugvw/_ugvw_features_where-am-i.adoc     |  35 +-
 .../ugvw/_ugvw_hints-and-tips_per-user-themes.adoc |   2 +-
 .../guides/ugvw/images/dialog-mode/modal.png       | Bin 0 -> 139750 bytes
 .../guides/ugvw/images/dialog-mode/sidebar.png     | Bin 0 -> 134677 bytes
 .../_migration-notes_1.16.0-to-1.17.0.adoc         |  10 +
 ...ion-notes_1.16.0-to-2.0.0-M1_other-changes.adoc |   8 +-
 .../asciidoc/pages/screencasts/screencasts.adoc    |   2 +-
 .../src/main/asciidoc/pages/tg/tg.adoc             |   4 +-
 .../release-notes/_release-notes_1.4.0.adoc        |   4 +-
 .../release-notes/_release-notes_1.8.0.adoc        |   4 +-
 .../asciidoc}/schema/metamodel/metamodel-1.0.xsd   |  12 +-
 .../main/asciidoc/schema/metamodel/metamodel.xsd   |  12 +-
 core/.m2/settings.xml                              |  28 +-
 .../java/org/apache/isis/applib/AppManifest.java   |   2 +
 .../isis/applib/ModuleOrBuilderAbstract.java       |   4 +
 .../applib/services/hsqldb/HsqlDbManagerMenu.java  |   4 +-
 .../applib/services/jaxb/JaxbServiceDefault.java   |   7 +-
 .../services/metamodel/MetaModelService.java       |   6 +
 .../services/metamodel/MetaModelServicesMenu.java  | 136 ++--
 .../metamodel/MetaModelService_Config_Test.java    |  18 +
 .../utils/CommonDtoUtils_setValueOn_Test.java      |  26 +-
 .../environment/IsisSystemEnvironmentPlugin.java   |  18 +
 .../apache/isis/commons/internal/cdi/CDITest.java  |  18 +
 .../internal/cdi/ValidQualifierForTesting.java     |  18 +
 .../org/apache/isis/config/AppConfigLocator.java   |  26 +-
 .../config/builder/IsisConfigurationDefault.java   |  15 +-
 .../isis/config/property/ConfigProperty.java}      |  12 +-
 .../config/property/ConfigPropertyAbstract.java    |  19 +-
 .../config/property/ConfigPropertyBoolean.java     |  30 +-
 .../isis/config/property/ConfigPropertyEnum.java   |  31 +-
 .../isis/config/property/ConfigPropertyString.java |  27 +-
 core/detached-tests/pom.xml                        |   2 +-
 .../metamodel/facets/ObjectSpecIdFacetFactory.java |  20 +-
 .../actions/layout/ActionLayoutFacetFactory.java   |   3 +-
 .../DomainObjectAnnotationFacetFactory.java        |  12 +-
 ...jectSpecIdFacetDerivedFromClassNameFactory.java |  29 +-
 ...ObjectFacetDeclarativeInitializingAbstract.java |   1 +
 .../facets/object/value/ValueFacetSimple.java      |  53 ++
 .../JodaLocalTimeValueFacetSimpleFactory.java      |  47 ++
 .../param/DeriveFacetsPostProcessor.java           |   8 +-
 .../services/metamodel/MetaModelExporter.java      |  50 +-
 .../metamodel/MetaModelServiceDefault.java         |  13 +-
 .../metamodel/specloader/IntrospectionMode.java    |  52 ++
 .../specloader/SpecificationCacheDefault.java      |  26 +-
 .../metamodel/specloader/SpecificationLoader.java  | 370 ++++-----
 .../classsubstitutor/ClassSubstitutor.java         |  11 +-
 .../specloader/facetprocessor/FacetProcessor.java  |  25 +
 .../specloader/specimpl/FacetedMethodsBuilder.java |  12 +-
 .../specloader/specimpl/IntrospectionState.java    |  35 +-
 .../specimpl/ObjectActionParameterAbstract.java    |   8 +-
 .../specloader/specimpl/ObjectMemberAbstract.java  |   6 +-
 .../specimpl/ObjectSpecificationAbstract.java      | 157 ++--
 .../specimpl/dflt/ObjectSpecificationDefault.java  |  61 +-
 .../ObjectSpecificationOnStandaloneList.java       |  18 +-
 .../JdoDiscriminatorAnnotationFacetFactory.java    |  44 +-
 ...doPersistenceCapableAnnotationFacetFactory.java |  12 +-
 .../facets/object/query/VisitorForFromClause.java  |   1 +
 .../object/query/VisitorForVariablesClause.java    |   4 +-
 .../dflt/ProgrammingModelFacetsJava5.java          |   2 +
 .../DomainObjectAnnotationFacetFactoryTest.java    |   3 +-
 .../ObjectTypeAnnotationFacetFactoryTest.java      |   9 +-
 ...SpecIdFacetDerivedFromClassNameFactoryTest.java |   9 +-
 .../PropertyAnnotationFacetFactoryTest.java        |   1 +
 .../IntrospectionState_comparable_Test.java        |  90 +++
 .../DataNucleusApplicationComponents4.java         |   5 +-
 .../adapterfactory/pojo/PojoAdapterTest.java       |  26 +-
 ...JdoDiscriminatorAnnotationFacetFactoryTest.java |   7 +-
 ...rsistenceCapableAnnotationFacetFactoryTest.java |  10 +
 .../DataNucleusApplicationComponents5.java         |   3 +-
 .../adapterfactory/pojo/PojoAdapterTest.java       |  24 +-
 .../transaction/PojoAdapterBuilder.java            |   1 +
 .../runtime/system/ObjectMemberAbstractTest.java   |  29 +-
 .../WrapperFactoryDefaultTest_wrappedObject.java   |   2 +-
 ...FactoryDefaultTest_wrappedObject_transient.java |   4 +-
 ...JdoDiscriminatorAnnotationFacetFactoryTest.java |   7 +-
 ...rsistenceCapableAnnotationFacetFactoryTest.java |  10 +
 core/pom.xml                                       |   4 +
 .../runner/opts/OptionHandlerInitParameters.java   |   4 +-
 .../system/session/IsisSessionFactoryBuilder.java  |   2 +-
 .../IsisComponentProviderBuilder.java              |  18 +
 .../apache/isis/core/webapp/IsisSessionFilter.java |   2 +-
 .../IsisSessionFilter_lookupPassThru_Test.java     |  18 +
 .../apache/isis/schema/metamodel/metamodel-1.0.xsd |  12 +-
 core/specsupport/pom.xml                           |  13 +
 core/unittestsupport/pom.xml                       |   2 +-
 .../server/resources/HealthResourceServerside.java |   2 +-
 .../wicket/viewer/IsisWicketApplication.java       |  14 +-
 .../viewer/wicket/viewer/IsisWicketModule.java     |  17 +-
 .../viewer/wicket/model/models/ActionModel.java    |  11 +-
 .../model/models/whereami/WhereAmIModel.java       |   4 +-
 .../apache/isis/viewer/wicket/ui/DialogMode.java   |   7 +
 .../serviceactions/ServiceActionsPanel.html        |   4 +-
 .../serviceactions/TertiaryActionsPanel.html       |   2 +-
 .../ActionPromptSidebar.html}                      |  44 +-
 .../actionpromptsb/ActionPromptSidebar.java        | 102 +++
 .../bookmarkedpages/BookmarkedPagesPanel.html      |   6 +-
 .../entity/icontitle/EntityIconAndTitlePanel.html  |   2 +-
 .../entity/icontitle/EntityIconAndTitlePanel.java  |  10 +-
 .../wicket/ui/components/header/HeaderPanel.html   |   4 +-
 .../components/scalars/ScalarPanelAbstract2.java   |   8 +-
 .../scalars/ScalarPanelTextFieldAbstract.java      |   7 +-
 .../scalars/string/MultiLineStringPanel.java       |   9 +-
 .../linkandlabel/ActionLinkFactoryAbstract.java    |  35 +-
 .../isis/viewer/wicket/ui/pages/PageAbstract.html  |  25 +-
 .../isis/viewer/wicket/ui/pages/PageAbstract.java  |  22 +
 .../ui/pages/SidebarCssResourceReference.java      |  17 +-
 .../pages/bootstrap-overrides-bootstrap-theme.css} |  20 +-
 .../ui/pages/bootstrap-overrides-cerulean.css}     |  20 +-
 .../wicket/ui/pages/bootstrap-overrides-cosmo.css} |  20 +-
 .../ui/pages/bootstrap-overrides-cyborg.css}       |  20 +-
 .../wicket/ui/pages/bootstrap-overrides-darkly.css |  13 +
 .../wicket/ui/pages/bootstrap-overrides-flatly.css |  17 +-
 .../ui/pages/bootstrap-overrides-journal.css}      |  20 +-
 .../wicket/ui/pages/bootstrap-overrides-lumen.css} |  20 +-
 .../wicket/ui/pages/bootstrap-overrides-paper.css} |  20 +-
 .../ui/pages/bootstrap-overrides-readable.css}     |  20 +-
 .../ui/pages/bootstrap-overrides-sandstone.css     |  17 +
 .../ui/pages/bootstrap-overrides-simplex.css}      |  20 +-
 .../wicket/ui/pages/bootstrap-overrides-slate.css} |  20 +-
 .../ui/pages/bootstrap-overrides-spacelab.css}     |  20 +-
 .../ui/pages/bootstrap-overrides-superhero.css}    |  20 +-
 .../ui/pages/bootstrap-overrides-united.css}       |  20 +-
 .../wicket/ui/pages/bootstrap-overrides-yeti.css}  |  20 +-
 .../viewer/wicket/ui/pages/bootstrap-overrides.css |  17 +
 .../wicket/ui/pages/jquery.isis.wicket.viewer.js   |  11 +
 .../isis/viewer/wicket/ui/pages/simple-sidebar.css | 136 ++++
 .../isis/viewer/wicket/ui/util/isis-tooltips.css   |  19 +
 core/webdocker/pom.xml                             |  12 -
 core/webserver/config/isis.properties              |   1 +
 core/webserver/pom.xml                             |  37 +
 .../org/apache/isis/core/webserver/WebServer.java  | 225 ------
 .../isis/core/webserver/WebServerConstants.java    |  46 --
 .../webserver/config/WebServerConfigBuilder.java   |  93 ---
 .../webserver/internal/OptionHandlerAddress.java   |  64 --
 .../core/webserver/internal/OptionHandlerPort.java |  69 --
 .../internal/OptionHandlerResourceBase.java        |  61 --
 .../internal/OptionHandlerStartupMode.java         |  65 --
 .../isis/core/webserver/DummyAppManifest.java      |  13 +
 .../core/webserver}/HelloWorldAppConfigTest.java   |  12 +-
 example/application/helloworld/pom.xml             |  10 +
 .../application/HelloWorldAppManifest.java         |   3 +-
 .../application/isis-non-changing.properties       |   6 +-
 .../java/domainapp/application/menubars.layout.xml |   3 +
 .../java/domainapp/dom/impl/HelloWorldObjects.java |  11 +-
 .../src/main/webapp/WEB-INF/isis.properties        |  12 +-
 .../helloworld/src/main/webapp/WEB-INF/web.xml     |  16 +-
 .../main/{java/domainapp => }/webapp/welcome.html  |   2 +-
 .../application/manifest/DomainAppAppManifest.java |   8 +-
 .../manifest/isis-non-changing.properties          | 378 ++++++++-
 .../application/manifest/menubars.layout.xml       |   3 +
 .../manifest/authentication_shiro.properties       |  25 -
 .../manifest/persistor_datanucleus.properties      | 113 ---
 .../manifest/viewer_restfulobjects.properties      |  64 --
 .../application/manifest/viewer_wicket.properties  | 179 -----
 .../integtests/mml/MetaModelService_IntegTest.java |  12 +-
 .../integtests/mml/approved/java.lang.Long.xml     |   2 -
 .../integtests/mml/approved/java.lang.Object.xml   |   2 -
 .../integtests/mml/approved/java.lang.String.xml   |   2 -
 .../integtests/mml/approved/java.net.URL.xml       |   2 -
 .../integtests/mml/approved/java.sql.Timestamp.xml |   2 -
 .../integtests/mml/approved/java.util.List.xml     |   2 -
 ....applib.services.layout.LayoutService$Style.xml |   2 -
 .../approved/org.apache.isis.applib.value.Clob.xml |   2 -
 .../application/integtests/mml/approved/void.xml   |   2 -
 .../module-simple/logging-integtest.properties     |   2 +-
 .../modules/simple/dom/impl/SimpleObject.java      |   9 +-
 .../simple/dom/impl/SimpleObject.layout.xml        |   4 +-
 .../modules/simple/dom/impl/SimpleObjects.java     |  24 +-
 .../integtests/tests/SimpleObject_IntegTest.java   |   3 +-
 example/application/simpleapp/pom.xml              |   4 +
 example/application/simpleapp/webapp/pom.xml       |  66 +-
 .../domainapp/webapp/DomainApplication.properties  |  28 -
 .../src/main/java/domainapp/webapp/welcome.html    |  40 -
 .../webapp/src/main/webapp/WEB-INF/isis.properties |  15 +-
 .../src/main/webapp/WEB-INF/logging.properties     |  12 +-
 .../webapp/src/main/webapp/WEB-INF/web.xml         |  14 +
 example/archetype/helloworld/pom.xml               |  35 -
 .../META-INF/maven/archetype-metadata.xml          |  37 +-
 .../src/main/resources/archetype-resources/pom.xml | 453 +++++------
 .../application/HelloWorldAppManifest.java         |   3 +-
 .../application/isis-non-changing.properties       |  22 +-
 .../java/domainapp/application/menubars.layout.xml |   3 +
 .../java/domainapp/dom/impl/HelloWorldObjects.java |   5 +-
 .../domainapp/webapp/HelloWorldApplication.java    |  72 --
 .../src/main/webapp/WEB-INF/isis.properties        |   4 +
 .../src/main/webapp/WEB-INF/logging.properties     |  13 +-
 .../src/main/webapp/WEB-INF/web.xml                |   2 +-
 .../main/webapp/images/apache-isis/logo-48x48.png  | Bin 0 -> 2622 bytes
 .../main/{java/domainapp => }/webapp/welcome.html  |   2 +-
 .../resources/projects/basic/archetype.properties  |   2 +-
 example/archetype/simpleapp/pom.xml                | 113 ---
 .../META-INF/maven/archetype-metadata.xml          | 177 -----
 .../resources/archetype-resources/.gitlab-ci.yml   |  51 --
 .../resources/archetype-resources/.m2/settings.xml |  23 -
 .../main/resources/archetype-resources/README.adoc | 244 ------
 .../archetype-resources/_checks/checkstyle.xml     | 290 -------
 .../resources/archetype-resources/_checks/pmd.xml  |  49 --
 .../application/logging-integtest.properties       | 124 ---
 .../archetype-resources/application/pom.xml        | 118 ---
 ...mainAppFixtureScriptsSpecificationProvider.java |  48 --
 .../fixture/scenarios/DomainAppDemo.java           |  48 --
 .../application/manifest/DomainAppAppManifest.java |  47 --
 .../application/manifest/menubars.layout.xml       | 112 ---
 .../services/homepage/HomePageService.java         |  46 --
 .../services/homepage/HomePageViewModel.java       |  49 --
 .../services/homepage/HomePageViewModel.layout.xml |  53 --
 .../services/homepage/HomePageViewModel.png        | Bin 456 -> 0 bytes
 .../manifest/authentication_shiro.properties       |  28 -
 .../manifest/isis-non-changing.properties          | 389 ----------
 .../manifest/persistor_datanucleus.properties      | 117 ---
 .../manifest/viewer_restfulobjects.properties      |  67 --
 .../application/manifest/viewer_wicket.properties  | 182 -----
 .../bdd/specglue/BootstrappingGlue.java            |  42 -
 .../bdd/specglue/BootstrappingGlueAbstract.java    |  35 -
 .../application/bdd/specs/RunIntegBddSpecs.java    |  46 --
 .../SimpleObjectSpec_listAllAndCreate.feature      |  25 -
 .../integtests/DomainAppIntegTestAbstract.java     |  34 -
 .../application/integtests/Smoke_IntegTest.java    |  98 ---
 .../src/test/resources/cucumber.properties         |   4 -
 .../application/translations.pot                   | 845 ---------------------
 .../resources/archetype-resources/enhance-all.sh   |   2 -
 .../archetype-resources/module-simple/build.gradle |  72 --
 .../archetype-resources/module-simple/gradlew      | 164 ----
 .../archetype-resources/module-simple/gradlew.bat  |  90 ---
 .../module-simple/layouts.gradle                   |  49 --
 .../module-simple/liveReload.gradle                |  56 --
 .../module-simple/logging-dn-enhance.properties    |  44 --
 .../module-simple/logging-integtest.properties     | 123 ---
 .../archetype-resources/module-simple/pom.xml      | 185 -----
 .../src/main/java/META-INF/persistence.xml         |  29 -
 .../domainapp/modules/simple/SimpleModule.java     |  51 --
 .../modules/simple/SimpleModuleManifest.java       |  41 -
 .../modules/simple/dom/impl/SimpleObject.java      | 107 ---
 .../simple/dom/impl/SimpleObject.layout.xml        |  69 --
 .../modules/simple/dom/impl/SimpleObject.png       | Bin 653 -> 0 bytes
 .../modules/simple/dom/impl/SimpleObjects.java     | 104 ---
 .../domainapp/modules/simple/dom/types/Name.java   |  39 -
 .../domainapp/modules/simple/dom/types/Notes.java  |  28 -
 .../simple/fixture/SimpleObjectBuilder.java        |  53 --
 .../simple/fixture/SimpleObject_persona.java       |  66 --
 .../modules/simple/dom/impl/SimpleObject_Test.java |  53 --
 .../simple/dom/impl/SimpleObjects_Test.java        | 119 ---
 .../tests/SimpleObjectMenu_IntegTest.java          | 132 ----
 .../integtests/tests/SimpleObject_IntegTest.java   | 154 ----
 .../simple/specglue/SimpleObjectMenuGlue.java      |  52 --
 .../module-simple/translations.pot                 | 829 --------------------
 .../src/main/resources/archetype-resources/pom.xml | 158 ----
 .../resources/archetype-resources/webapp/pom.xml   | 299 --------
 .../java/domainapp/webapp/DomainApplication.java   |  93 ---
 .../domainapp/webapp/DomainApplication.properties  |  31 -
 .../src/main/java/domainapp/webapp/welcome.html    |  43 --
 .../webapp/src/main/jettyconsole/isis-banner.pdn   | Bin 64162 -> 0 bytes
 .../webapp/src/main/jettyconsole/isis-banner.png   | Bin 27310 -> 0 bytes
 .../webapp/src/main/webapp/WEB-INF/isis.properties | 130 ----
 .../src/main/webapp/WEB-INF/logging.properties     | 238 ------
 .../webapp/src/main/webapp/WEB-INF/shiro.ini       |  93 ---
 .../src/main/webapp/WEB-INF/translations-en.po     | 674 ----------------
 .../src/main/webapp/WEB-INF/translations-es.po     | 673 ----------------
 .../src/main/webapp/WEB-INF/translations-nl.po     | 674 ----------------
 .../webapp/src/main/webapp/WEB-INF/translations.po | 673 ----------------
 .../webapp/src/main/webapp/WEB-INF/web.xml         | 358 ---------
 .../src/main/webapp/about/images/isis-logo.png     | Bin 14160 -> 0 bytes
 .../webapp/src/main/webapp/about/index.html        | 120 ---
 .../src/main/webapp/images/spinning-icon.gif       | Bin 5266 -> 0 bytes
 .../webapp/src/main/webapp/scripts/application.js  |   3 -
 .../resources/projects/basic/archetype.properties  |   5 -
 .../src/test/resources/projects/basic/goal.txt     |   0
 example/misc/metamodel/jsr303/pom.xml              |   2 +-
 migration-notes.adoc                               | 271 ++++++-
 recreate_archetype_RELEASE.sh                      |  25 -
 recreate_archetype_SNAPSHOT.sh                     |  26 -
 scripts/addmissinglicenses.groovy                  | 164 ----
 scripts/recreate-archetype.sh                      |  11 +-
 scripts/updateGeneratedArchetypeSources.groovy     |  59 +-
 scripts/verify-isis-release.sh                     | 169 +++++
 scripts/version-bump.sh                            |  19 +
 scripts/version-reset.sh                           |  19 +
 351 files changed, 5043 insertions(+), 13881 deletions(-)

diff --cc core/applib/src/main/java/org/apache/isis/applib/services/jaxb/JaxbServiceDefault.java
index 69b7b52,c4ca34e..2928f90
--- a/core/applib/src/main/java/org/apache/isis/applib/services/jaxb/JaxbServiceDefault.java
+++ b/core/applib/src/main/java/org/apache/isis/applib/services/jaxb/JaxbServiceDefault.java
@@@ -24,11 -22,14 +24,12 @@@ import javax.xml.bind.JAXBContext
  import javax.xml.bind.JAXBException;
  import javax.xml.bind.Marshaller;
  import javax.xml.bind.Unmarshaller;
+ import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;
  
  import org.apache.isis.applib.NonRecoverableException;
 -import org.apache.isis.applib.annotation.DomainService;
 -import org.apache.isis.applib.annotation.NatureOfService;
  import org.apache.isis.applib.domain.DomainObjectList;
 +import org.apache.isis.applib.services.inject.ServiceInjector;
  import org.apache.isis.applib.services.metamodel.MetaModelService;
 -import org.apache.isis.applib.services.registry.ServiceRegistry;
  import org.apache.isis.schema.utils.jaxbadapters.PersistentEntitiesAdapter;
  import org.apache.isis.schema.utils.jaxbadapters.PersistentEntityAdapter;
  
diff --cc core/applib/src/main/java/org/apache/isis/applib/services/metamodel/MetaModelServicesMenu.java
index 21e5085,e3c0447..473b5a5
--- a/core/applib/src/main/java/org/apache/isis/applib/services/metamodel/MetaModelServicesMenu.java
+++ b/core/applib/src/main/java/org/apache/isis/applib/services/metamodel/MetaModelServicesMenu.java
@@@ -79,93 -84,116 +83,112 @@@ public class MetaModelServicesMenu 
              )
      @ActionLayout(
              cssClassFa = "fa-download",
+             named = "Download Meta Model (CSV)"
+             )
+     @MemberOrder(sequence="500.500.2")
+     public Clob downloadMetaModelCsv(
+             @ParameterLayout(named = ".csv file name")
+             final String csvFileName) {
+ 
+         final DomainModel domainMembers =  metaModelService.getDomainModel();
+         final List<String> list = asList(domainMembers);
+         final StringBuilder buf = asBuf(list);
+ 
+         return new Clob(
+                 Util.withSuffix(csvFileName, "csv"),
 -                mimeTypeTextCsv, buf.toString().toCharArray());
++                    mimeTypeTextCsv, buf.toString().toCharArray());
+     }
+ 
+     public String default0DownloadMetaModelCsv() {
+         return "metamodel.csv";
+     }
+ 
 -    private String toXml(MetamodelDto model) {
 -        return jaxbService.toXml(model);
 -    }
 -
 -
+     // //////////////////////////////////////
+ 
 -
+     public static class DownloadMetaModelXmlEvent extends ActionDomainEvent {
++        private static final long serialVersionUID = 1L;
+     }
+ 
+     @Action(
+             domainEvent = DownloadMetaModelXmlEvent.class,
+             semantics = SemanticsOf.SAFE,
+             restrictTo = RestrictTo.PROTOTYPING
+     )
+     @ActionLayout(
+             cssClassFa = "fa-download",
              named = "Download Meta Model (XML)"
 -    )
 +            )
-     @MemberOrder(sequence="500.500.1")
+     @MemberOrder(sequence="500.500.2")
      public Clob downloadMetaModelXml(
 +            
              @ParameterLayout(named = ".xml file name")
-             @Parameter(optionality=Optionality.MANDATORY)
              final String fileName,
-             
-             @ParameterLayout(
-                 named = "Package Prefix", 
+             @ParameterLayout(named = "Packages",
 -                    describedAs="Subset of the complete meta model, only including packages starting with given prefix.")
 +                describedAs="Subset of the complete meta model, only including packages starting with given prefix.")
-             @Parameter(optionality=Optionality.MANDATORY)
-             final String packagePrefix,
-             
+             final List<String> packages,
              @ParameterLayout(named = "Ignore Interfaces")
              @Parameter(optionality=Optionality.MANDATORY)
              final boolean ignoreInterfaces
 -    ) {
 +            
 +            ) {
  
-         Config modelConfig = new MetaModelService.Config()
+         MetaModelService.Config config =
+                 new MetaModelService.Config()
 -                        .withIgnoreNoop()
 -                        .withIgnoreAbstractClasses()
 +                .withIgnoreNoop()
 +                .withIgnoreAbstractClasses()
-                 .withIgnoreBuiltInValueTypes()
-                 .withPackagePrefix(packagePrefix);
-         
+                         .withIgnoreInterfaces()
+                         .withIgnoreBuiltInValueTypes();
+         for (final String pkg : packages) {
+             config = config.withPackagePrefix(pkg);
+         }
          if(ignoreInterfaces) {
-             modelConfig = modelConfig.withIgnoreInterfaces();
+             config = config.withIgnoreInterfaces();
          }
 -
 +        
-         final MetamodelDto metamodelDto = metaModelService.exportMetaModel(modelConfig);
-         final String xml = toXml(metamodelDto); 
-         return new Clob(_Strings.asFileNameWithExtension(fileName,  ".xml"), "text/xml", xml);
+ 
+         final MetamodelDto metamodelDto =  metaModelService.exportMetaModel(config);
+ 
+         final String xml = jaxbService.toXml(metamodelDto);
 -        return new Clob(_Strings.asFileNameWithExtension(fileName,  ".xml"), "text/xml", xml);
++        return new Clob(_Strings.asFileNameWithExtension(fileName,  ".xml"), mimeTypeTextXml, xml);
+     }
+ 
+     public String validateDownloadMetaModelXml(
+             final String fileName, final List<String> packagePrefixes, final boolean ignoreInterfaces) {
+         if(packagePrefixes == null || packagePrefixes.isEmpty()) {
+             return "At least one package must be selected";
+         }
+         return null;
      }
  
      public String default0DownloadMetaModelXml() {
          return "metamodel.xml";
      }
 -
 +    
-     public String default1DownloadMetaModelXml() {
-         return "domainapp";
+     public List<String> choices1DownloadMetaModelXml() {
+         final DomainModel domainModel = metaModelService.getDomainModel();
+         final List<DomainMember> export = domainModel.getDomainMembers();
+         final SortedSet<String> packages = _Sets.newTreeSet();
+         for (final DomainMember domainMember : export) {
+             final String packageName = domainMember.getPackageName();
+             final String[] split = packageName.split("[.]");
+             final StringBuilder buf = new StringBuilder();
+             for (final String part : split) {
+                 if(buf.length() > 0) {
+                     buf.append(".");
+                 }
+                 buf.append(part);
+                 packages.add(buf.toString());
+             }
+         }
+         return new ArrayList<>(packages);
      }
 -
 +    
      public boolean default2DownloadMetaModelXml() {
          return true;
      }
 -
 -
 +    
      // //////////////////////////////////////
 -
 +    
-     @Action(
-             domainEvent = DownloadMetaModelEvent.class,
-             semantics = SemanticsOf.SAFE,
-             restrictTo = RestrictTo.PROTOTYPING
-             )
-     @ActionLayout(
-             cssClassFa = "fa-download",
-             named = "Download Meta Model (CSV)"
-             )
-     @MemberOrder(sequence="500.500.2")
-     public Clob downloadMetaModelCsv(
-             @ParameterLayout(named = ".csv file name")
-             final String csvFileName) {
- 
-         final DomainModel domainMembers =  metaModelService.getDomainModel();
-         final List<String> list = asList(domainMembers);
-         final StringBuilder buf = asBuf(list);
- 
-         return new Clob(
-                 Util.withSuffix(csvFileName, "csv"),
-                 mimeTypeTextCsv, buf.toString().toCharArray());
-     }
- 
-     public String default0DownloadMetaModelCsv() {
-         return "metamodel.csv";
-     }
- 
-     // -- XML HELPER
-     
-     @Inject JaxbService jaxbService;
-     
-     private String toXml(MetamodelDto model) {
-         return jaxbService.toXml(model);    
-     }
-     
-     // -- CSV HELPER
- 
      private static StringBuilder asBuf(final List<String> list) {
          final StringBuilder buf = new StringBuilder();
          for (final String row : list) {
@@@ -209,6 -237,9 +232,7 @@@
      }
  
  
 -    @javax.inject.Inject
 -    MetaModelService metaModelService;
 -    @Inject
 -    JaxbService jaxbService;
 +    @Inject MetaModelService metaModelService;
++    @Inject JaxbService jaxbService;
  
  }
diff --cc core/config/src/main/java/org/apache/isis/config/builder/IsisConfigurationDefault.java
index fa86bc4,a7aaa28..a45ecfe
--- a/core/config/src/main/java/org/apache/isis/config/builder/IsisConfigurationDefault.java
+++ b/core/config/src/main/java/org/apache/isis/config/builder/IsisConfigurationDefault.java
@@@ -49,16 -48,9 +49,9 @@@ import static org.apache.isis.commons.i
  
  
  /**
-  * This object will typically be registered as the implementation of the {@link ConfigurationServiceInternal}
-  * (internal) domain service, using
-  * {@link ServicesInjector#addFallbackIfRequired(Class, Object)}.
-  *
-  * <p>
-  *     If an integration test is running, then the <code>IsisConfigurationForJdoIntegTests</code> 
-  *     will be used instead.
-  * </p>
+  * This object is the default implementation of the {@link IsisConfiguration} domain service.
   */
 -@DomainObject(nature=Nature.INMEMORY_ENTITY, objectType="internal.IsisConfiguration")
 +@Vetoed
  class IsisConfigurationDefault implements IsisConfiguration {
  
      private static final Logger LOG = LoggerFactory.getLogger(IsisConfigurationDefault.class);
diff --cc core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/metamodel/MetaModelServiceDefault.java
index 0431d65,ebc4637..ee087a4
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/metamodel/MetaModelServiceDefault.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/metamodel/MetaModelServiceDefault.java
@@@ -36,10 -42,7 +36,9 @@@ import org.apache.isis.applib.services.
  import org.apache.isis.applib.services.metamodel.DomainMember;
  import org.apache.isis.applib.services.metamodel.DomainModel;
  import org.apache.isis.applib.services.metamodel.MetaModelService;
- import org.apache.isis.commons.internal.base._Blackhole;
 +import org.apache.isis.commons.internal.cdi._CDI;
  import org.apache.isis.commons.internal.collections._Lists;
 +import org.apache.isis.config.internal._Config;
  import org.apache.isis.core.metamodel.JdoMetamodelUtil;
  import org.apache.isis.core.metamodel.facets.actions.command.CommandFacet;
  import org.apache.isis.core.metamodel.facets.object.objectspecid.ObjectSpecIdFacet;
@@@ -94,20 -102,8 +93,10 @@@ public class MetaModelServiceDefault im
      @Override
      public void rebuild(final Class<?> domainType) {
          specificationLookup.invalidateCache(domainType);
 +        
 +        GridService gridService = _CDI.getManagedBean(GridService.class).get();
          gridService.remove(domainType);
-         
-         final ObjectSpecification objectSpecification = specificationLookup.loadSpecification(domainType);
-         
-         // ensure the spec is fully rebuilt
-         objectSpecification.streamObjectActions(Contributed.INCLUDED)
-         .forEach(_Blackhole::consume);
-         
-         objectSpecification.streamAssociations(Contributed.INCLUDED)
-         .forEach(_Blackhole::consume);
-         
-         specificationLookup.postProcess(objectSpecification);
+         specificationLookup.loadSpecification(domainType);
      }
  
      // //////////////////////////////////////
diff --cc core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/SpecificationLoader.java
index def55d4,4644513..9e826a5
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/SpecificationLoader.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/SpecificationLoader.java
@@@ -21,10 -21,8 +21,11 @@@ import java.util.List
  import java.util.concurrent.Callable;
  import java.util.concurrent.Future;
  import java.util.stream.Collectors;
+ import java.util.stream.Stream;
  
 +import javax.ejb.Singleton;
 +import javax.enterprise.context.ApplicationScoped;
 +
  import org.slf4j.Logger;
  import org.slf4j.LoggerFactory;
  
@@@ -32,17 -30,21 +33,22 @@@ import org.apache.isis.applib.AppManife
  import org.apache.isis.applib.annotation.DomainService;
  import org.apache.isis.applib.annotation.NatureOfService;
  import org.apache.isis.applib.annotation.Programmatic;
 +import org.apache.isis.applib.services.inject.ServiceInjector;
++import org.apache.isis.applib.services.registry.ServiceRegistry;
  import org.apache.isis.commons.internal.collections._Lists;
+ 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.config.property.ConfigPropertyBoolean;
+ import org.apache.isis.config.property.ConfigPropertyEnum;
 -import org.apache.isis.core.commons.components.ApplicationScopedComponent;
  import org.apache.isis.core.commons.ensure.Assert;
  import org.apache.isis.core.commons.exceptions.IsisException;
  import org.apache.isis.core.commons.lang.ClassUtil;
++import org.apache.isis.core.metamodel.MetaModelContext;
  import org.apache.isis.core.metamodel.facetapi.Facet;
- import org.apache.isis.core.metamodel.facets.FacetFactory;
- import org.apache.isis.core.metamodel.facets.object.autocomplete.AutoCompleteFacet;
+ import org.apache.isis.core.metamodel.facets.object.domainservice.DomainServiceFacet;
  import org.apache.isis.core.metamodel.facets.object.objectspecid.ObjectSpecIdFacet;
  import org.apache.isis.core.metamodel.progmodel.ProgrammingModel;
 -import org.apache.isis.core.metamodel.services.ServicesInjector;
  import org.apache.isis.core.metamodel.spec.FreeStandingList;
  import org.apache.isis.core.metamodel.spec.ObjectSpecId;
  import org.apache.isis.core.metamodel.spec.ObjectSpecification;
@@@ -102,33 -108,30 +113,26 @@@ public class SpecificationLoader 
      private final SpecificationCacheDefault cache = new SpecificationCacheDefault();
      private final PostProcessor postProcessor;
  
-     enum State {
-         NOT_INITIALIZED,
-         CACHING,
-         INTROSPECTING
-     }
  
 -
      public SpecificationLoader(
              final ProgrammingModel programmingModel,
 -            final MetaModelValidator metaModelValidator,
 -            final ServicesInjector servicesInjector) {
 +            final MetaModelValidator metaModelValidator) {
  
 -        this.servicesInjector = servicesInjector;
          this.programmingModel = programmingModel;
          this.metaModelValidator = metaModelValidator;
  
          this.facetProcessor = new FacetProcessor(programmingModel);
 -        this.postProcessor = new PostProcessor(programmingModel, servicesInjector);
 +        this.postProcessor = new PostProcessor(programmingModel);
- 
-         this.state = State.NOT_INITIALIZED;
      }
  
+ 
      // -- init
  
-     private State state;
  
      /**
       * Initializes and wires up, and primes the cache based on any service
-      * classes (provided by the {@link ServiceInjector}).
+      * classes (provided by the {@link ServicesInjector}).
       */
 -    @Programmatic
      public void init() {
  
          if (LOG.isDebugEnabled()) {
@@@ -143,39 -146,77 +147,77 @@@
          facetProcessor.init();
  
          postProcessor.init();
 -        metaModelValidator.init(this);
 +        metaModelValidator.init();
  
  
-         state = State.CACHING;
- 
          // need to completely load services and mixins (synchronously)
+         LOG.info("Loading all specs (up to state of {})", IntrospectionState.NOT_INTROSPECTED);
+ 
          final List<ObjectSpecification> specificationsFromRegistry = _Lists.newArrayList();
  
+         // we use allServiceClasses() - obtained from servicesInjector - rather than reading from the
+         // AppManifest.Registry.instance().getDomainServiceTypes(), because the former also has the fallback
+         // services set up in IsisSessionFactoryBuilder beforehand.
+         final List<ObjectSpecification> domainServiceSpecs =
          loadSpecificationsFor(
-                 CommonDtoUtils.VALUE_TYPES, null,
-                 IntrospectionStrategy.STUB, specificationsFromRegistry);
-         loadSpecificationsFor(
-                 AppManifest.Registry.instance().getDomainServiceTypes(), NatureOfService.DOMAIN,
-                 IntrospectionStrategy.STUB, specificationsFromRegistry);
+                 streamServiceClasses().collect(Collectors.toList()), NatureOfService.DOMAIN,
+                 specificationsFromRegistry, IntrospectionState.NOT_INTROSPECTED
+         );
+         final List<ObjectSpecification> mixinSpecs =
 -            loadSpecificationsFor(
 +        loadSpecificationsFor(
                  AppManifest.Registry.instance().getMixinTypes(), null,
-                 IntrospectionStrategy.STUB, specificationsFromRegistry);
+                 specificationsFromRegistry, IntrospectionState.NOT_INTROSPECTED
+         );
+         loadSpecificationsFor(
+                 CommonDtoUtils.VALUE_TYPES, null,
+                 specificationsFromRegistry, IntrospectionState.NOT_INTROSPECTED
+         );
          loadSpecificationsFor(
                  AppManifest.Registry.instance().getDomainObjectTypes(), null,
-                 IntrospectionStrategy.STUB, specificationsFromRegistry);
+                 specificationsFromRegistry, IntrospectionState.NOT_INTROSPECTED
+         );
          loadSpecificationsFor(
                  AppManifest.Registry.instance().getViewModelTypes(), null,
-                 IntrospectionStrategy.STUB, specificationsFromRegistry);
+                 specificationsFromRegistry, IntrospectionState.NOT_INTROSPECTED
+         );
          loadSpecificationsFor(
                  AppManifest.Registry.instance().getXmlElementTypes(), null,
-                 IntrospectionStrategy.STUB, specificationsFromRegistry);
+                 specificationsFromRegistry, IntrospectionState.NOT_INTROSPECTED
+         );
+ 
+         cache.init();
  
-         state = State.INTROSPECTING;
          final Collection<ObjectSpecification> cachedSpecifications = allCachedSpecifications();
  
+         logBefore(specificationsFromRegistry, cachedSpecifications);
+ 
+         LOG.info("Introspecting all specs up to {}", IntrospectionState.TYPE_INTROSPECTED);
+         introspect(specificationsFromRegistry, IntrospectionState.TYPE_INTROSPECTED);
+ 
+         LOG.info("Introspecting domainService specs up to {}", IntrospectionState.TYPE_AND_MEMBERS_INTROSPECTED);
+         introspect(domainServiceSpecs, IntrospectionState.TYPE_AND_MEMBERS_INTROSPECTED);
+ 
+         LOG.info("Introspecting mixin specs up to {}", IntrospectionState.TYPE_AND_MEMBERS_INTROSPECTED);
+         introspect(mixinSpecs, IntrospectionState.TYPE_AND_MEMBERS_INTROSPECTED);
  
-         // for debugging only
-         LOG.info(String.format(
+         logAfter(cachedSpecifications);
+ 
+         final IntrospectionMode mode = CONFIG_PROPERTY_MODE.from(getConfiguration());
+         if(mode.isFullIntrospect(_Context.getEnvironment().getDeploymentType())) {
+             LOG.info("Introspecting all cached specs up to {}", IntrospectionState.TYPE_AND_MEMBERS_INTROSPECTED);
+             introspect(cachedSpecifications, IntrospectionState.TYPE_AND_MEMBERS_INTROSPECTED);
+         }
+ 
+         LOG.info("init() - done");
+     }
+ 
+     private void logBefore(
+             final List<ObjectSpecification> specificationsFromRegistry,
+             final Collection<ObjectSpecification> cachedSpecifications) {
+         if(!LOG.isDebugEnabled()) {
+             return;
+         }
+         LOG.debug(String.format(
                  "specificationsFromRegistry.size = %d ; cachedSpecifications.size = %d",
                  specificationsFromRegistry.size(), cachedSpecifications.size()));
  
@@@ -209,41 -265,26 +266,26 @@@
              };
              callables.add(callable);
          }
 +        
-         ThreadPoolSupport threadPoolSupport = ThreadPoolSupport.getInstance();
-         final boolean parallelize = _Config.getConfiguration()
-                 .getBoolean(INTROSPECTOR_PARALLELIZE_KEY, INTROSPECTOR_PARALLELIZE_DEFAULT);
-         List<Future<Object>> futures;
-         if(parallelize) {
-             futures = threadPoolSupport.invokeAll(callables);
-         } else {
-             futures = threadPoolSupport.invokeAllSequential(callables);
+         invokeAndWait(callables);
 -    }
 +        }
-         threadPoolSupport.joinGatherFailures(futures);
- 
-         // for debugging only
-         final Collection<ObjectSpecification> cachedSpecificationsAfter = cache.allSpecifications();
-         List<ObjectSpecification> cachedAfterNotBefore = cachedSpecificationsAfter.stream()
-                 .filter(spec -> !cachedSpecifications.contains(spec))
-                 .collect(Collectors.toList());
- 
-         LOG.info(String.format("cachedSpecificationsAfter.size = %d ; cachedAfterNotBefore.size = %d",
-                 cachedSpecificationsAfter.size(), cachedAfterNotBefore.size()));
- 
- 
-         // only after full introspection has occurred do we cache ObjectSpecifications
-         // by their ObjectSpecId.
-         // the cache (SpecificationCacheDefault will fail-fast as not initialized
-         cache.init();
  
+     private void invokeAndWait(final List<Callable<Object>> callables) {
+         final ThreadPoolSupport threadPoolSupport = ThreadPoolSupport.getInstance();
+         final boolean parallelize = CONFIG_PROPERTY_PARALLELIZE.from(getConfiguration());
 -
+         final List<Future<Object>> futures = parallelize
+                 ? threadPoolSupport.invokeAll(callables)
+                 : threadPoolSupport.invokeAllSequential(callables);
+         threadPoolSupport.joinGatherFailures(futures);
      }
  
-     private void loadSpecificationsFor(
+     private List<ObjectSpecification> loadSpecificationsFor(
              final Collection<Class<?>> domainTypes,
              final NatureOfService natureOfServiceFallback,
-             final IntrospectionStrategy introspectionStrategy,
-             final List<ObjectSpecification> appendTo) {
+             final List<ObjectSpecification> appendTo,
+             final IntrospectionState upTo) {
  
+         final List<ObjectSpecification> specs = _Lists.newArrayList();
          for (final Class<?> domainType : domainTypes) {
  
              ObjectSpecification objectSpecification =
@@@ -304,13 -348,19 +347,17 @@@
  
      private ValidationFailures validationFailures;
  
 -    @Programmatic
      public void validateAndAssert() {
+         final IntrospectionMode mode = CONFIG_PROPERTY_MODE.from(getConfiguration());
+         if(!mode.isFullIntrospect(_Context.getEnvironment().getDeploymentType())) {
+             LOG.info("Meta model validation skipped (full introspection of metamodel not configured)");
+             return;
+         }
+ 
          ValidationFailures validationFailures = validate();
          validationFailures.assertNone();
- 
-         cache.init();
      }
  
 -    @Programmatic
      public ValidationFailures validate() {
          if(validationFailures == null) {
              validationFailures = new ValidationFailures();
@@@ -329,7 -379,13 +376,11 @@@
       * the configured {@link org.apache.isis.core.metamodel.specloader.classsubstitutor.ClassSubstitutor}
       * has filtered out the class.
       */
 -    @Programmatic
      public ObjectSpecification loadSpecification(final String className) {
+         return loadSpecification(className, IntrospectionState.TYPE_INTROSPECTED);
+     }
+ 
 -    @Programmatic
+     public ObjectSpecification loadSpecification(final String className, final IntrospectionState upTo) {
          assert className != null;
  
          try {
@@@ -344,11 -400,31 +395,29 @@@
          }
      }
  
-     /**
-      * @see #loadSpecification(String)
-      */
 -    @Programmatic
      public ObjectSpecification loadSpecification(final Class<?> type) {
-         final ObjectSpecification spec = internalLoadSpecification(type);
+         return loadSpecification(type, IntrospectionState.TYPE_INTROSPECTED);
+     }
+ 
+     @Programmatic
+     public ObjectSpecification peekSpecification(final Class<?> type) {
+ 
+         final Class<?> substitutedType = classSubstitutor.getClass(type);
+         if (substitutedType == null) {
+             return null;
+         }
+ 
+         final String typeName = substitutedType.getName();
+         ObjectSpecification spec = cache.get(typeName);
+         if (spec != null) {
+             return spec;
+         }
+ 
+         return null;
+     }
+ 
 -    @Programmatic
+     public ObjectSpecification loadSpecification(final Class<?> type, final IntrospectionState upTo) {
+         final ObjectSpecification spec = internalLoadSpecification(type, null, upTo);
          if(spec == null) {
              return null;
          }
@@@ -368,75 -448,49 +441,48 @@@
      private ObjectSpecification internalLoadSpecification(
              final Class<?> type,
              final NatureOfService natureFallback,
-             final IntrospectionStrategy introspectionStrategy) {
+             final IntrospectionState upTo) {
  
          final Class<?> substitutedType = classSubstitutor.getClass(type);
-         return substitutedType != null
-                 ? loadSpecificationForSubstitutedClass(substitutedType, natureFallback, introspectionStrategy)
-                 : null;
+         if (substitutedType == null) {
+             return null;
 -        }
 +    }
+         Assert.assertNotNull(substitutedType);
  
-     private ObjectSpecification loadSpecificationForSubstitutedClass(
-             final Class<?> type,
-             final NatureOfService natureFallback,
-             final IntrospectionStrategy introspectionStrategy) {
-         Assert.assertNotNull(type);
- 
-         final String typeName = type.getName();
-         final ObjectSpecification spec = cache.get(typeName);
+         final String typeName = substitutedType.getName();
+         ObjectSpecification spec = cache.get(typeName);
          if (spec != null) {
              return spec;
          }
  
-         return loadSpecificationForSubstitutedClassSynchronized(type, natureFallback, introspectionStrategy);
-     }
- 
- 
-     private synchronized ObjectSpecification loadSpecificationForSubstitutedClassSynchronized(
-             final Class<?> type,
-             final NatureOfService natureOfServiceFallback,
-             final IntrospectionStrategy introspectionStrategy) {
- 
-         final String typeName = type.getName();
-         final ObjectSpecification spec = cache.get(typeName);
+         synchronized (this) {
+             // inside the synchronized block
+             spec = cache.get(typeName);
 -            if (spec != null) {
 -                return spec;
 -            }
 +        if (spec != null) {
-             // because caller isn't synchronized.
 +            return spec;
 +        }
  
-         final ObjectSpecification specification = createSpecification(type, natureOfServiceFallback);
+             final ObjectSpecification specification = createSpecification(substitutedType, natureFallback);
  
 -            // put into the cache prior to introspecting, to prevent
 -            // infinite loops
 -            cache.cache(typeName, specification);
 +        // put into the cache prior to introspecting, to prevent
 +        // infinite loops
 +        cache.cache(typeName, specification);
  
-         if(introspectionStrategy == IntrospectionStrategy.COMPLETE) {
-             introspectIfRequired(specification);
-         }
+             final ObjectSpecificationAbstract specSpi = (ObjectSpecificationAbstract) specification;
+             specSpi.introspectUpTo(upTo);
  
 -            return specification;
 -        }
 +        return specification;
 +    }
+     }
  
      /**
       * Loads the specifications of the specified types except the one specified
       * (to prevent an infinite loop).
       */
-     public boolean loadSpecifications(final List<Class<?>> typesToLoad, final Class<?> typeToIgnore) {
 -    @Programmatic
+     public boolean loadSpecifications(
+             final List<Class<?>> typesToLoad,
+             final Class<?> typeToIgnore,
+             final IntrospectionState upTo) {
          boolean anyLoadedAsNull = false;
          for (final Class<?> typeToLoad : typesToLoad) {
              if (typeToLoad != typeToIgnore) {
@@@ -463,8 -511,11 +503,11 @@@
              final NatureOfService fallback) {
  
          // ... and create the specs
+         final ObjectSpecificationAbstract objectSpec;
          if (FreeStandingList.class.isAssignableFrom(cls)) {
-             return new ObjectSpecificationOnStandaloneList(facetProcessor);
+ 
 -            objectSpec = new ObjectSpecificationOnStandaloneList(servicesInjector, facetProcessor, postProcessor);
++            objectSpec = new ObjectSpecificationOnStandaloneList(facetProcessor, postProcessor);
+ 
          } else {
  
              final FacetedMethodsBuilderContext facetedMethodsBuilderContext =
@@@ -473,9 -524,12 +516,12 @@@
  
              final NatureOfService natureOfServiceIfAny = natureOfServiceFrom(cls, fallback);
  
-             return new ObjectSpecificationDefault(cls, facetedMethodsBuilderContext,
-                     facetProcessor, natureOfServiceIfAny);
+             objectSpec = new ObjectSpecificationDefault(cls,
+                                     facetedMethodsBuilderContext,
 -                                    servicesInjector, facetProcessor, natureOfServiceIfAny, postProcessor);
++                                    facetProcessor, natureOfServiceIfAny, postProcessor);
          }
+ 
+         return objectSpec;
      }
  
      private NatureOfService natureOfServiceFrom(
@@@ -493,57 -547,9 +539,6 @@@
          return ClassUtil.forName(className);
      }
  
-     /**
-      * Typically does not need to be called, but is available for {@link FacetFactory}s to force
-      * early introspection of referenced specs in certain circumstances.
-      *
-      * <p>
-      * Originally introduced to support {@link AutoCompleteFacet}.
-      */
-     private ObjectSpecification introspectIfRequired(final ObjectSpecification spec) {
- 
-         if(state != State.INTROSPECTING) {
-             return spec;
-         }
- 
-         final ObjectSpecificationAbstract specSpi = (ObjectSpecificationAbstract)spec;
-         final ObjectSpecificationAbstract.IntrospectionState introspectionState = specSpi.getIntrospectionState();
- 
-         // REVIEW: can't remember why this is done in multiple passes, could it be simplified?
-         switch (introspectionState) {
-         case NOT_INTROSPECTED:
- 
-             specSpi.setIntrospectionState(ObjectSpecificationAbstract.IntrospectionState.BEING_INTROSPECTED);
-             introspect(specSpi);
-             break;
-         case BEING_INTROSPECTED:
-             introspect(specSpi);
-             break;
-         case INTROSPECTED:
-             // nothing to do
-             break;
-         }
-         return spec;
-     }
- 
-     private void introspect(final ObjectSpecificationAbstract specSpi) {
-         specSpi.introspectTypeHierarchyAndMembers();
-         specSpi.updateFromFacetValues();
-         specSpi.setIntrospectionState(ObjectSpecificationAbstract.IntrospectionState.INTROSPECTED);
-     }
- 
-     public void postProcess() {
-         final Collection<ObjectSpecification> specs = allSpecifications();
-         for (final ObjectSpecification spec : specs) {
-             postProcess(spec);
-         }
--
-     }
--
-     public void postProcess(final ObjectSpecification spec) {
-         postProcessor.postProcess(spec);
-     }
--
      // -- allSpecifications
      /**
       * Returns (a new list holding a copy of) all the loaded specifications.
@@@ -562,6 -569,19 +557,17 @@@
          return cache.allSpecifications();
      }
  
 -    // -- getServiceClasses, isServiceClass
+ 
 -    @Programmatic
+     public Stream<Class<?>> streamServiceClasses() {
 -        return servicesInjector.streamServiceTypes();
++        final ServiceRegistry registry = MetaModelContext.current().getServiceRegistry();
++        return registry.streamServiceTypes();
+     }
+ 
 -    @Programmatic
+     public boolean isServiceClass(Class<?> cls) {
+         final ObjectSpecification objectSpecification = peekSpecification(cls);
+         return objectSpecification != null && objectSpecification.containsDoOpFacet(DomainServiceFacet.class);
+     }
+ 
      // -- loaded
      /**
       * Whether this class has been loaded.
@@@ -590,4 -613,13 +596,8 @@@
          return objectSpecification;
      }
  
 -    @Programmatic
+     public IsisConfiguration getConfiguration() {
+         return _Config.getConfiguration();
+     }
+ 
 -    @Programmatic
 -    public ServicesInjector getServicesInjector() {
 -        return servicesInjector;
 -    }
  }
diff --cc core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/facetprocessor/FacetProcessor.java
index d909a25,a62b713..e13c10c
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/facetprocessor/FacetProcessor.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/facetprocessor/FacetProcessor.java
@@@ -44,12 -41,15 +44,14 @@@ import org.apache.isis.core.metamodel.f
  import org.apache.isis.core.metamodel.facets.MethodFilteringFacetFactory;
  import org.apache.isis.core.metamodel.facets.MethodPrefixBasedFacetFactory;
  import org.apache.isis.core.metamodel.facets.MethodRemoverConstants;
+ import org.apache.isis.core.metamodel.facets.ObjectSpecIdFacetFactory;
+ import org.apache.isis.core.metamodel.facets.ObjectSpecIdFacetFactory.ProcessObjectSpecIdContext;
  import org.apache.isis.core.metamodel.facets.PropertyOrCollectionIdentifyingFacetFactory;
  import org.apache.isis.core.metamodel.progmodel.ProgrammingModel;
 -import org.apache.isis.core.metamodel.services.ServicesInjector;
 -import org.apache.isis.core.metamodel.services.ServicesInjectorAware;
  import org.apache.isis.core.metamodel.spec.feature.ObjectMember;
  
 -public class FacetProcessor implements ServicesInjectorAware {
 +@ApplicationScoped
 +public class FacetProcessor {
  
      private final ProgrammingModel programmingModel;
  
diff --cc core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectSpecificationAbstract.java
index 93ad48a,e1c1c67..a0930c5
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectSpecificationAbstract.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectSpecificationAbstract.java
@@@ -19,6 -19,6 +19,8 @@@
  
  package org.apache.isis.core.metamodel.specloader.specimpl;
  
++import static org.apache.isis.commons.internal.base._NullSafe.stream;
++
  import java.util.Collections;
  import java.util.List;
  import java.util.Map;
@@@ -88,11 -87,13 +89,10 @@@ import org.apache.isis.core.metamodel.s
  import org.apache.isis.core.metamodel.spec.feature.OneToOneAssociation;
  import org.apache.isis.core.metamodel.specloader.SpecificationLoader;
  import org.apache.isis.core.metamodel.specloader.facetprocessor.FacetProcessor;
+ import org.apache.isis.core.metamodel.specloader.postprocessor.PostProcessor;
 -import org.apache.isis.core.plugins.environment.DeploymentType;
  import org.apache.isis.core.security.authentication.AuthenticationSession;
  import org.apache.isis.objectstore.jdo.metamodel.facets.object.persistencecapable.JdoPersistenceCapableFacet;
  
--import static org.apache.isis.commons.internal.base._NullSafe.stream;
--
  public abstract class ObjectSpecificationAbstract extends FacetHolderImpl implements ObjectSpecification {
  
      private final static Logger LOG = LoggerFactory.getLogger(ObjectSpecificationAbstract.class);
@@@ -118,9 -120,10 +118,10 @@@
  
      // -- fields
  
 -    protected final ServicesInjector servicesInjector;
 +    //protected final ServiceInjector servicesInjector;
  
 +    private final MetaModelContext context;
+     private PostProcessor postProcessor;
 -    private final DeploymentType deploymentType;
      private final SpecificationLoader specificationLoader;
      private final FacetProcessor facetProcessor;
  
@@@ -157,13 -161,16 +158,14 @@@
      private NavigableParentFacet navigableParentFacet;
      private CssClassFacet cssClassFacet;
  
-     private IntrospectionState introspected = IntrospectionState.NOT_INTROSPECTED;
+     private IntrospectionState introspectionState = IntrospectionState.NOT_INTROSPECTED;
 -
 -
 +    
      // -- Constructor
      public ObjectSpecificationAbstract(
              final Class<?> introspectedClass,
              final String shortName,
-             final FacetProcessor facetProcessor) {
 -            final ServicesInjector servicesInjector,
+             final FacetProcessor facetProcessor,
+             final PostProcessor postProcessor) {
  
          this.correspondingClass = introspectedClass;
          this.fullName = introspectedClass.getName();
@@@ -172,9 -179,12 +174,10 @@@
          this.isAbstract = ClassExtensions.isAbstract(introspectedClass);
          this.identifier = Identifier.classIdentifier(introspectedClass);
  
 -        this.servicesInjector = servicesInjector;
          this.facetProcessor = facetProcessor;
 -
 -        this.specificationLoader = servicesInjector.getSpecificationLoader();
 -        this.deploymentType = _Context.getEnvironment().getDeploymentType();
 +        this.context = MetaModelContext.current();
 +        this.specificationLoader = context.getSpecificationLoader();
+         this.postProcessor = postProcessor;
      }
  
      // -- Stuff immediately derivable from class
@@@ -222,39 -232,53 +225,53 @@@
      }
  
  
-     public enum IntrospectionState {
-         NOT_INTROSPECTED,
-         BEING_INTROSPECTED,
-         INTROSPECTED,
-     }
- 
      /**
-      * Only if {@link #setIntrospectionState(org.apache.isis.core.metamodel.specloader.specimpl.ObjectSpecificationAbstract.IntrospectionState)}
-      * has been called (should be called within {@link #updateFromFacetValues()}.
+      * Keeps introspecting up to the level required.
       */
-     public IntrospectionState getIntrospectionState() {
-         return introspected;
+     public void introspectUpTo(final IntrospectionState upTo) {
+ 
+         LOG.debug("introspectingUpTo: {}, {}", getFullIdentifier(), upTo);
+ 
+         switch (introspectionState) {
+         case NOT_INTROSPECTED:
+             if(this.introspectionState.compareTo(upTo) < 0) {
+                 // set to avoid infinite loops
+                 this.introspectionState = IntrospectionState.TYPE_BEING_INTROSPECTED;
+                 introspectTypeHierarchy();
+                 updateFromFacetValues();
+                 this.introspectionState = IntrospectionState.TYPE_INTROSPECTED;
+             }
+             if(this.introspectionState.compareTo(upTo) < 0) {
+                 this.introspectionState = IntrospectionState.MEMBERS_BEING_INTROSPECTED;
+                 introspectMembers();
+                 this.introspectionState = IntrospectionState.TYPE_AND_MEMBERS_INTROSPECTED;
+             }
+             // set to avoid infinite loops
+             break;
+         case TYPE_BEING_INTROSPECTED:
+             // nothing to do
+             break;
+         case TYPE_INTROSPECTED:
+             if(this.introspectionState.compareTo(upTo) < 0) {
+                 // set to avoid infinite loops
+                 this.introspectionState = IntrospectionState.MEMBERS_BEING_INTROSPECTED;
+                 introspectMembers();
+                 this.introspectionState = IntrospectionState.TYPE_AND_MEMBERS_INTROSPECTED;
 -            }
 +    }
- 
-     public void setIntrospectionState(IntrospectionState introspectationState) {
-         this.introspected = introspectationState;
+             break;
+         case MEMBERS_BEING_INTROSPECTED:
+             // nothing to do
+         case TYPE_AND_MEMBERS_INTROSPECTED:
+             // nothing to do
+             break;
 -        }
 +    }
- 
-     protected boolean isNotIntrospected() {
-         return !(getIntrospectionState() == IntrospectionState.INTROSPECTED);
      }
  
+     protected abstract void introspectTypeHierarchy();
+     protected abstract void introspectMembers();
  
  
-     // -- Introspection (part 1)
- 
-     public abstract void introspectTypeHierarchyAndMembers();
- 
-     /**
-      * Intended to be called within {@link #introspectTypeHierarchyAndMembers()}
-      * .
-      */
-     protected void updateSuperclass(final Class<?> superclass) {
+     protected void loadSpecOfSuperclass(final Class<?> superclass) {
          if (superclass == null) {
              return;
          }
@@@ -601,7 -612,8 +605,8 @@@
      
      @Override
      public Stream<ObjectAssociation> streamAssociations(final Contributed contributed) {
+         introspectUpTo(IntrospectionState.TYPE_AND_MEMBERS_INTROSPECTED);
 -
 +        
          guardAgainstTooEarly_assoz(contributed);
          
          return stream(this.associations)
@@@ -684,7 -695,8 +688,8 @@@
  
      @Override
      public Stream<ObjectAction> streamObjectActions(final ActionType type, final Contributed contributed) {
+         introspectUpTo(IntrospectionState.TYPE_AND_MEMBERS_INTROSPECTED);
 -
 +        
          guardAgainstTooEarly_contrib(contributed);
          
          return stream(objectActionsByType.get(type))
@@@ -1207,8 -1222,10 +1212,10 @@@
          if(contributed.isIncluded() && !contributeeAndMixedInAssociationsAdded) {
              synchronized (this.associations) {
                  List<ObjectAssociation> associations = _Lists.newArrayList(this.associations);
+                 if(isPersistenceCapableOrViewModel()) {
 -                    associations.addAll(createContributeeAssociations());
 -                    associations.addAll(createMixedInAssociations());
 +                associations.addAll(createContributeeAssociations());
 +                associations.addAll(createMixedInAssociations());
+                 }
                  sortAndUpdateAssociations(associations);
                  contributeeAndMixedInAssociationsAdded = true;
              }
diff --cc core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/dflt/ObjectSpecificationDefault.java
index 298d2de,5e6fb94..cd4e9b2
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/dflt/ObjectSpecificationDefault.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/dflt/ObjectSpecificationDefault.java
@@@ -95,26 -101,26 +98,24 @@@ public class ObjectSpecificationDefaul
      public ObjectSpecificationDefault(
              final Class<?> correspondingClass,
              final FacetedMethodsBuilderContext facetedMethodsBuilderContext,
 -            final ServicesInjector servicesInjector,
              final FacetProcessor facetProcessor,
-             final NatureOfService natureOfServiceIfAny) {
-         super(correspondingClass, determineShortName(correspondingClass), facetProcessor);
+             final NatureOfService natureOfServiceIfAny,
+             final PostProcessor postProcessor) {
 -        super(correspondingClass, determineShortName(correspondingClass),
 -                servicesInjector, facetProcessor, postProcessor);
++        super(correspondingClass, determineShortName(correspondingClass), facetProcessor, postProcessor);
  
          this.isService = natureOfServiceIfAny != null;
          this.facetedMethodsBuilder = new FacetedMethodsBuilder(this, facetedMethodsBuilderContext);
+ 
+         facetProcessor.processObjectSpecId(correspondingClass, this);
      }
  
-     // -- introspectTypeHierarchyAndMembers
      @Override
-     public void introspectTypeHierarchyAndMembers() {
+     protected void introspectTypeHierarchy() {
  
-         if(isNotIntrospected()) {
 -        facetedMethodsBuilder.introspectClass();
 +            facetedMethodsBuilder.introspectClass();
-         }
  
          // name
-         if(isNotIntrospected()) {
 -        addNamedFacetAndPluralFacetIfRequired();
 +            addNamedFacetAndPluralFacetIfRequired();
-         }
  
          // go no further if a value
          if(this.containsFacet(ValueFacet.class)) {
@@@ -124,12 -130,18 +125,18 @@@
              return;
          }
  
-         // superclass
-         if(isNotIntrospected()) {
-             final Class<?> superclass = getCorrespondingClass().getSuperclass();
-             updateSuperclass(superclass);
+         final DomainServiceFacet facet = getFacet(DomainServiceFacet.class);
+         final boolean serviceWithNatureOfDomain = facet != null && facet.getNatureOfService() == NatureOfService.DOMAIN;
+         if (serviceWithNatureOfDomain) {
+             if (LOG.isDebugEnabled()) {
+                 LOG.debug("skipping type hierarchy introspection for domain service with natureOfService = DOMAIN {}", getFullIdentifier());
+             }
+             return;
          }
  
+         // superclass
 -        final Class<?> superclass = getCorrespondingClass().getSuperclass();
++            final Class<?> superclass = getCorrespondingClass().getSuperclass();
+         loadSpecOfSuperclass(superclass);
  
          // walk superinterfaces
  
@@@ -152,32 -164,28 +159,27 @@@
              }
          }
  
-         if(isNotIntrospected()) {
 -        updateAsSubclassTo(interfaceSpecList);
 -        updateInterfaces(interfaceSpecList);
 -
 -    }
 +            updateAsSubclassTo(interfaceSpecList);
-         }
-         if(isNotIntrospected()) {
 +            updateInterfaces(interfaceSpecList);
 +        }
  
-         updateAssociationsAndActions();
-     }
+     protected synchronized void introspectMembers() {
  
-     private synchronized void updateAssociationsAndActions() {
+         if(this.containsFacet(ValueFacet.class)) {
+             if (LOG.isDebugEnabled()) {
+                 LOG.debug("skipping full introspection for value type {}", getFullIdentifier());
+             }
+             return;
 -        }
++    }
  
          // associations and actions
-         if(isNotIntrospected()) {
 -        final List<ObjectAssociation> associations = createAssociations();
 -        sortAndUpdateAssociations(associations);
 +            final List<ObjectAssociation> associations = createAssociations();
 +            sortAndUpdateAssociations(associations);
-         }
  
-         if(isNotIntrospected()) {
 -        final List<ObjectAction> actions = createActions();
 -        sortCacheAndUpdateActions(actions);
 +            final List<ObjectAction> actions = createActions();
 +            sortCacheAndUpdateActions(actions);
-         }
  
-         if(isNotIntrospected()) {
-             updateFromFacetValues();
-         }
+         postProcess();
      }
  
      private void addNamedFacetAndPluralFacetIfRequired() {
diff --cc core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/standalonelist/ObjectSpecificationOnStandaloneList.java
index 45d0e72,c5b9053..64e39dc
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/standalonelist/ObjectSpecificationOnStandaloneList.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/standalonelist/ObjectSpecificationOnStandaloneList.java
@@@ -35,10 -38,9 +35,11 @@@ import org.apache.isis.core.metamodel.s
  import org.apache.isis.core.metamodel.spec.feature.ObjectAction;
  import org.apache.isis.core.metamodel.spec.feature.ObjectAssociation;
  import org.apache.isis.core.metamodel.specloader.facetprocessor.FacetProcessor;
+ import org.apache.isis.core.metamodel.specloader.postprocessor.PostProcessor;
  import org.apache.isis.core.metamodel.specloader.specimpl.ObjectSpecificationAbstract;
  
 +import static org.apache.isis.commons.internal.base._With.mapIfPresentElse;
 +
  /**
   * A custom {@link ObjectSpecification} that is designed to treat the
   * {@link FreeStandingList} class as a "standalone" collection.
@@@ -51,9 -53,15 +52,14 @@@ public class ObjectSpecificationOnStand
  
      // -- constructor
  
-     public ObjectSpecificationOnStandaloneList(final FacetProcessor facetProcessor) {
-         super(FreeStandingList.class, NAME, facetProcessor);
+     public ObjectSpecificationOnStandaloneList(
 -            final ServicesInjector servicesInjector,
+             final FacetProcessor facetProcessor,
+             final PostProcessor postProcessor) {
 -        super(FreeStandingList.class, NAME, servicesInjector, facetProcessor, postProcessor);
++        super(FreeStandingList.class, NAME, facetProcessor, postProcessor);
          this.specId = ObjectSpecId.of(getCorrespondingClass().getName());
+ 
+         FacetUtil.addFacet(
+                 new ObjectSpecIdFacetOnStandaloneList(specId, this));
      }
  
  
@@@ -61,11 -69,11 +67,11 @@@
      // -- Introspection
  
      @Override
-     public void introspectTypeHierarchyAndMembers() {
-         updateSuperclass(Object.class);
+     protected void introspectTypeHierarchy() {
+         loadSpecOfSuperclass(Object.class);
  
          addFacet(new CollectionFacetOnStandaloneList(this));
 -        addFacet(new TypeOfFacetDefaultToObject(this, getSpecificationLoader()) {
 +        addFacet(new TypeOfFacetDefaultToObject(this) {
          });
  
          // ObjectList specific
@@@ -76,6 -84,9 +82,10 @@@
          // don't install anything for NotPersistableFacet
      }
  
++    @Override
+     protected void introspectMembers() {
+         // no-op.
+     }
  
  
      // -- isXxx
diff --cc core/plugins/jdo-datanucleus-5/src/test/java/org/apache/isis/core/runtime/system/ObjectMemberAbstractTest.java
index 6455d48,2bc63d7..1fc2201
--- a/core/plugins/jdo-datanucleus-5/src/test/java/org/apache/isis/core/runtime/system/ObjectMemberAbstractTest.java
+++ b/core/plugins/jdo-datanucleus-5/src/test/java/org/apache/isis/core/runtime/system/ObjectMemberAbstractTest.java
@@@ -27,9 -27,9 +27,10 @@@ import org.junit.Rule
  import org.junit.Test;
  
  import org.apache.isis.applib.annotation.Where;
 +import org.apache.isis.applib.services.inject.ServiceInjector;
  import org.apache.isis.commons.internal.collections._Lists;
  import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
+ import org.apache.isis.core.metamodel.adapter.oid.Oid.Factory;
  import org.apache.isis.core.metamodel.consent.Consent;
  import org.apache.isis.core.metamodel.consent.InteractionInitiatedBy;
  import org.apache.isis.core.metamodel.facetapi.FeatureType;
@@@ -114,18 -111,27 +116,27 @@@ public class ObjectMemberAbstractTest 
              allowing(mockAuthenticationSessionProvider).getAuthenticationSession();
              will(returnValue(mockAuthenticationSession));
          }});
-         persistentAdapter = PojoAdapterBuilder.create()
-                                 .with(mockSpecificationLoader)
-                                 .withOid("CUS|1")
-                                 .withPojo(mockPersistable)
-                                 .build();
+ //        persistentAdapter = PojoAdapterBuilder.create()
+ //                .with(mockSpecificationLoader)
+ //                .withOid("CUS|1")
+ //                .withPojo(mockPersistable)
+ //                .build();
+ 
+         persistentAdapter = PojoAdapter.of(
+                 mockPersistable,
+                 Factory.persistentOf(ObjectSpecId.of("CUS"), "1"),
+                 mockAuthenticationSession,
+                 mockSpecificationLoader,
+                 null);
+ 
+ 
          transientAdapter = PojoAdapterBuilder.create()
-                                 .with(mockSpecificationLoader)
-                                 .with(Persistence.TRANSIENT)
-                                 .withPojo(mockPersistable)
-                                 .build();
+                 .with(mockSpecificationLoader)
+                 .with(Persistence.TRANSIENT)
+                 .withPojo(mockPersistable)
+                 .build();
  
 -        testMember = new ObjectMemberAbstractImpl("id", stubServicesInjector);
 +        testMember = new ObjectMemberAbstractImpl("id");
  
          context.checking(new Expectations() {{
              allowing(mockSpecificationLoader).lookupBySpecId(ObjectSpecId.of("CUS"));
diff --cc core/pom.xml
index 34e85be,c4b4d98..46c4ebf
--- a/core/pom.xml
+++ b/core/pom.xml
@@@ -182,9 -178,10 +182,12 @@@
  
          <htmlparser.version>2.1</htmlparser.version>
  
 -        <junit.version>5.3.1</junit.version>
 +        <junit.version>5.3.2</junit.version>
 +        <mockito.version>2.23.4</mockito.version>
++
+         <junit-legacy.version>4.12</junit-legacy.version>
+         <assertj.version>3.11.1</assertj.version>
 -
 +        
          <!-- 2.8.1 depends on cglib-nodep 3.1 whereas axonframework depends on 2.2.2 -->
          <jmock.version>2.6.0</jmock.version>
          <easymock.version>2.5.2</easymock.version>
diff --cc core/runtime/src/main/java/org/apache/isis/core/runtime/systemusinginstallers/IsisComponentProviderBuilder.java
index 0ec6151,8fd5681..5d5ac2b
--- a/core/runtime/src/main/java/org/apache/isis/core/runtime/systemusinginstallers/IsisComponentProviderBuilder.java
+++ b/core/runtime/src/main/java/org/apache/isis/core/runtime/systemusinginstallers/IsisComponentProviderBuilder.java
@@@ -1,5 -1,24 +1,23 @@@
+ /*
+  *  Licensed to the Apache Software Foundation (ASF) under one
+  *  or more contributor license agreements.  See the NOTICE file
+  *  distributed with this work for additional information
+  *  regarding copyright ownership.  The ASF licenses this file
+  *  to you under the Apache License, Version 2.0 (the
+  *  "License"); you may not use this file except in compliance
+  *  with the License.  You may obtain a copy of the License at
+  *
+  *        http://www.apache.org/licenses/LICENSE-2.0
+  *
+  *  Unless required by applicable law or agreed to in writing,
+  *  software distributed under the License is distributed on an
+  *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+  *  KIND, either express or implied.  See the License for the
+  *  specific language governing permissions and limitations
+  *  under the License.
+  */
  package org.apache.isis.core.runtime.systemusinginstallers;
  
 -import org.apache.isis.applib.AppManifest;
  import org.apache.isis.core.runtime.authorization.standard.AuthorizationManagerStandard;
  import org.apache.isis.core.security.authentication.manager.AuthenticationManager;
  import org.apache.isis.core.security.authentication.standard.AuthenticationManagerStandard;
diff --cc core/viewer-wicket-impl/src/main/java/org/apache/isis/viewer/wicket/viewer/IsisWicketModule.java
index d5b2ff5,81dc064..6efca02
--- a/core/viewer-wicket-impl/src/main/java/org/apache/isis/viewer/wicket/viewer/IsisWicketModule.java
+++ b/core/viewer-wicket-impl/src/main/java/org/apache/isis/viewer/wicket/viewer/IsisWicketModule.java
@@@ -59,39 -94,50 +59,54 @@@ public class IsisWicketModule 
  
          // these services need to be bound because they injected directly into
          // Wicket panels outside of the Isis runtime.
 -        bind(EmailService.class).to(EmailServiceWicket.class);
 -        bind(EmailNotificationService.class).to(EmailNotificationServiceWicket.class);
 -
 -        bind(String.class).annotatedWith(Names.named("applicationName"))
 -                .toProvider(string("isis.viewer.wicket.application.name", "Apache Isis ™"));
 -
 -        bind(String.class).annotatedWith(Names.named("brandLogoHeader"))
 -                .toProvider(string("isis.viewer.wicket.application.brandLogoHeader"));
 -
 -        bind(String.class).annotatedWith(Names.named("brandLogoSignin"))
 -                .toProvider(string("isis.viewer.wicket.application.brandLogoSignin"));
 -
 -        bind(String.class).annotatedWith(Names.named("applicationCss"))
 -                .toProvider(string("isis.viewer.wicket.application.css", "css/application.css"));
 -
 -        bind(String.class).annotatedWith(Names.named("applicationJs"))
 -                .toProvider(string("isis.viewer.wicket.application.js", "css/application.js"));
 -
 -        bind(String.class).annotatedWith(Names.named("aboutMessage"))
 -                .toProvider(stringOrElse("isis.viewer.wicket.application.about",
 -                        string("isis.viewer.wicket.application.name")));
 -
 -        final Provider<String> welcomeFile = string("isis.viewer.wicket.welcome.file", "welcome.html");
 -        bind(String.class).annotatedWith(Names.named("welcomeMessage"))
 -                .toProvider(() -> {
 -                    final String fallback = getConfiguration().getString("isis.viewer.wicket.welcome.text");
 -                    final URL resource;
 -                    try {
 -                        resource = servletContext.getResource(prefix(welcomeFile.get(), "/"));
 -                        if(resource!=null) {
 -                            return readLines(resource, fallback);    
 -                        }
 -                    } catch (MalformedURLException e) {
 -                        // fall through
 -                    }
 -                    return fallback;
 -                });
 -
 -        bind(String.class).annotatedWith(Names.named("applicationVersion"))
 -                .toProvider(string("isis.viewer.wicket.application.version"));
 -
 -        bind(InputStream.class).annotatedWith(Names.named("metaInfManifest"))
 -                .toProvider(() -> servletContext.getResourceAsStream("/META-INF/MANIFEST.MF"));
 -
 +//        bind(EmailService.class).to(EmailServiceWicket.class);
 +//        bind(EmailNotificationService.class).to(EmailNotificationServiceWicket.class);
 +
 +//        bind(String.class).annotatedWith(Names.named("applicationName"))
 +//                .toProvider(string("isis.viewer.wicket.application.name", "Apache Isis ™"));
 +//
 +//        bind(String.class).annotatedWith(Names.named("brandLogoHeader"))
 +//                .toProvider(string("isis.viewer.wicket.application.brandLogoHeader"));
 +//
 +//        bind(String.class).annotatedWith(Names.named("brandLogoSignin"))
 +//                .toProvider(string("isis.viewer.wicket.application.brandLogoSignin"));
 +//
 +//        bind(String.class).annotatedWith(Names.named("applicationCss"))
 +//                .toProvider(string("isis.viewer.wicket.application.css", "css/application.css"));
 +//
 +//        bind(String.class).annotatedWith(Names.named("applicationJs"))
 +//                .toProvider(string("isis.viewer.wicket.application.js", "css/application.js"));
 +//
 +//        bind(String.class).annotatedWith(Names.named("aboutMessage"))
 +//                .toProvider(stringOrElse("isis.viewer.wicket.application.about",
 +//                        string("isis.viewer.wicket.application.name")));
 +//
 +//        final Provider<String> welcomeFile = string("isis.viewer.wicket.welcome.file", "welcome.html");
 +//        bind(String.class).annotatedWith(Names.named("welcomeMessage"))
 +//                .toProvider(() -> readLines(getClass(), welcomeFile.get(),
 +//                        getConfiguration().getString("isis.viewer.wicket.welcome.text")));
 +//
 +//        bind(String.class).annotatedWith(Names.named("applicationVersion"))
 +//                .toProvider(string("isis.viewer.wicket.application.version"));
 +//
 +//        bind(InputStream.class).annotatedWith(Names.named("metaInfManifest"))
 +//                .toProvider(() -> servletContext.getResourceAsStream("/META-INF/MANIFEST.MF"));
- 
++//
++//        final Provider<String> welcomeFile = string("isis.viewer.wicket.welcome.file", "welcome.html");
++//        bind(String.class).annotatedWith(Names.named("welcomeMessage"))
++//                .toProvider(() -> {
++//                    final String fallback = getConfiguration().getString("isis.viewer.wicket.welcome.text");
++//                    final URL resource;
++//                    try {
++//                        resource = servletContext.getResource(prefix(welcomeFile.get(), "/"));
++//                        if(resource!=null) {
++//                            return readLines(resource, fallback);    
++//                        }
++//                    } catch (MalformedURLException e) {
++//                        // fall through
++//                    }
++//                    return fallback;
++//                });
      }
      
      // -- HELPER
diff --cc core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/pages/PageAbstract.java
index 082c049,eee3835..7b4ebf4
--- a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/pages/PageAbstract.java
+++ b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/pages/PageAbstract.java
@@@ -63,9 -63,9 +63,10 @@@ import org.slf4j.LoggerFactory
  
  import org.apache.isis.applib.services.exceprecog.ExceptionRecognizer;
  import org.apache.isis.applib.services.exceprecog.ExceptionRecognizerComposite;
 +import org.apache.isis.applib.services.inject.ServiceInjector;
  import org.apache.isis.config.IsisConfiguration;
 +import org.apache.isis.config.beans.WebAppConfigBean;
+ import org.apache.isis.config.property.ConfigPropertyEnum;
 -import org.apache.isis.core.metamodel.services.ServicesInjector;
  import org.apache.isis.core.runtime.system.context.IsisContext;
  import org.apache.isis.core.runtime.system.persistence.PersistenceSession;
  import org.apache.isis.core.runtime.system.session.IsisSessionFactory;
@@@ -107,7 -109,10 +110,10 @@@ public abstract class PageAbstract exte
      private static Logger LOG = LoggerFactory.getLogger(PageAbstract.class);
  
      private static final long serialVersionUID = 1L;
 -    
 +
+     public static final ConfigPropertyEnum<DialogMode> CONFIG_DIALOG_MODE =
+             new ConfigPropertyEnum<>("isis.viewer.wicket.dialogMode", DialogMode.SIDEBAR);
+ 
      /**
       * @see <a href="http://github.com/brandonaaron/livequery">livequery</a>
       */
@@@ -179,18 -196,19 +186,19 @@@
                              : new EmptyPanel("debugBar").setVisible(false);
                      add(debugBar);
  
 -            MarkupContainer header = createPageHeader("header");
 -            themeDiv.add(header);
 +                    MarkupContainer header = createPageHeader("header");
 +                    themeDiv.add(header);
  
 -            MarkupContainer footer = createPageFooter("footer");
 -            themeDiv.add(footer);
 +                    MarkupContainer footer = createPageFooter("footer");
 +                    themeDiv.add(footer);
  
 -            addActionPromptModalWindow(themeDiv);
 +                    addActionPromptModalWindow(themeDiv);
+             addActionPromptSidebar(themeDiv);
  
 -            this.childComponentIds = Collections.unmodifiableList(Arrays.asList(childComponentIds));
 +                    this.childComponentIds = Collections.unmodifiableList(Arrays.asList(childComponentIds));
  
 -            // ensure that all collected JavaScript contributions are loaded at the page footer
 -            add(new HeaderResponseContainer("footerJS", "footerJS"));
 +                    // ensure that all collected JavaScript contributions are loaded at the page footer
 +                    add(new HeaderResponseContainer("footerJS", "footerJS"));
  
          } catch(final RuntimeException ex) {
  
@@@ -450,8 -466,15 +460,15 @@@
  
      @Override
      public ActionPrompt getActionPrompt() {
+         final DialogMode dialogMode = CONFIG_DIALOG_MODE.from(getConfiguration());
+         switch (dialogMode) {
+             case SIDEBAR:
+                 return actionPromptSidebar;
+             case MODAL:
+             default:
 -                return actionPromptModalWindow;
 -        }
 +        return actionPromptModalWindow;
 +    }
+     }
  
      private void addActionPromptModalWindow(final MarkupContainer parent) {
          actionPromptModalWindow = ActionPromptModalWindow.newModalWindow(ID_ACTION_PROMPT_MODAL_WINDOW);