You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@isis.apache.org by da...@apache.org on 2020/01/10 15:22:34 UTC

[isis] 20/21: ISIS-2259: fixes up package name of isis-core-metamodel

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

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

commit 31b8b21f2e297439edf889faacfd685122a8751a
Author: danhaywood <da...@haywood-associates.co.uk>
AuthorDate: Fri Jan 10 15:10:11 2020 +0000

    ISIS-2259: fixes up package name of isis-core-metamodel
---
 .../core/config/presets/DebugMetaModel.properties  |    2 +-
 .../presets/DebugProgrammingModel.properties       |    4 +-
 .../config/presets/SilenceMetaModel.properties     |    2 +-
 .../presets/SilenceProgrammingModel.properties     |    4 +-
 .../commons/internal/reflection/ReflectTest.java   |   10 +-
 .../facets/object/mixin/MixinIntendedAs.java       |   26 +-
 .../object/mixin/MixinIntendedAsActionTest.java    |    1 -
 .../facets/param/name/ParameterNameFacetTest.java  |   14 +-
 core/metamodel/log4j2-test.xml                     |    2 +-
 .../isis/core/metamodel/IsisModuleMetamodel.java   |  101 ++
 .../isis/core/metamodel/adapter/ObjectAdapter.java |   61 ++
 .../metamodel/adapter/ObjectAdapterProvider.java   |   35 +
 .../adapter/oid/ObjectNotFoundException.java       |   36 +
 .../adapter/oid/ObjectPersistenceException.java    |   42 +
 .../isis/core/metamodel/adapter/oid/Oid.java       |  140 +++
 .../core/metamodel/adapter/oid/Oid_Marshaller.java |  254 +++++
 .../core/metamodel/adapter/oid/Oid_Parented.java   |  146 +++
 .../isis/core/metamodel/adapter/oid/Oid_Root.java  |  167 +++
 .../isis/core/metamodel/adapter/oid/Oid_Value.java |   87 ++
 .../core/metamodel/adapter/oid/ParentedOid.java    |   54 +
 .../adapter/oid/PojoRecreationException.java       |   29 +
 .../adapter/oid/PojoRefreshException.java          |   32 +
 .../isis/core/metamodel/adapter/oid/RootOid.java   |   46 +
 .../isis/core/metamodel/adapter/package-info.java  |   32 +
 .../authorization/standard/AuthorizationFacet.java |   32 +
 .../standard/AuthorizationFacetAbstract.java       |   78 ++
 .../standard/AuthorizationFacetFactory.java        |   46 +
 .../standard/AuthorizationFacetImpl.java           |   30 +
 .../authorization/standard/package-info.java       |   33 +
 .../core/metamodel/commons/ArrayExtensions.java    |   69 ++
 .../isis/core/metamodel/commons/CanBeVoid.java     |   25 +
 .../core/metamodel/commons/ClassExtensions.java    |  175 +++
 .../core/metamodel/commons/ClassFunctions.java     |   46 +
 .../core/metamodel/commons/ClassPredicates.java    |   37 +
 .../isis/core/metamodel/commons/ClassUtil.java     |  192 ++++
 .../metamodel/commons/CloseableExtensions.java     |   40 +
 .../core/metamodel/commons/DateExtensions.java     |   35 +
 .../metamodel/commons/InputStreamExtensions.java   |   69 ++
 .../core/metamodel/commons/ListExtensions.java     |  115 ++
 .../isis/core/metamodel/commons/LocaleUtil.java    |   40 +
 .../isis/core/metamodel/commons/MapUtil.java       |   48 +
 .../core/metamodel/commons/MethodExtensions.java   |   92 ++
 .../commons/MethodInvocationPreprocessor.java      |  154 +++
 .../isis/core/metamodel/commons/MethodUtil.java    |  202 ++++
 .../core/metamodel/commons/ObjectExtensions.java   |   82 ++
 .../isis/core/metamodel/commons/ResourceUtil.java  |   83 ++
 .../core/metamodel/commons/StringExtensions.java   |  393 +++++++
 .../metamodel/commons/ThrowableExtensions.java     |   82 ++
 .../isis/core/metamodel/commons/ToString.java      |  165 +++
 .../isis/core/metamodel/commons/Wormhole.java      |   50 +
 .../isis/core/metamodel/commons/package-info.java  |   27 +
 .../apache/isis/core/metamodel/consent/Allow.java  |   56 +
 .../isis/core/metamodel/consent/Consent.java       |   73 ++
 .../core/metamodel/consent/ConsentAbstract.java    |  159 +++
 .../core/metamodel/consent/InteractionAdvisor.java |  103 ++
 .../metamodel/consent/InteractionContextType.java  |  135 +++
 .../metamodel/consent/InteractionInitiatedBy.java  |   33 +
 .../core/metamodel/consent/InteractionResult.java  |  155 +++
 .../metamodel/consent/InteractionResultSet.java    |  104 ++
 .../apache/isis/core/metamodel/consent/Veto.java   |   48 +
 .../core/metamodel/context/MetaModelContext.java   |  212 ++++
 .../metamodel/context/MetaModelContextAware.java   |   29 +
 .../context/MetaModelContext_usingIoc.java         |  172 +++
 .../core/metamodel/context/MetaModelContexts.java  |   44 +
 .../metamodel/exceptions/MetaModelException.java   |   43 +
 .../persistence/ObjectNotFoundException.java       |   38 +
 .../persistence/ObjectPersistenceException.java    |   42 +
 .../persistence/PojoRecreationException.java       |   31 +
 .../persistence/PojoRefreshException.java          |   34 +
 .../apache/isis/core/metamodel/facetapi/Facet.java |  123 +++
 .../core/metamodel/facetapi/FacetAbstract.java     |  287 +++++
 .../isis/core/metamodel/facetapi/FacetHolder.java  |  150 +++
 .../core/metamodel/facetapi/FacetHolderImpl.java   |  168 +++
 .../isis/core/metamodel/facetapi/FacetUtil.java    |   96 ++
 .../metamodel/facetapi/FacetWithAttributes.java    |   32 +
 .../isis/core/metamodel/facetapi/FeatureType.java  |  159 +++
 .../core/metamodel/facetapi/IdentifiedHolder.java  |   31 +
 .../core/metamodel/facetapi/MetaModelRefiner.java  |   34 +
 .../core/metamodel/facetapi/MethodRemover.java     |   71 ++
 .../isis/core/metamodel/facets/Annotations.java    |  695 ++++++++++++
 .../core/metamodel/facets/CollectionUtils.java     |  129 +++
 .../facets/ContributeeMemberFacetFactory.java      |   45 +
 .../core/metamodel/facets/DependentArgUtils.java   |  198 ++++
 .../core/metamodel/facets/DomainEventHelper.java   |  441 ++++++++
 .../isis/core/metamodel/facets/FacetFactory.java   |  337 ++++++
 .../metamodel/facets/FacetFactoryAbstract.java     |   70 ++
 .../isis/core/metamodel/facets/FacetedMethod.java  |  216 ++++
 .../metamodel/facets/FacetedMethodParameter.java   |   50 +
 .../core/metamodel/facets/ImperativeFacet.java     |  169 +++
 .../metamodel/facets/ImperativeFacetMulti.java     |   33 +
 .../facets/MethodFilteringFacetFactory.java        |   33 +
 .../core/metamodel/facets/MethodFinderUtils.java   |  239 +++++
 .../metamodel/facets/MethodLiteralConstants.java   |   77 ++
 .../facets/MethodPrefixBasedFacetFactory.java      |   39 +
 .../MethodPrefixBasedFacetFactoryAbstract.java     |  138 +++
 .../metamodel/facets/MethodRemoverConstants.java   |   44 +
 .../core/metamodel/facets/MultipleValueFacet.java  |   26 +
 .../metamodel/facets/ObjectSpecIdFacetFactory.java |   37 +
 .../facets/OrphanedSupportingMethodValidator.java  |  126 +++
 .../metamodel/facets/PostConstructMethodCache.java |   30 +
 ...ropertyOrCollectionIdentifyingFacetFactory.java |   83 ++
 ...rCollectionIdentifyingFacetFactoryAbstract.java |   43 +
 .../metamodel/facets/SingleClassValueFacet.java    |   35 +
 .../facets/SingleClassValueFacetAbstract.java      |   60 ++
 .../core/metamodel/facets/SingleIntValueFacet.java |   27 +
 .../facets/SingleIntValueFacetAbstract.java        |   47 +
 .../metamodel/facets/SingleStringValueFacet.java   |   23 +
 .../facets/SingleStringValueFacetAbstract.java     |   58 +
 .../core/metamodel/facets/SingleValueFacet.java    |   28 +
 .../metamodel/facets/SingleValueFacetAbstract.java |   46 +
 .../isis/core/metamodel/facets/TypedHolder.java    |   55 +
 .../core/metamodel/facets/TypedHolderDefault.java  |   58 +
 .../core/metamodel/facets/WhereValueFacet.java     |   29 +
 .../metamodel/facets/WhereValueFacetAbstract.java  |   57 +
 ...lementSpecificationProviderFromTypeOfFacet.java |   37 +
 .../facets/actcoll/typeof/TypeOfFacet.java         |  126 +++
 .../facets/actcoll/typeof/TypeOfFacetAbstract.java |   40 +
 .../actcoll/typeof/TypeOfFacetDefaultToObject.java |   30 +
 .../typeof/TypeOfFacetInferredFromArray.java       |   30 +
 .../typeof/TypeOfFacetInferredFromGenerics.java    |   30 +
 .../action/ActionAnnotationFacetFactory.java       |  287 +++++
 ...nChoicesForCollectionParameterFacetFactory.java |  161 +++
 .../action/associateWith/AssociatedWithFacet.java  |   30 +
 .../associateWith/AssociatedWithFacetAbstract.java |   45 +
 .../AssociatedWithFacetForActionAnnotation.java    |   32 +
 .../command/CommandFacetForActionAnnotation.java   |  123 +++
 ...ommandFacetForActionAnnotationAsConfigured.java |   39 +
 .../command/CommandFacetFromConfiguration.java     |   46 +
 .../hidden/HiddenFacetForActionAnnotation.java     |   56 +
 .../action/invocation/ActionDomainEventFacet.java  |   33 +
 .../invocation/ActionDomainEventFacetAbstract.java |  165 +++
 .../invocation/ActionDomainEventFacetDefault.java  |   33 +
 .../ActionDomainEventFacetForActionAnnotation.java |   32 +
 .../action/invocation/ActionInvocationFacet.java   |   51 +
 .../invocation/ActionInvocationFacetAbstract.java  |   38 +
 ...ctionInvocationFacetForDomainEventAbstract.java |  513 +++++++++
 ...ionFacetForDomainEventFromActionAnnotation.java |   40 +
 ...onInvocationFacetForDomainEventFromDefault.java |   40 +
 .../actions/action/invocation/CommandUtil.java     |  113 ++
 .../PrototypeFacetForActionAnnotation.java         |   51 +
 .../PublishedActionFacetForActionAnnotation.java   |   99 ++
 ...ActionFacetForActionAnnotationAsConfigured.java |   31 +
 .../PublishedActionFacetFromConfiguration.java     |   32 +
 ...ctionSemanticsFacetFallbackToNonIdempotent.java |   32 +
 .../ActionSemanticsFacetForActionAnnotation.java   |   49 +
 .../typeof/TypeOfFacetForActionAnnotation.java     |   33 +
 .../facets/actions/command/CommandFacet.java       |   55 +
 .../actions/command/CommandFacetAbstract.java      |  123 +++
 .../actions/defaults/ActionDefaultsFacet.java      |   35 +
 .../defaults/ActionDefaultsFacetAbstract.java      |   36 +
 .../method/ActionDefaultsFacetViaMethod.java       |   88 ++
 .../ActionDefaultsFacetViaMethodFactory.java       |   88 ++
 .../FileAcceptFacetForActionAnnotation.java        |   47 +
 .../facets/actions/homepage/HomePageFacet.java     |   34 +
 .../actions/homepage/HomePageFacetAbstract.java    |   36 +
 .../facets/actions/homepage/HomePageFacetImpl.java |   30 +
 .../annotation/HomePageFacetAnnotation.java        |   31 +
 .../annotation/HomePageFacetAnnotationFactory.java |  130 +++
 .../actions/layout/ActionLayoutFacetFactory.java   |  171 +++
 ...tionPositionFacetForActionLayoutAnnotation.java |   46 +
 .../layout/ActionPositionFacetForActionXml.java    |   41 +
 ...okmarkPolicyFacetForActionLayoutAnnotation.java |   58 +
 .../layout/BookmarkPolicyFacetForActionXml.java    |   42 +
 .../CssClassFaFacetForActionLayoutAnnotation.java  |   57 +
 .../layout/CssClassFaFacetForActionXml.java        |   44 +
 .../CssClassFacetForActionLayoutAnnotation.java    |   47 +
 .../actions/layout/CssClassFacetForActionXml.java  |   42 +
 .../DescribedAsFacetForActionLayoutAnnotation.java |   47 +
 .../layout/DescribedAsFacetForActionXml.java       |   42 +
 .../HiddenFacetForActionLayoutAnnotation.java      |   56 +
 .../actions/layout/HiddenFacetForActionXml.java    |   51 +
 .../NamedFacetForActionLayoutAnnotation.java       |   48 +
 .../actions/layout/NamedFacetForActionXml.java     |   44 +
 ...tContributedFacetForActionLayoutAnnotation.java |   52 +
 .../PromptStyleFacetForActionLayoutAnnotation.java |   97 ++
 .../layout/PromptStyleFacetForActionXml.java       |   57 +
 .../RedirectFacetFromActionLayoutAnnotation.java   |   47 +
 .../actions/layout/RedirectFacetFromActionXml.java |   43 +
 .../notcontributed/NotContributedFacet.java        |   40 +
 .../NotContributedFacetAbstract.java               |   73 ++
 ...tributedFacetDerivedFromDomainServiceFacet.java |   47 +
 ...dFacetDerivedFromDomainServiceFacetFactory.java |   58 +
 .../NotContributedFacetDerivedFromMixinFacet.java  |   37 +
 ...ntributedFacetDerivedFromMixinFacetFactory.java |   52 +
 .../notinservicemenu/NotInServiceMenuFacet.java    |   38 +
 .../NotInServiceMenuFacetAbstract.java             |   40 +
 ...viceMenuFacetDerivedFromDomainServiceFacet.java |   54 +
 ...uFacetDerivedFromDomainServiceFacetFactory.java |   59 ++
 .../actions/position/ActionPositionFacet.java      |   44 +
 .../position/ActionPositionFacetAbstract.java      |   57 +
 .../position/ActionPositionFacetFallback.java      |   31 +
 .../facets/actions/prototype/PrototypeFacet.java   |   30 +
 .../actions/prototype/PrototypeFacetAbstract.java  |   56 +
 .../actions/publish/PublishedActionFacet.java      |   30 +
 .../publish/PublishedActionFacetAbstract.java      |   38 +
 .../facets/actions/redirect/RedirectFacet.java     |   33 +
 .../actions/redirect/RedirectFacetAbstract.java    |   66 ++
 .../actions/redirect/RedirectFacetFallback.java    |   31 +
 .../actions/semantics/ActionSemanticsFacet.java    |   33 +
 .../semantics/ActionSemanticsFacetAbstract.java    |   39 +
 .../validate/ActionParameterValidationFacet.java   |   46 +
 .../ActionParameterValidationFacetAbstract.java    |   47 +
 .../actions/validate/ActionValidationFacet.java    |   49 +
 .../validate/ActionValidationFacetAbstract.java    |   47 +
 .../ActionParameterValidationFacetViaMethod.java   |   84 ++
 .../method/ActionValidationFacetViaMethod.java     |   84 ++
 .../ActionValidationFacetViaMethodFactory.java     |  117 ++
 .../facets/all/deficiencies/DeficiencyFacet.java   |  134 +++
 .../facets/all/describedas/DescribedAsFacet.java   |   33 +
 .../all/describedas/DescribedAsFacetAbstract.java  |   36 +
 .../core/metamodel/facets/all/help/HelpFacet.java  |   29 +
 .../facets/all/help/HelpFacetAbstract.java         |   36 +
 .../metamodel/facets/all/hide/HiddenFacet.java     |   31 +
 .../all/i18n/DescribedAsFacetTranslated.java       |   64 ++
 .../facets/all/i18n/NamedFacetTranslated.java      |   72 ++
 .../facets/all/i18n/PluralFacetTranslated.java     |   55 +
 .../facets/all/i18n/TranslationFacetFactory.java   |  119 +++
 .../metamodel/facets/all/named/NamedFacet.java     |   42 +
 .../facets/all/named/NamedFacetAbstract.java       |   59 ++
 .../facets/all/named/NamedFacetInferred.java       |   31 +
 .../collections/CollectionFacetAbstract.java       |   40 +
 .../CollectionAccessorFacetViaAccessor.java        |  109 ++
 .../CollectionAccessorFacetViaAccessorFactory.java |  112 ++
 .../clear/CollectionClearFacetFactory.java         |   70 ++
 .../clear/CollectionClearFacetViaAccessor.java     |   79 ++
 .../clear/CollectionClearFacetViaClearMethod.java  |   70 ++
 .../CollectionAnnotationFacetFactory.java          |  293 +++++
 .../collection/defaultview/DefaultViewFacet.java   |   26 +
 .../defaultview/DefaultViewFacetAbstract.java      |   35 +
 .../DisabledFacetForCollectionAnnotation.java      |   69 ++
 .../hidden/HiddenFacetForCollectionAnnotation.java |   56 +
 ...ectionAddToFacetForDomainEventFromAbstract.java |  124 +++
 ...acetForDomainEventFromCollectionAnnotation.java |   43 +
 ...lectionAddToFacetForDomainEventFromDefault.java |   41 +
 .../modify/CollectionDomainEventFacet.java         |   34 +
 .../modify/CollectionDomainEventFacetAbstract.java |  145 +++
 .../modify/CollectionDomainEventFacetDefault.java  |   32 +
 ...ionDomainEventFacetForCollectionAnnotation.java |   45 +
 ...nRemoveFromFacetForDomainEventFromAbstract.java |  123 +++
 ...acetForDomainEventFromCollectionAnnotation.java |   43 +
 ...onRemoveFromFacetForDomainEventFromDefault.java |   41 +
 .../NotPersistedFacetForCollectionAnnotation.java  |   55 +
 ...fFacetOnCollectionFromCollectionAnnotation.java |   47 +
 ...abledFacetOnCollectionDerivedFromImmutable.java |   39 +
 ...cetOnCollectionDerivedFromImmutableFactory.java |   45 +
 .../javautilcollection/CollectionFacetFactory.java |   86 ++
 .../javautilcollection/JavaArrayFacet.java         |   84 ++
 .../javautilcollection/JavaCollectionFacet.java    |   78 ++
 .../layout/CollectionLayoutFacetFactory.java       |  123 +++
 ...CssClassFacetForCollectionLayoutAnnotation.java |   45 +
 .../layout/CssClassFacetForCollectionXml.java      |   42 +
 ...aultViewFacetForCollectionLayoutAnnotation.java |   48 +
 .../layout/DefaultViewFacetForCollectionXml.java   |   42 +
 ...cribedAsFacetForCollectionLayoutAnnotation.java |   45 +
 .../layout/DescribedAsFacetForCollectionXml.java   |   42 +
 .../HiddenFacetForCollectionLayoutAnnotation.java  |   58 +
 .../layout/HiddenFacetForCollectionXml.java        |   51 +
 .../NamedFacetForCollectionLayoutAnnotation.java   |   52 +
 .../layout/NamedFacetForCollectionXml.java         |   47 +
 .../PagedFacetForCollectionLayoutAnnotation.java   |   46 +
 .../layout/PagedFacetForCollectionXml.java         |   41 +
 ...SortedByFacetForCollectionLayoutAnnotation.java |   53 +
 .../layout/SortedByFacetForCollectionXml.java      |   56 +
 .../collections/modify/CollectionAddToFacet.java   |   37 +
 .../modify/CollectionAddToFacetAbstract.java       |   36 +
 .../modify/CollectionAddToFacetViaAccessor.java    |   77 ++
 .../modify/CollectionAddToFacetViaMethod.java      |   74 ++
 ...tionAddToRemoveFromAndValidateFacetFactory.java |  177 ++++
 .../collections/modify/CollectionClearFacet.java   |   36 +
 .../modify/CollectionClearFacetAbstract.java       |   36 +
 .../facets/collections/modify/CollectionFacet.java |  112 ++
 .../modify/CollectionRemoveFromFacet.java          |   39 +
 .../modify/CollectionRemoveFromFacetAbstract.java  |   36 +
 .../CollectionRemoveFromFacetViaAccessor.java      |   80 ++
 .../modify/CollectionRemoveFromFacetViaMethod.java |   74 ++
 .../TypeOfFacetInferredFromSupportingMethods.java  |   31 +
 .../parented/ParentedCollectionFacetDefault.java   |   37 +
 .../ParentedFacetSinceCollectionFactory.java       |   53 +
 .../facets/collections/sortedby/SortedByFacet.java |   32 +
 .../sortedby/SortedByFacetAbstract.java            |   38 +
 .../annotation/SortedByFacetAnnotationFactory.java |   90 ++
 .../validate/CollectionValidateAddToFacet.java     |   40 +
 .../CollectionValidateAddToFacetAbstract.java      |   48 +
 .../CollectionValidateAddToFacetViaMethod.java     |   82 ++
 .../CollectionValidateRemoveFromFacet.java         |   39 +
 .../CollectionValidateRemoveFromFacetAbstract.java |   47 +
 ...CollectionValidateRemoveFromFacetViaMethod.java |   83 ++
 .../collparam/semantics/CollectionSemantics.java   |  125 +++
 .../semantics/CollectionSemanticsFacet.java        |   29 +
 .../semantics/CollectionSemanticsFacetDefault.java |   47 +
 .../facets/fallback/ActionChoicesFacetNone.java    |   45 +
 .../facets/fallback/ActionDefaultsFacetNone.java   |   42 +
 .../facets/fallback/DescribedAsFacetNone.java      |   39 +
 .../facets/fallback/FallbackFacetFactory.java      |  144 +++
 .../metamodel/facets/fallback/HelpFacetNone.java   |   44 +
 .../LabelAtFacetFromLayoutConfiguration.java       |   30 +
 .../facets/fallback/MaxLengthFacetUnlimited.java   |   46 +
 .../facets/fallback/MultiLineFacetNone.java        |   36 +
 .../facets/fallback/NamedFacetDefault.java         |   33 +
 .../metamodel/facets/fallback/NamedFacetNone.java  |   44 +
 .../fallback/PagedFacetFromConfiguration.java      |   29 +
 .../metamodel/facets/fallback/TitleFacetNone.java  |   42 +
 .../metamodel/facets/jaxb/JaxbFacetFactory.java    |  399 +++++++
 .../facets/jaxb/XmlAccessorTypeFacet.java          |   31 +
 .../facets/jaxb/XmlAccessorTypeFacetAbstract.java  |   40 +
 .../facets/jaxb/XmlAccessorTypeFacetDefault.java   |   33 +
 .../facets/jaxb/XmlJavaTypeAdapterFacet.java       |   29 +
 .../jaxb/XmlJavaTypeAdapterFacetAbstract.java      |   38 +
 .../jaxb/XmlJavaTypeAdapterFacetDefault.java       |   31 +
 .../metamodel/facets/jaxb/XmlTransientFacet.java   |   29 +
 .../facets/jaxb/XmlTransientFacetAbstract.java     |   37 +
 .../facets/jaxb/XmlTransientFacetDefault.java      |   30 +
 .../facets/members/cssclass/CssClassFacet.java     |   38 +
 .../members/cssclass/CssClassFacetAbstract.java    |   51 +
 .../members/cssclass/CssClassFacetAbstract2.java   |   36 +
 .../CssClassFacetOnActionFromConfiguredRegex.java  |   30 +
 ...assFacetOnActionFromConfiguredRegexFactory.java |  120 +++
 .../facets/members/cssclassfa/CssClassFaFacet.java |   37 +
 .../cssclassfa/CssClassFaFacetAbstract.java        |   79 ++
 .../members/cssclassfa/CssClassFaPosition.java     |  104 ++
 .../annotprop/CssClassFaFacetOnMemberFactory.java  |  103 ++
 ...CssClassFaFacetOnMemberFromConfiguredRegex.java |   31 +
 .../CssClassFaFacetOnMemberFromProperties.java     |   40 +
 .../cssclassfa/annotprop/MixinInterceptor.java     |   64 ++
 .../DescribedAsFacetOnMemberDerivedFromType.java   |   32 +
 .../annotprop/DescribedAsFacetOnMemberFactory.java |   64 ++
 .../DescribedAsFacetOnMemberFromProperties.java    |   37 +
 .../facets/members/disabled/DisabledFacet.java     |   54 +
 .../members/disabled/DisabledFacetAbstract.java    |  102 ++
 .../DisabledFacetAbstractAlwaysEverywhere.java     |   40 +
 .../disabled/DisabledFacetAbstractImpl.java        |   83 ++
 .../disabled/DisabledFacetForContributee.java      |   30 +
 .../disabled/method/DisableForContextFacet.java    |   37 +
 .../method/DisableForContextFacetAbstract.java     |   37 +
 .../method/DisableForContextFacetNone.java         |   49 +
 .../method/DisableForContextFacetViaMethod.java    |  100 ++
 .../DisableForContextFacetViaMethodFactory.java    |   94 ++
 .../facets/members/hidden/HiddenFacetAbstract.java |   86 ++
 .../HiddenFacetAbstractAlwaysEverywhere.java       |   50 +
 .../members/hidden/HiddenFacetAbstractImpl.java    |   52 +
 .../HiddenFacetFromLayoutPropertiesAbstract.java   |   53 +
 .../members/hidden/method/HideForContextFacet.java |   37 +
 .../hidden/method/HideForContextFacetAbstract.java |   37 +
 .../hidden/method/HideForContextFacetNone.java     |   45 +
 .../method/HideForContextFacetViaMethod.java       |   78 ++
 .../HideForContextFacetViaMethodFactory.java       |   82 ++
 .../facets/members/order/MemberOrderFacet.java     |   59 ++
 .../members/order/MemberOrderFacetAbstract.java    |  107 ++
 .../annotprop/MemberOrderFacetAnnotation.java      |   35 +
 .../order/annotprop/MemberOrderFacetFactory.java   |   69 ++
 .../MemberOrderFacetForActionAnnotation.java       |   34 +
 .../annotprop/MemberOrderFacetProperties.java      |   49 +
 .../order/annotprop/MemberOrderFacetXml.java       |   35 +
 .../ViewModelSemanticCheckingFacetFactory.java     |  209 ++++
 .../facets/object/audit/AuditableFacet.java        |   40 +
 .../object/audit/AuditableFacetAbstract.java       |   61 ++
 .../facets/object/audit/AuditableFacetImpl.java    |   30 +
 .../object/autocomplete/AutoCompleteFacet.java     |   35 +
 .../autocomplete/AutoCompleteFacetAbstract.java    |  126 +++
 .../object/bookmarkpolicy/BookmarkPolicyFacet.java |   31 +
 .../BookmarkPolicyFacetAbstract.java               |   59 ++
 .../BookmarkPolicyFacetFallback.java               |   32 +
 .../BookmarkPolicyFacetFallbackFactory.java        |   88 ++
 .../facets/object/callbacks/CallbackFacet.java     |   53 +
 .../object/callbacks/CallbackFacetAbstract.java    |   35 +
 .../object/callbacks/CreatedCallbackFacet.java     |   36 +
 .../callbacks/CreatedCallbackFacetAbstract.java    |   35 +
 .../callbacks/CreatedCallbackFacetFactory.java     |   51 +
 .../callbacks/CreatedCallbackFacetViaMethod.java   |   70 ++
 .../callbacks/CreatedLifecycleEventFacet.java      |   30 +
 ...fecycleEventFacetForDomainObjectAnnotation.java |   46 +
 .../object/callbacks/LifecycleEventFacet.java      |   28 +
 .../object/callbacks/LoadCallbackFacetFactory.java |   63 ++
 .../object/callbacks/LoadedCallbackFacet.java      |   37 +
 .../callbacks/LoadedCallbackFacetAbstract.java     |   35 +
 .../callbacks/LoadedCallbackFacetViaMethod.java    |   71 ++
 .../callbacks/LoadedLifecycleEventFacet.java       |   30 +
 ...fecycleEventFacetForDomainObjectAnnotation.java |   44 +
 .../object/callbacks/LoadingCallbackFacet.java     |   28 +
 .../callbacks/LoadingCallbackFacetAbstract.java    |   39 +
 .../callbacks/LoadingCallbackFacetViaMethod.java   |   75 ++
 .../callbacks/PersistCallbackFacetFactory.java     |   78 ++
 .../PersistCallbackViaSaveMethodFacetFactory.java  |   78 ++
 .../object/callbacks/PersistedCallbackFacet.java   |   36 +
 .../callbacks/PersistedCallbackFacetAbstract.java  |   35 +
 .../callbacks/PersistedCallbackFacetViaMethod.java |   71 ++
 .../callbacks/PersistedLifecycleEventFacet.java    |   30 +
 ...fecycleEventFacetForDomainObjectAnnotation.java |   44 +
 .../object/callbacks/PersistingCallbackFacet.java  |   37 +
 .../callbacks/PersistingCallbackFacetAbstract.java |   35 +
 .../PersistingCallbackFacetViaMethod.java          |   71 ++
 .../callbacks/PersistingLifecycleEventFacet.java   |   30 +
 ...fecycleEventFacetForDomainObjectAnnotation.java |   45 +
 .../callbacks/RemoveCallbackFacetFactory.java      |   79 ++
 .../RemoveCallbackViaDeleteMethodFacetFactory.java |   79 ++
 .../object/callbacks/RemovedCallbackFacet.java     |   35 +
 .../callbacks/RemovedCallbackFacetAbstract.java    |   39 +
 .../callbacks/RemovedCallbackFacetViaMethod.java   |   75 ++
 .../object/callbacks/RemovingCallbackFacet.java    |   34 +
 .../callbacks/RemovingCallbackFacetAbstract.java   |   35 +
 .../callbacks/RemovingCallbackFacetViaMethod.java  |   71 ++
 .../callbacks/RemovingLifecycleEventFacet.java     |   30 +
 ...fecycleEventFacetForDomainObjectAnnotation.java |   45 +
 .../callbacks/UpdateCallbackFacetFactory.java      |   68 ++
 .../object/callbacks/UpdatedCallbackFacet.java     |   37 +
 .../callbacks/UpdatedCallbackFacetAbstract.java    |   35 +
 .../callbacks/UpdatedCallbackFacetViaMethod.java   |   71 ++
 .../callbacks/UpdatedLifecycleEventFacet.java      |   30 +
 ...fecycleEventFacetForDomainObjectAnnotation.java |   45 +
 .../object/callbacks/UpdatingCallbackFacet.java    |   37 +
 .../callbacks/UpdatingCallbackFacetAbstract.java   |   35 +
 .../callbacks/UpdatingCallbackFacetViaMethod.java  |   71 ++
 .../callbacks/UpdatingLifecycleEventFacet.java     |   30 +
 ...fecycleEventFacetForDomainObjectAnnotation.java |   45 +
 .../choices/ChoicesFacetFromBoundedAbstract.java   |  119 +++
 .../facets/object/choices/ChoicesFacetUtils.java   |   42 +
 .../facets/object/choices/QueryFindAllChoices.java |   57 +
 .../object/choices/enums/ChoicesFacetEnum.java     |   49 +
 .../facets/object/choices/enums/EnumFacet.java     |   26 +
 ...ingValueFacetUsingSemanticsProviderFactory.java |   49 +
 .../choices/enums/EnumValueSemanticsProvider.java  |  152 +++
 .../cssclass/method/CssClassFacetMethod.java       |   61 ++
 .../method/CssClassFacetMethodFactory.java         |   52 +
 ...ssClassFaFacetForDomainObjectLayoutFactory.java |   43 +
 .../CssClassFaFacetForViewModelLayoutFactory.java  |   45 +
 .../facets/object/defaults/DefaultedFacet.java     |   47 +
 .../object/defaults/DefaultedFacetAbstract.java    |   84 ++
 .../DefaultedFacetUsingDefaultsProvider.java       |   47 +
 .../object/defaults/DefaultsProviderUtil.java      |   75 ++
 .../annotcfg/DefaultedFacetAnnotation.java         |   62 ++
 ...tedFacetAnnotationElseConfigurationFactory.java |   71 ++
 .../annotcfg/DefaultedFacetFromConfiguration.java  |   31 +
 .../object/disabled/DisabledObjectFacet.java       |   54 +
 .../disabled/DisabledObjectFacetAbstract.java      |   52 +
 .../method/DisabledObjectFacetViaMethod.java       |   93 ++
 .../DisabledObjectFacetViaMethodFactory.java       |   88 ++
 .../DomainObjectAnnotationFacetFactory.java        |  570 ++++++++++
 .../AuditableFacetForDomainObjectAnnotation.java   |   74 ++
 ...FacetForDomainObjectAnnotationAsConfigured.java |   31 +
 .../auditing/AuditableFacetFromConfiguration.java  |   36 +
 ...AutoCompleteFacetForDomainObjectAnnotation.java |   46 +
 .../ChoicesFacetForDomainObjectAnnotation.java     |   49 +
 ...EventDefaultFacetForDomainObjectAnnotation.java |   52 +
 ...EventDefaultFacetForDomainObjectAnnotation.java |   51 +
 ...EventDefaultFacetForDomainObjectAnnotation.java |   51 +
 .../ImmutableFacetForDomainObjectAnnotation.java   |  101 ++
 ...FacetForDomainObjectAnnotationAsConfigured.java |   30 +
 .../editing/ImmutableFacetFromConfiguration.java   |   58 +
 ...ObjectSpecIdFacetForDomainObjectAnnotation.java |   47 +
 ...lishedObjectFacetForDomainObjectAnnotation.java |   67 ++
 ...FacetForDomainObjectAnnotationAsConfigured.java |   30 +
 .../PublishedObjectFacetFromConfiguration.java     |   31 +
 ...atableObjectFacetForDomainObjectAnnotation.java |   73 ++
 ...PolicyFacetForDomainObjectLayoutAnnotation.java |   46 +
 .../BookmarkPolicyFacetForDomainObjectXml.java     |   42 +
 ...arkPolicyFacetForViewModelLayoutAnnotation.java |   47 +
 ...lassFaFacetForDomainObjectLayoutAnnotation.java |   55 +
 .../CssClassFaFacetForDomainObjectXml.java         |   44 +
 ...ssClassFaFacetForViewModelLayoutAnnotation.java |   54 +
 ...sClassFacetForDomainObjectLayoutAnnotation.java |   57 +
 .../CssClassFacetForDomainObjectXml.java           |   42 +
 .../CssClassFacetForViewModelLayoutAnnotation.java |   45 +
 ...ObjectLayoutAnnotationUsingCssClassUiEvent.java |  121 +++
 ...wModelLayoutAnnotationUsingCssClassUiEvent.java |  118 +++
 ...ibedAsFacetForDomainObjectLayoutAnnotation.java |   46 +
 .../DescribedAsFacetForDomainObjectXml.java        |   42 +
 ...scribedAsFacetForViewModelLayoutAnnotation.java |   47 +
 .../DomainObjectLayoutFacetFactory.java            |  113 ++
 ...mainObjectLayoutAnnotationUsingIconUiEvent.java |  117 ++
 ...aViewModelLayoutAnnotationUsingIconUiEvent.java |  118 +++
 ...inObjectLayoutAnnotationUsingLayoutUiEvent.java |  118 +++
 ...iewModelLayoutAnnotationUsingLayoutUiEvent.java |  117 ++
 .../NamedFacetForDomainObjectLayoutAnnotation.java |   47 +
 .../NamedFacetForDomainObjectXml.java              |   44 +
 .../NamedFacetForViewModelLayoutAnnotation.java    |   45 +
 .../PagedFacetForDomainObjectLayoutAnnotation.java |   46 +
 .../PagedFacetForViewModelLayoutAnnotation.java    |   46 +
 ...PluralFacetForDomainObjectLayoutAnnotation.java |   47 +
 .../PluralFacetForDomainObjectXml.java             |   40 +
 .../PluralFacetForViewModelLayoutAnnotation.java   |   47 +
 ...ainObjectLayoutAnnotationUsingTitleUiEvent.java |  135 +++
 ...ViewModelLayoutAnnotationUsingTitleUiEvent.java |  135 +++
 .../object/domainservice/DomainServiceFacet.java   |   54 +
 .../domainservice/DomainServiceFacetAbstract.java  |   65 ++
 .../annotation/DomainServiceFacetAnnotation.java   |   35 +
 .../DomainServiceFacetAnnotationFactory.java       |  153 +++
 ...conFacetDerivedFromDomainServiceAnnotation.java |   47 +
 .../DomainServiceLayoutFacet.java                  |   36 +
 .../DomainServiceLayoutFacetAbstract.java          |   54 +
 .../DomainServiceLayoutFacetFactory.java           |   70 ++
 ...NamedFacetForDomainServiceLayoutAnnotation.java |   36 +
 .../DomainServiceLayoutFacetAnnotation.java        |   34 +
 .../facets/object/encodeable/EncodableFacet.java   |   42 +
 .../object/encodeable/EncodableFacetAbstract.java  |   85 ++
 .../object/encodeable/EncoderDecoderUtil.java      |   36 +
 .../annotcfg/EncodableFacetFromConfiguration.java  |   33 +
 .../encoder/EncodableFacetUsingEncoderDecoder.java |   75 ++
 .../facets/object/entity/EntityFacet.java          |   54 +
 .../facets/object/facets/FacetsFacet.java          |   48 +
 .../facets/object/facets/FacetsFacetAbstract.java  |   94 ++
 .../facets/annotation/FacetsFacetAnnotation.java   |   32 +
 .../annotation/FacetsFacetAnnotationFactory.java   |   54 +
 .../metamodel/facets/object/grid/GridFacet.java    |   41 +
 .../facets/object/grid/GridFacetDefault.java       |   84 ++
 .../facets/object/grid/GridFacetFactory.java       |   46 +
 .../facets/object/hidden/HiddenObjectFacet.java    |   56 +
 .../object/hidden/HiddenObjectFacetAbstract.java   |   50 +
 .../hidden/method/HiddenObjectFacetViaMethod.java  |   65 ++
 .../method/HiddenObjectFacetViaMethodFactory.java  |   91 ++
 .../metamodel/facets/object/icon/IconFacet.java    |   44 +
 .../facets/object/icon/IconFacetAbstract.java      |   36 +
 .../facets/object/icon/method/IconFacetMethod.java |   52 +
 .../object/icon/method/IconFacetMethodFactory.java |   53 +
 .../RemoveAnnotatedMethodsFacetFactory.java        |   99 ++
 ...oveDatanucleusPersistableTypesFacetFactory.java |   67 ++
 .../RemoveDnPrefixedMethodsFacetFactory.java       |   46 +
 .../javalang/IteratorFilteringFacetFactory.java    |   55 +
 .../ignore/javalang/RemoveMethodsFacetFactory.java |  132 +++
 .../jdo/RemoveJdoEnhancementTypesFacetFactory.java |   66 ++
 .../jdo/RemoveJdoPrefixedMethodsFacetFactory.java  |   48 +
 .../facets/object/immutable/ImmutableFacet.java    |   69 ++
 .../object/immutable/ImmutableFacetAbstract.java   |   61 ++
 .../CopyImmutableFacetOntoMembersFactory.java      |   45 +
 .../facets/object/layout/LayoutFacet.java          |   37 +
 .../facets/object/layout/LayoutFacetAbstract.java  |   41 +
 .../facets/object/layout/LayoutFacetFactory.java   |   56 +
 .../facets/object/layout/LayoutFacetFallback.java  |   44 +
 .../facets/object/layout/LayoutFacetMethod.java    |   54 +
 .../mixin/MetaModelValidatorForMixinTypes.java     |   55 +
 .../metamodel/facets/object/mixin/MixinFacet.java  |   74 ++
 .../facets/object/mixin/MixinFacetAbstract.java    |  143 +++
 .../mixin/MixinFacetForDomainObjectAnnotation.java |   72 ++
 .../object/mixin/MixinFacetForMixinAnnotation.java |   64 ++
 .../mixin/MixinFacetForMixinAnnotationFactory.java |   64 ++
 .../object/navparent/NavigableParentFacet.java     |   43 +
 .../navparent/NavigableParentFacetAbstract.java    |   36 +
 .../NavigableParentAnnotationFacetFactory.java     |  161 +++
 .../method/NavigableParentFacetMethod.java         |   60 ++
 .../object/objectspecid/ObjectSpecIdFacet.java     |   33 +
 .../objectspecid/ObjectSpecIdFacetAbstract.java    |   66 ++
 .../ObjectSpecIdFacetDerivedFromClassName.java     |   35 +
 ...jectSpecIdFacetDerivedFromClassNameFactory.java |  205 ++++
 ...ectSpecIdFacetDerivedFromIoCNamingStrategy.java |   34 +
 .../ObjectSpecIdFacetOnStandaloneList.java         |   31 +
 .../ObjectValidPropertiesFacet.java                |   42 +
 .../ObjectValidPropertiesFacetAbstract.java        |   48 +
 .../impl/ObjectValidPropertiesFacetImpl.java       |   70 ++
 .../ObjectValidPropertiesFacetImplFactory.java     |   35 +
 .../metamodel/facets/object/paged/PagedFacet.java  |   31 +
 .../facets/object/paged/PagedFacetAbstract.java    |   50 +
 .../PagedFacetForPagedAnnotationOnType.java        |   34 +
 .../object/parented/ParentedCollectionFacet.java   |   40 +
 .../parented/ParentedCollectionFacetAbstract.java  |   36 +
 .../object/parseable/InvalidEntryException.java    |   42 +
 .../facets/object/parseable/ParseableFacet.java    |   55 +
 .../object/parseable/ParseableFacetAbstract.java   |   90 ++
 .../facets/object/parseable/ParserUtil.java        |   46 +
 .../object/parseable/TextEntryParseException.java  |   47 +
 .../annotcfg/ParseableFacetFromConfiguration.java  |   33 +
 .../parser/ParseableFacetUsingParser.java          |  132 +++
 .../facets/object/plural/PluralFacet.java          |   41 +
 .../facets/object/plural/PluralFacetAbstract.java  |   42 +
 .../plural/inferred/PluralFacetInferred.java       |   31 +
 .../facets/object/projection/ProjectionFacet.java  |   29 +
 .../object/projection/ProjectionFacetAbstract.java |   42 +
 .../ProjectionFacetFromProjectingProperty.java     |   65 ++
 .../CssClassFacetDerivedFromProjectionFacet.java   |   54 +
 .../ident/IconFacetDerivedFromProjectionFacet.java |   52 +
 .../TitleFacetDerivedFromProjectionFacet.java      |   52 +
 .../object/promptStyle/PromptStyleFacet.java       |   33 +
 .../promptStyle/PromptStyleFacetAbstract.java      |   42 +
 .../promptStyle/PromptStyleFacetAsConfigured.java  |   45 +
 .../PromptStyleFacetFallBackToInline.java          |   37 +
 .../publishedobject/PublishedObjectFacet.java      |   30 +
 .../PublishedObjectFacetAbstract.java              |   38 +
 ...etOnCollectionDerivedFromRecreatableObject.java |   46 +
 ...CollectionDerivedFromViewModelFacetFactory.java |   54 +
 ...acetOnPropertyDerivedFromRecreatableObject.java |   48 +
 ...tyDerivedFromRecreatableObjectFacetFactory.java |   52 +
 .../RecreatableObjectFacetAbstract.java            |  129 +++
 ...ObjectFacetDeclarativeInitializingAbstract.java |  145 +++
 .../recreatable/RecreatableObjectFacetFactory.java |  131 +++
 ...ctFacetForRecreatableDomainObjectInterface.java |   46 +
 ...eObjectFacetForRecreatableObjectAnnotation.java |   34 +
 ...leObjectFacetForRecreatableObjectInterface.java |   45 +
 ...creatableObjectFacetForViewModelAnnotation.java |   35 +
 ...ableObjectFacetForXmlRootElementAnnotation.java |   81 ++
 .../metamodel/facets/object/recreatable/Util.java  |   33 +
 .../metamodel/facets/object/title/TitleFacet.java  |   55 +
 .../facets/object/title/TitleFacetAbstract.java    |   45 +
 .../annotation/TitleAnnotationFacetFactory.java    |  188 ++++
 .../annotation/TitleFacetViaTitleAnnotation.java   |  169 +++
 .../title/methods/TitleFacetViaMethodsFactory.java |   95 ++
 .../title/methods/TitleFacetViaTitleMethod.java    |   93 ++
 .../title/methods/TitleFacetViaToStringMethod.java |   70 ++
 .../object/title/parser/TitleFacetUsingParser.java |   79 ++
 .../validateobject/ValidateObjectFacet.java        |   55 +
 .../ValidateObjectFacetAbstract.java               |   49 +
 .../method/ValidateObjectFacetMethod.java          |   80 ++
 .../method/ValidateObjectFacetMethodFactory.java   |   60 ++
 .../facets/object/value/EqualByContentFacet.java   |   33 +
 .../object/value/EqualByContentFacetAbstract.java  |   36 +
 .../EqualByContentFacetViaValueSemantics.java      |   30 +
 .../value/ImmutableFacetViaValueSemantics.java     |   39 +
 .../object/value/MaxLengthFacetUsingParser.java    |   58 +
 .../value/TypicalLengthFacetUsingParser.java       |   53 +
 .../metamodel/facets/object/value/ValueFacet.java  |   35 +
 .../facets/object/value/ValueFacetAbstract.java    |  155 +++
 .../facets/object/value/ValueFacetSimple.java      |   37 +
 .../value/annotcfg/ValueFacetAnnotation.java       |   81 ++
 ...ValueFacetAnnotationOrConfigurationFactory.java |  113 ++
 .../annotcfg/ValueFacetFromConfiguration.java      |   38 +
 .../vsp/ValueFacetUsingSemanticsProvider.java      |   41 +
 .../ValueFacetUsingSemanticsProviderFactory.java   |   46 +
 .../ValueSemanticsProviderAndFacetAbstract.java    |  328 ++++++
 .../value/vsp/ValueSemanticsProviderUtil.java      |   67 ++
 .../facets/object/viewmodel/ViewModelFacet.java    |  125 +++
 .../facets/object/wizard/WizardFacet.java          |   41 +
 .../facets/object/wizard/WizardFacetAbstract.java  |   36 +
 .../facets/objectvalue/choices/ChoicesFacet.java   |   49 +
 .../objectvalue/choices/ChoicesFacetAbstract.java  |   36 +
 .../objectvalue/fileaccept/FileAcceptFacet.java    |   35 +
 .../fileaccept/FileAcceptFacetAbstract.java        |   37 +
 .../facets/objectvalue/labelat/LabelAtFacet.java   |   36 +
 .../objectvalue/labelat/LabelAtFacetAbstract.java  |   56 +
 .../LabelAtFacetInferredFromMultiLineFacet.java    |   38 +
 .../objectvalue/mandatory/MandatoryFacet.java      |   57 +
 .../mandatory/MandatoryFacetAbstract.java          |  110 ++
 .../mandatory/MandatoryFacetDefault.java           |   43 +
 .../facets/objectvalue/maxlen/MaxLengthFacet.java  |   41 +
 .../objectvalue/maxlen/MaxLengthFacetAbstract.java |   75 ++
 .../objectvalue/multiline/MultiLineFacet.java      |   51 +
 .../multiline/MultiLineFacetAbstract.java          |   63 ++
 .../MustSatisfySpecificationFacet.java             |   27 +
 .../MustSatisfySpecificationFacetAbstract.java     |  124 +++
 .../mustsatisfyspec/SpecificationEvaluator.java    |   80 ++
 .../facets/objectvalue/regex/RegExFacet.java       |   38 +
 .../objectvalue/regex/RegExFacetAbstract.java      |  104 ++
 .../renderedadjusted/RenderedAdjustedFacet.java    |   39 +
 .../RenderedAdjustedFacetAbstract.java             |   56 +
 .../objectvalue/typicallen/TypicalLengthFacet.java |   40 +
 .../typicallen/TypicalLengthFacetAbstract.java     |   45 +
 .../ActionParameterAutoCompleteFacet.java          |   47 +
 .../ActionParameterAutoCompleteFacetAbstract.java  |   41 +
 .../facets/param/autocomplete/MinLengthUtil.java   |   56 +
 .../ActionParameterAutoCompleteFacetViaMethod.java |  121 +++
 ...ParameterAutoCompleteFacetViaMethodFactory.java |   88 ++
 ...ameterFromJavaxValidationAnnotationFactory.java |   56 +
 ...rameterFromJavaxValidationDigitsAnnotation.java |   59 ++
 .../facets/param/choices/ActionChoicesFacet.java   |   38 +
 .../param/choices/ActionChoicesFacetAbstract.java  |   36 +
 .../param/choices/ActionParameterChoicesFacet.java |   42 +
 .../ActionParameterChoicesFacetAbstract.java       |   38 +
 .../choices/ActionParameterChoicesFacetNone.java   |   48 +
 ...rameterChoicesFacetDerivedFromChoicesFacet.java |   55 +
 ...ChoicesFacetDerivedFromChoicesFacetFactory.java |   55 +
 .../method/ActionChoicesFacetViaMethod.java        |  121 +++
 .../method/ActionChoicesFacetViaMethodFactory.java |  100 ++
 .../ActionParameterChoicesFacetViaMethod.java      |  108 ++
 ...ctionParameterChoicesFacetViaMethodFactory.java |   99 ++
 .../defaults/ActionParameterDefaultsFacet.java     |   41 +
 .../ActionParameterDefaultsFacetAbstract.java      |   36 +
 ...ParameterDefaultFacetDerivedFromTypeFacets.java |   60 ++
 ...arameterDefaultFacetDerivedFromTypeFactory.java |   64 ++
 .../ActionParameterDefaultsFacetViaMethod.java     |  117 ++
 ...tionParameterDefaultsFacetViaMethodFactory.java |  134 +++
 ...ameterAnnotationElseDerivedFromTypeFactory.java |   55 +
 ...DescribedAsFacetOnParameterDerivedFromType.java |   32 +
 .../disable/ActionParameterDisabledFacet.java      |   41 +
 .../ActionParameterDisabledFacetAbstract.java      |   49 +
 .../ActionParameterDisabledFacetViaMethod.java     |   95 ++
 ...tionParameterDisabledFacetViaMethodFactory.java |   94 ++
 .../param/hide/ActionParameterHiddenFacet.java     |   42 +
 .../hide/ActionParameterHiddenFacetAbstract.java   |   55 +
 .../ActionParameterHiddenFacetViaMethod.java       |   82 ++
 ...ActionParameterHiddenFacetViaMethodFactory.java |   91 ++
 .../CssClassFacetForParameterLayoutAnnotation.java |   46 +
 ...scribedAsFacetForParameterLayoutAnnotation.java |   46 +
 .../LabelAtFacetForParameterLayoutAnnotation.java  |   47 +
 ...MultiLineFacetForParameterLayoutAnnotation.java |   45 +
 .../NamedFacetForParameterLayoutAnnotation.java    |   51 +
 .../param/layout/ParameterLayoutFacetFactory.java  |   58 +
 ...dAdjustedFacetForParameterLayoutAnnotation.java |   58 +
 ...calLengthFacetForParameterLayoutAnnotation.java |   60 ++
 .../MandatoryFacetOnParametersDefaultFactory.java  |   56 +
 .../NamedFacetForParameterUsingReflection.java     |   34 +
 .../ParameterNameFacetFactoryUsingReflection.java  |   74 ++
 .../parameter/ParameterAnnotationFacetFactory.java |  134 +++
 .../FileAcceptFacetForParameterAnnotation.java     |   47 +
 .../MandatoryFacetForParameterAnnotation.java      |   81 ++
 ...cetInvertedByNullableAnnotationOnParameter.java |   59 ++
 .../MaxLengthFacetForParameterAnnotation.java      |   46 +
 ...fySpecificationFacetForParameterAnnotation.java |   69 ++
 .../regex/RegExFacetForParameterAnnotation.java    |   72 ++
 .../RegExFacetForPatternAnnotationOnParameter.java |   66 ++
 .../TypicalLengthFacetOnParameterAnnotation.java   |   50 +
 ...picalLengthFacetOnParameterDerivedFromType.java |   49 +
 ...acetOnParameterDerivedFromTypeFacetFactory.java |   56 +
 .../validate/ActionParameterValidationFacet.java   |   46 +
 .../ActionParameterValidationFacetAbstract.java    |   47 +
 .../ActionParameterValidationFacetViaMethod.java   |   84 ++
 ...onParameterValidationFacetViaMethodFactory.java |   83 ++
 .../PropertyOrCollectionAccessorFacet.java         |   53 +
 .../PropertyOrCollectionAccessorFacetAbstract.java |   57 +
 .../propcoll/notpersisted/NotPersistedFacet.java   |   38 +
 .../notpersisted/NotPersistedFacetAbstract.java    |   36 +
 .../accessor/PropertyAccessorFacetViaAccessor.java |   96 ++
 .../PropertyAccessorFacetViaAccessorFactory.java   |  113 ++
 .../autocomplete/PropertyAutoCompleteFacet.java    |   51 +
 .../PropertyAutoCompleteFacetAbstract.java         |   39 +
 .../method/PropertyAutoCompleteFacetMethod.java    |  114 ++
 .../PropertyAutoCompleteFacetMethodFactory.java    |   79 ++
 ...ropertyFromJavaxValidationDigitsAnnotation.java |   60 ++
 ...FromJavaxValidationDigitsAnnotationFactory.java |   59 ++
 .../properties/businesskey/BusinessKeyFacet.java   |   36 +
 .../businesskey/BusinessKeyFacetAbstract.java      |   36 +
 .../properties/choices/PropertyChoicesFacet.java   |   50 +
 .../choices/PropertyChoicesFacetAbstract.java      |   36 +
 ...ropertyChoicesFacetDerivedFromChoicesFacet.java |   52 +
 ...ChoicesFacetDerivedFromChoicesFacetFactory.java |   45 +
 .../method/PropertyChoicesFacetViaMethod.java      |   93 ++
 .../PropertyChoicesFacetViaMethodFactory.java      |   77 ++
 .../properties/defaults/PropertyDefaultFacet.java  |   46 +
 .../defaults/PropertyDefaultFacetAbstract.java     |   36 +
 .../defaults/PropertyDefaultFacetNone.java         |   44 +
 ...pertyDefaultFacetDerivedFromDefaultedFacet.java |   57 +
 ...PropertyDefaultFacetDerivedFromTypeFactory.java |   64 ++
 .../method/PropertyDefaultFacetViaMethod.java      |   88 ++
 .../PropertyDefaultFacetViaMethodFactory.java      |   77 ++
 ...isabledFacetOnPropertyDerivedFromImmutable.java |   38 +
 ...FacetOnPropertyDerivedFromImmutableFactory.java |   52 +
 .../inferred/DisabledFacetOnPropertyInferred.java  |   32 +
 .../DisabledFacetOnPropertyInferredFactory.java    |   56 +
 .../MandatoryFacetOnProperyDefaultFactory.java     |   57 +
 .../MultiLineFacetOnPropertyAnnotation.java        |   35 +
 .../properties/projection/ProjectingFacet.java     |   30 +
 .../projection/ProjectingFacetAbstract.java        |   41 +
 .../ProjectingFacetFromPropertyAnnotation.java     |   70 ++
 .../property/PropertyAnnotationFacetFactory.java   |  377 +++++++
 .../command/CommandFacetForPropertyAnnotation.java |   99 ++
 ...mandFacetForPropertyAnnotationAsConfigured.java |   37 +
 .../DisabledFacetForPropertyAnnotation.java        |   65 ++
 ...acetForPropertyAnnotationInvertedSemantics.java |   32 +
 .../FileAcceptFacetForPropertyAnnotation.java      |   47 +
 .../hidden/HiddenFacetForPropertyAnnotation.java   |   56 +
 .../MandatoryFacetForPropertyAnnotation.java       |   90 ++
 ...acetInvertedByNullableAnnotationOnProperty.java |   61 ++
 .../MaxLengthFacetForPropertyAnnotation.java       |   46 +
 ...ropertyClearFacetForDomainEventFromDefault.java |   41 +
 ...rFacetForDomainEventFromPropertyAnnotation.java |   41 +
 .../property/modify/PropertyDomainEventFacet.java  |   33 +
 .../modify/PropertyDomainEventFacetAbstract.java   |  167 +++
 .../modify/PropertyDomainEventFacetDefault.java    |   40 +
 ...pertyDomainEventFacetForPropertyAnnotation.java |   40 +
 ...opertySetterFacetForDomainEventFromDefault.java |   42 +
 ...rFacetForDomainEventFromPropertyAnnotation.java |   41 +
 ...tySetterOrClearFacetForDomainEventAbstract.java |  340 ++++++
 .../facets/properties/property/modify/Utils.java   |   23 +
 ...sfySpecificationFacetForPropertyAnnotation.java |   66 ++
 .../NotPersistedFacetForPropertyAnnotation.java    |   46 +
 ...ublishedPropertyFacetForPropertyAnnotation.java |   79 ++
 ...ertyFacetForPropertyAnnotationAsConfigured.java |   27 +
 .../PublishedPropertyFacetFromConfiguration.java   |   31 +
 .../RegExFacetForPatternAnnotationOnProperty.java  |   76 ++
 .../regex/RegExFacetForPropertyAnnotation.java     |   70 ++
 .../CssClassFacetForPropertyLayoutAnnotation.java  |   47 +
 .../CssClassFacetForPropertyXml.java               |   42 +
 ...escribedAsFacetForPropertyLayoutAnnotation.java |   47 +
 .../DescribedAsFacetForPropertyXml.java            |   42 +
 .../HiddenFacetForPropertyLayoutAnnotation.java    |   56 +
 .../propertylayout/HiddenFacetForPropertyXml.java  |   51 +
 .../LabelAtFacetForPropertyLayoutAnnotation.java   |   47 +
 .../propertylayout/LabelAtFacetForPropertyXml.java |   42 +
 .../MultiLineFacetForPropertyLayoutAnnotation.java |   46 +
 .../MultiLineFacetForPropertyXml.java              |   41 +
 .../NamedFacetForPropertyLayoutAnnotation.java     |   51 +
 .../propertylayout/NamedFacetForPropertyXml.java   |   47 +
 ...romptStyleFacetForPropertyLayoutAnnotation.java |   96 ++
 .../PromptStyleFacetForPropertyXml.java            |   57 +
 .../propertylayout/PropertyLayoutFacetFactory.java |  194 ++++
 ...edAdjustedFacetForPropertyLayoutAnnotation.java |   58 +
 .../RenderedAdjustedFacetForPropertyXml.java       |   45 +
 ...icalLengthFacetForPropertyLayoutAnnotation.java |   61 ++
 .../TypicalLengthFacetForPropertyXml.java          |   57 +
 ...UnchangingFacetForPropertyLayoutAnnotation.java |   59 ++
 .../UnchangingFacetForPropertyXml.java             |   42 +
 .../properties/publish/PublishedPropertyFacet.java |   29 +
 .../publish/PublishedPropertyFacetAbstract.java    |   38 +
 ...nderedAsDayBeforeFacetAnnotationOnProperty.java |   38 +
 .../renderunchanged/UnchangingFacet.java           |   30 +
 .../renderunchanged/UnchangingFacetAbstract.java   |   36 +
 .../properties/searchable/SearchableFacet.java     |   49 +
 .../searchable/SearchableFacetAbstract.java        |   51 +
 .../TypicalLengthFacetOnPropertyAnnotation.java    |   50 +
 ...ypicalLengthFacetOnPropertyDerivedFromType.java |   49 +
 ...FacetOnPropertyDerivedFromTypeFacetFactory.java |   55 +
 .../update/NotPersistableFacetInferred.java        |   31 +
 .../update/PropertyModifyFacetFactory.java         |   68 ++
 .../update/PropertySetAndClearFacetFactory.java    |  122 +++
 .../update/clear/PropertyClearFacet.java           |   43 +
 .../update/clear/PropertyClearFacetAbstract.java   |   35 +
 .../clear/PropertyClearFacetViaClearMethod.java    |   74 ++
 .../clear/PropertyClearFacetViaSetterMethod.java   |   75 ++
 .../update/init/PropertyInitializationFacet.java   |   50 +
 .../init/PropertyInitializationFacetAbstract.java  |   35 +
 ...PropertyInitializationFacetViaSetterMethod.java |   70 ++
 .../update/modify/PropertySetterFacet.java         |   51 +
 .../update/modify/PropertySetterFacetAbstract.java |   35 +
 .../modify/PropertySetterFacetViaModifyMethod.java |   81 ++
 .../modify/PropertySetterFacetViaSetterMethod.java |   76 ++
 .../validating/PropertyValidateFacet.java          |   50 +
 .../validating/PropertyValidateFacetAbstract.java  |   57 +
 .../validating/PropertyValidateFacetNone.java      |   47 +
 .../dflt/PropertyValidateFacetDefault.java         |   49 +
 .../dflt/PropertyValidateFacetDefaultFactory.java  |   58 +
 .../method/PropertyValidateFacetViaMethod.java     |   83 ++
 .../PropertyValidateFacetViaMethodFactory.java     |   76 ++
 .../DateAndTimeValueSemanticsProviderAbstract.java |  116 ++
 .../core/metamodel/facets/value/JodaFunctions.java |   43 +
 .../ValueSemanticsProviderAbstractTemporal.java    |  373 +++++++
 .../value/bigdecimal/BigDecimalValueFacet.java     |   60 ++
 .../bigdecimal/BigDecimalValueFacetAbstract.java   |   37 +
 ...malValueFacetUsingSemanticsProviderFactory.java |   44 +
 .../BigDecimalValueSemanticsProvider.java          |  143 +++
 .../value/biginteger/BigIntegerValueFacet.java     |   26 +
 ...gerValueFacetUsingSemanticsProviderFactory.java |   43 +
 .../BigIntegerValueSemanticsProvider.java          |  110 ++
 .../facets/value/blobs/BlobValueFacet.java         |   26 +
 ...lobValueFacetUsingSemanticsProviderFactory.java |   41 +
 .../value/blobs/BlobValueSemanticsProvider.java    |  123 +++
 ...iveValueFacetUsingSemanticsProviderFactory.java |   42 +
 .../BooleanPrimitiveValueSemanticsProvider.java    |   55 +
 .../facets/value/booleans/BooleanValueFacet.java   |   29 +
 .../BooleanValueSemanticsProviderAbstract.java     |  129 +++
 ...perValueFacetUsingSemanticsProviderFactory.java |   42 +
 .../BooleanWrapperValueSemanticsProvider.java      |   69 ++
 ...iveValueFacetUsingSemanticsProviderFactory.java |   42 +
 .../bytes/BytePrimitiveValueSemanticsProvider.java |   52 +
 .../facets/value/bytes/ByteValueFacet.java         |   30 +
 .../bytes/ByteValueSemanticsProviderAbstract.java  |  116 ++
 ...perValueFacetUsingSemanticsProviderFactory.java |   42 +
 .../bytes/ByteWrapperValueSemanticsProvider.java   |   41 +
 ...iveValueFacetUsingSemanticsProviderFactory.java |   42 +
 .../chars/CharPrimitiveValueSemanticsProvider.java |   54 +
 .../facets/value/chars/CharValueFacet.java         |   30 +
 .../chars/CharValueSemanticsProviderAbstract.java  |  103 ++
 ...perValueFacetUsingSemanticsProviderFactory.java |   42 +
 .../chars/CharWrapperValueSemanticsProvider.java   |   41 +
 .../facets/value/clobs/ClobValueFacet.java         |   26 +
 ...lobValueFacetUsingSemanticsProviderFactory.java |   42 +
 .../value/clobs/ClobValueSemanticsProvider.java    |  117 ++
 .../facets/value/date/DateValueFacet.java          |   33 +
 .../date/DateValueSemanticsProviderAbstract.java   |  121 +++
 .../value/datejdk8local/Jdk8LocalDateUtil.java     |  170 +++
 .../datejdk8local/Jdk8LocalDateValueFacet.java     |   33 +
 ...ateValueFacetUsingSemanticsProviderFactory.java |   45 +
 .../Jdk8LocalDateValueSemanticsProvider.java       |  252 +++++
 .../facets/value/datejdk8local/TimeFormatter.java  |   27 +
 .../facets/value/datejdk8local/TimeParser.java     |   27 +
 .../value/datejodalocal/JodaLocalDateUtil.java     |  130 +++
 .../datejodalocal/JodaLocalDateValueFacet.java     |   33 +
 ...ateValueFacetUsingSemanticsProviderFactory.java |   45 +
 .../JodaLocalDateValueSemanticsProvider.java       |  257 +++++
 ...ateValueFacetUsingSemanticsProviderFactory.java |   45 +
 .../datesql/JavaSqlDateValueSemanticsProvider.java |   98 ++
 .../datetimejdk8local/Jdk8LocalDateTimeUtil.java   |  157 +++
 .../Jdk8LocalDateTimeValueFacet.java               |   33 +
 ...imeValueFacetUsingSemanticsProviderFactory.java |   45 +
 .../Jdk8LocalDateTimeValueSemanticsProvider.java   |  272 +++++
 .../value/datetimejdk8local/TimeFormatter.java     |   27 +
 .../facets/value/datetimejdk8local/TimeParser.java |   27 +
 .../Jdk8OffsetDateTimeValueFacet.java              |   33 +
 ...imeValueFacetUsingSemanticsProviderFactory.java |   45 +
 .../Jdk8OffsetDateTimeValueSemanticsProvider.java  |  103 ++
 ...fsetDateTimeValueSemanticsProviderAbstract.java |  121 +++
 .../value/datetimejoda/JodaDateTimeValueFacet.java |   33 +
 ...imeValueFacetUsingSemanticsProviderFactory.java |   45 +
 .../JodaDateTimeValueSemanticsProvider.java        |  103 ++
 ...JodaDateTimeValueSemanticsProviderAbstract.java |  121 +++
 .../datetimejodalocal/JodaLocalDateTimeUtil.java   |  127 +++
 .../JodaLocalDateTimeValueFacet.java               |   33 +
 ...imeValueFacetUsingSemanticsProviderFactory.java |   45 +
 .../JodaLocalDateTimeValueSemanticsProvider.java   |  259 +++++
 ...ateValueFacetUsingSemanticsProviderFactory.java |   46 +
 .../JavaUtilDateValueSemanticsProvider.java        |   85 ++
 .../doubles/DoubleFloatingPointValueFacet.java     |   30 +
 ...iveValueFacetUsingSemanticsProviderFactory.java |   42 +
 .../DoublePrimitiveValueSemanticsProvider.java     |   54 +
 .../DoubleValueSemanticsProviderAbstract.java      |  120 +++
 ...perValueFacetUsingSemanticsProviderFactory.java |   42 +
 .../DoubleWrapperValueSemanticsProvider.java       |   42 +
 ...iveValueFacetUsingSemanticsProviderFactory.java |   42 +
 .../FloatPrimitiveValueSemanticsProvider.java      |   54 +
 .../FloatValueSemanticsProviderAbstract.java       |  116 ++
 ...perValueFacetUsingSemanticsProviderFactory.java |   42 +
 .../floats/FloatWrapperValueSemanticsProvider.java |   41 +
 .../value/floats/FloatingPointValueFacet.java      |   30 +
 .../facets/value/image/ImageValueFacet.java        |   34 +
 ...ageValueFacetUsingSemanticsProviderFactory.java |   43 +
 .../value/image/ImageValueSemanticsProvider.java   |  100 ++
 .../image/ImageValueSemanticsProviderAbstract.java |  298 ++++++
 ...ageValueFacetUsingSemanticsProviderFactory.java |   44 +
 .../JavaAwtImageValueSemanticsProvider.java        |   83 ++
 ...iveValueFacetUsingSemanticsProviderFactory.java |   42 +
 .../IntPrimitiveValueSemanticsProvider.java        |   54 +
 .../integer/IntValueSemanticsProviderAbstract.java |  114 ++
 ...perValueFacetUsingSemanticsProviderFactory.java |   42 +
 .../integer/IntWrapperValueSemanticsProvider.java  |   41 +
 .../facets/value/integer/IntegerValueFacet.java    |   30 +
 .../localrespath/LocalResourcePathValueFacet.java  |   32 +
 ...athValueFacetUsingSemanticsProviderFactory.java |   44 +
 .../LocalResourcePathValueSemanticsProvider.java   |  130 +++
 ...iveValueFacetUsingSemanticsProviderFactory.java |   42 +
 .../longs/LongPrimitiveValueSemanticsProvider.java |   52 +
 .../facets/value/longs/LongValueFacet.java         |   30 +
 .../longs/LongValueSemanticsProviderAbstract.java  |  113 ++
 ...perValueFacetUsingSemanticsProviderFactory.java |   42 +
 .../longs/LongWrapperValueSemanticsProvider.java   |   41 +
 .../facets/value/markup/MarkupValueFacet.java      |   30 +
 ...kupValueFacetUsingSemanticsProviderFactory.java |   38 +
 .../value/markup/MarkupValueSemanticsProvider.java |  114 ++
 .../facets/value/password/PasswordValueFacet.java  |   33 +
 ...ordValueFacetUsingSemanticsProviderFactory.java |   43 +
 .../password/PasswordValueSemanticsProvider.java   |  119 +++
 ...iveValueFacetUsingSemanticsProviderFactory.java |   42 +
 .../ShortPrimitiveValueSemanticsProvider.java      |   52 +
 .../facets/value/shortint/ShortValueFacet.java     |   30 +
 .../ShortValueSemanticsProviderAbstract.java       |  115 ++
 ...perValueFacetUsingSemanticsProviderFactory.java |   42 +
 .../ShortWrapperValueSemanticsProvider.java        |   41 +
 .../facets/value/string/StringValueFacet.java      |   31 +
 ...ingValueFacetUsingSemanticsProviderFactory.java |   42 +
 .../value/string/StringValueSemanticsProvider.java |  126 +++
 .../time/TimeValueSemanticsProviderAbstract.java   |  110 ++
 .../JodaLocalTimeValueFacetSimpleFactory.java      |   46 +
 ...imeValueFacetUsingSemanticsProviderFactory.java |   46 +
 .../timesql/JavaSqlTimeValueSemanticsProvider.java |   95 ++
 ...ampValueFacetUsingSemanticsProviderFactory.java |   47 +
 .../JavaSqlTimeStampValueSemanticsProvider.java    |   84 ++
 .../TimeStampValueSemanticsProviderAbstract.java   |  101 ++
 .../facets/value/treenode/TreeNodeValueFacet.java  |   27 +
 ...odeValueFacetUsingSemanticsProviderFactory.java |   40 +
 .../treenode/TreeNodeValueSemanticsProvider.java   |  136 +++
 .../metamodel/facets/value/url/URLValueFacet.java  |   31 +
 ...URLValueFacetUsingSemanticsProviderFactory.java |   44 +
 .../value/url/URLValueSemanticsProvider.java       |  127 +++
 .../facets/value/uuid/UUIDValueFacet.java          |   33 +
 ...UIDValueFacetUsingSemanticsProviderFactory.java |   44 +
 .../value/uuid/UUIDValueSemanticsProvider.java     |  112 ++
 .../core/metamodel/interactions/AccessContext.java |   42 +
 .../interactions/ActionArgUsabilityContext.java    |   76 ++
 .../interactions/ActionArgValidityContext.java     |   68 ++
 .../interactions/ActionArgVisibilityContext.java   |   76 ++
 .../interactions/ActionInteractionContext.java     |   31 +
 .../interactions/ActionUsabilityContext.java       |   60 ++
 .../interactions/ActionValidityContext.java        |   64 ++
 .../interactions/ActionVisibilityContext.java      |   60 ++
 .../interactions/CollectionAccessContext.java      |   48 +
 .../interactions/CollectionAddToContext.java       |   56 +
 .../interactions/CollectionRemoveFromContext.java  |   58 +
 .../interactions/CollectionUsabilityContext.java   |   48 +
 .../interactions/CollectionVisibilityContext.java  |   50 +
 .../interactions/DisablingInteractionAdvisor.java  |   46 +
 .../interactions/HidingInteractionAdvisor.java     |   47 +
 .../interactions/InteractionAdvisorFacet.java      |   45 +
 .../metamodel/interactions/InteractionContext.java |  171 +++
 .../metamodel/interactions/InteractionUtils.java   |   81 ++
 .../metamodel/interactions/ObjectTitleContext.java |   56 +
 .../interactions/ObjectValidityContext.java        |   53 +
 .../interactions/ObjectVisibilityContext.java      |   55 +
 .../metamodel/interactions/ParseValueContext.java  |   59 ++
 .../interactions/PropertyAccessContext.java        |   60 ++
 .../interactions/PropertyModifyContext.java        |   61 ++
 .../interactions/PropertyUsabilityContext.java     |   50 +
 .../interactions/PropertyVisibilityContext.java    |   50 +
 .../metamodel/interactions/ProposedHolder.java     |   38 +
 .../metamodel/interactions/UsabilityContext.java   |   55 +
 .../interactions/ValidatingInteractionAdvisor.java |   51 +
 .../metamodel/interactions/ValidityContext.java    |   42 +
 .../metamodel/interactions/VisibilityContext.java  |   54 +
 .../isis/core/metamodel/layout/DeweyOrderSet.java  |  404 +++++++
 .../MemberIdentifierComparator.java                |   44 +
 .../memberorderfacet/MemberOrderComparator.java    |   90 ++
 .../MemberOrderFacetComparator.java                |   56 +
 .../OrderSetGroupNameComparator.java               |   55 +
 .../metamodel/objectmanager/ObjectManager.java     |  107 ++
 .../objectmanager/ObjectManagerDefault.java        |   77 ++
 .../objectmanager/create/ObjectCreator.java        |   82 ++
 .../create/ObjectCreator_builtinHandlers.java      |  386 +++++++
 .../objectmanager/identify/ObjectIdentifier.java   |   63 ++
 .../identify/ObjectIdentifier_builtinHandlers.java |  139 +++
 .../metamodel/objectmanager/load/ObjectLoader.java |   80 ++
 .../load/ObjectLoader_builtinHandlers.java         |  258 +++++
 .../objectmanager/refresh/ObjectRefresher.java     |   67 ++
 .../refresh/ObjectRefresher_builtinHandlers.java   |  107 ++
 ...arameterChoicesFacetFromParentedCollection.java |   76 ++
 ...meterDefaultsFacetFromAssociatedCollection.java |   64 ++
 .../param/DeriveFacetsPostProcessor.java           |  635 +++++++++++
 .../ObjectSpecificationPostProcessor.java          |   28 +
 .../core/metamodel/progmodel/ProgrammingModel.java |  179 ++++
 .../progmodel/ProgrammingModelAbstract.java        |  253 +++++
 .../progmodel/ProgrammingModelInitFilter.java      |   80 ++
 .../ProgrammingModelInitFilterDefault.java         |   85 ++
 .../progmodel/ProgrammingModelService.java         |   32 +
 .../dflt/ProgrammingModelFacetsJava8.java          |  388 +++++++
 .../core/metamodel/services/CollectionHelper.java  |  100 ++
 .../metamodel/services/ServiceInjectorDefault.java |   75 ++
 .../metamodel/services/ServiceInjectorLegacy.java  |  286 +++++
 .../isis/core/metamodel/services/ServiceUtil.java  |   41 +
 .../services/appfeat/ApplicationFeature.java       |  324 ++++++
 .../appfeat/ApplicationFeatureFactory.java         |   45 +
 .../services/appfeat/ApplicationFeatureId.java     |  492 +++++++++
 .../ApplicationFeatureRepositoryDefault.java       |  556 ++++++++++
 .../services/appfeat/ApplicationFeatureType.java   |  102 ++
 .../classsubstitutor/ClassSubstitutor.java         |   28 +
 .../classsubstitutor/ClassSubstitutorAbstract.java |  137 +++
 .../classsubstitutor/ClassSubstitutorDefault.java  |   76 ++
 .../ClassSubstitutorForCollections.java            |   64 ++
 .../classsubstitutor/ClassSubstitutorRegistry.java |   80 ++
 .../command/CommandDtoServiceInternal.java         |   71 ++
 .../services/container/query/QueryCardinality.java |   31 +
 .../metamodel/services/devutils/MemberType.java    |   25 +
 .../services/events/MetamodelEventService.java     |   94 ++
 .../events/MetamodelEventSupport_Spring.java       |   77 ++
 .../exceprecog/ExceptionRecognizerDocDefault.java  |   88 ++
 .../services/grid/GridLoaderServiceDefault.java    |  257 +++++
 .../services/grid/GridReaderUsingJaxb.java         |   76 ++
 .../services/grid/GridServiceDefault.java          |  209 ++++
 .../services/grid/GridSystemServiceAbstract.java   |  699 ++++++++++++
 .../grid/bootstrap3/DefaultGrid.layout.xml         |    0
 .../grid/bootstrap3/GridSystemServiceBS3.java      |  674 ++++++++++++
 .../services/homepage/HomePageAction.java          |   63 ++
 .../services/homepage/HomePageResolverService.java |   35 +
 .../metamodel/services/homepage/package-info.java  |   26 +
 .../ixn/InteractionDtoServiceInternal.java         |   51 +
 .../services/layout/LayoutServiceDefault.java      |  147 +++
 .../services/message/MessageServiceNoop.java       |   88 ++
 .../services/metamodel/DomainMemberDefault.java    |  301 ++++++
 .../services/metamodel/DomainModelDefault.java     |   58 +
 .../services/metamodel/MetaModelExportSupport.java |   31 +
 .../services/metamodel/MetaModelExporter.java      |  570 ++++++++++
 .../metamodel/MetaModelServiceDefault.java         |  272 +++++
 .../core/metamodel/services/metamodel/Util.java    |   35 +
 .../publishing/PublisherDispatchService.java       |   46 +
 .../services/registry/ServiceRegistryDefault.java  |  103 ++
 .../services/registry/SpringContextProvider.java   |   23 +
 .../services/title/TitleServiceDefault.java        |   83 ++
 .../title/TitlesAndTranslationsValidator.java      |  166 +++
 .../services/user/UserServiceDefault.java          |  177 ++++
 .../isis/core/metamodel/spec/ActionType.java       |   41 +
 .../isis/core/metamodel/spec/DefaultProvider.java  |   31 +
 .../apache/isis/core/metamodel/spec/Described.java |   35 +
 .../core/metamodel/spec/DomainModelException.java  |   47 +
 .../spec/ElementSpecificationProvider.java         |   44 +
 .../isis/core/metamodel/spec/EntityState.java      |   49 +
 .../isis/core/metamodel/spec/FreeStandingList.java |   96 ++
 .../isis/core/metamodel/spec/Hierarchical.java     |   65 ++
 .../metamodel/spec/InjectorMethodEvaluator.java    |   31 +
 .../isis/core/metamodel/spec/ManagedObject.java    |  734 +++++++++++++
 .../spec/ObjectInstantiationException.java         |   41 +
 .../isis/core/metamodel/spec/ObjectSpecId.java     |   62 ++
 .../core/metamodel/spec/ObjectSpecification.java   |  445 ++++++++
 .../spec/ObjectSpecificationException.java         |   36 +
 .../isis/core/metamodel/spec/Specification.java    |   50 +
 .../core/metamodel/spec/feature/Contributed.java   |   31 +
 .../core/metamodel/spec/feature/CurrentHolder.java |   46 +
 .../spec/feature/MutableCurrentHolder.java         |   64 ++
 .../core/metamodel/spec/feature/ObjectAction.java  |  589 +++++++++++
 .../spec/feature/ObjectActionContainer.java        |   80 ++
 .../spec/feature/ObjectActionParameter.java        |  235 ++++
 .../metamodel/spec/feature/ObjectAssociation.java  |  253 +++++
 .../spec/feature/ObjectAssociationContainer.java   |   72 ++
 .../core/metamodel/spec/feature/ObjectFeature.java |   79 ++
 .../core/metamodel/spec/feature/ObjectMember.java  |  228 ++++
 .../spec/feature/OneToManyActionParameter.java     |   28 +
 .../spec/feature/OneToManyAssociation.java         |  101 ++
 .../metamodel/spec/feature/OneToManyFeature.java   |   40 +
 .../spec/feature/OneToOneActionParameter.java      |   28 +
 .../spec/feature/OneToOneAssociation.java          |   53 +
 .../metamodel/spec/feature/OneToOneFeature.java    |   28 +
 .../core/metamodel/specloader/CollectionUtils.java |   61 ++
 .../specloader/InjectorMethodEvaluatorDefault.java |   91 ++
 .../specloader/ProgrammingModelServiceDefault.java |  104 ++
 .../specloader/ReflectiveActionException.java      |   43 +
 .../specloader/SpecificationCacheDefault.java      |  134 +++
 .../metamodel/specloader/SpecificationLoader.java  |  137 +++
 .../specloader/SpecificationLoaderDefault.java     |  521 +++++++++
 .../SpecificationLoaderDefault_debug.java          |   79 ++
 .../specloader/classsubstitutor/ProxyEnhanced.java |   28 +
 .../specloader/facetprocessor/FacetProcessor.java  |  486 +++++++++
 .../core/metamodel/specloader/package-info.java    |   43 +
 .../specloader/postprocessor/PostProcessor.java    |   59 ++
 .../specloader/specimpl/ContributeeMember.java     |   67 ++
 .../specloader/specimpl/FacetedMethodsBuilder.java |  614 +++++++++++
 .../metamodel/specloader/specimpl/Factories.java   |   96 ++
 .../specloader/specimpl/IntrospectionState.java    |   47 +
 .../specloader/specimpl/MixedInMember.java         |   40 +
 .../specimpl/ObjectActionContributee.java          |  253 +++++
 .../specloader/specimpl/ObjectActionDefault.java   |  688 ++++++++++++
 .../specloader/specimpl/ObjectActionMixedIn.java   |  260 +++++
 .../specimpl/ObjectActionParameterAbstract.java    |  492 +++++++++
 .../specimpl/ObjectActionParameterContributee.java |   25 +
 .../ObjectActionParameterContributeeAbstract.java  |   93 ++
 .../specimpl/ObjectActionParameterMixedIn.java     |   25 +
 .../ObjectActionParameterMixedInAbstract.java      |   85 ++
 .../specimpl/ObjectAssociationAbstract.java        |   97 ++
 .../specloader/specimpl/ObjectMemberAbstract.java  |  409 +++++++
 .../specimpl/ObjectSpecificationAbstract.java      | 1119 ++++++++++++++++++++
 .../OneToManyActionParameterContributee.java       |   43 +
 .../specimpl/OneToManyActionParameterDefault.java  |   43 +
 .../specimpl/OneToManyActionParameterMixedIn.java  |   40 +
 .../specimpl/OneToManyAssociationContributee.java  |  191 ++++
 .../specimpl/OneToManyAssociationDefault.java      |  288 +++++
 .../specimpl/OneToManyAssociationMixedIn.java      |  221 ++++
 .../OneToOneActionParameterContributee.java        |   38 +
 .../specimpl/OneToOneActionParameterDefault.java   |   37 +
 .../specimpl/OneToOneActionParameterMixedIn.java   |   35 +
 .../specimpl/OneToOneAssociationContributee.java   |  174 +++
 .../specimpl/OneToOneAssociationDefault.java       |  361 +++++++
 .../specimpl/OneToOneAssociationMixedIn.java       |  206 ++++
 .../metamodel/specloader/specimpl/Predicates.java  |  168 +++
 .../core/metamodel/specloader/specimpl/Utils.java  |  103 ++
 .../specimpl/dflt/ObjectSpecificationDefault.java  |  456 ++++++++
 .../CollectionFacetOnStandaloneList.java           |   73 ++
 .../DescribedAsFacetOnStandaloneList.java          |   31 +
 .../standalonelist/NamedFacetOnStandaloneList.java |   31 +
 .../ObjectSpecificationOnStandaloneList.java       |  186 ++++
 .../PluralFacetOnStandaloneList.java               |   31 +
 .../traverser/TypeExtractorAbstract.java           |   84 ++
 .../traverser/TypeExtractorMethodParameters.java   |   60 ++
 .../traverser/TypeExtractorMethodReturn.java       |   47 +
 .../validator/MetaModelInvalidException.java       |   33 +
 .../specloader/validator/MetaModelValidator.java   |   44 +
 .../validator/MetaModelValidatorAbstract.java      |   69 ++
 ...etaModelValidatorForConflictingOptionality.java |   62 ++
 .../MetaModelValidatorForDeprecatedAbstract.java   |   68 ++
 .../MetaModelValidatorForDeprecatedAnnotation.java |   54 +
 ...etaModelValidatorForDeprecatedMethodPrefix.java |   52 +
 .../MetaModelValidatorForValidationFailures.java   |   23 +
 .../validator/MetaModelValidatorVisiting.java      |  111 ++
 .../specloader/validator/ValidationFailure.java    |   61 ++
 .../specloader/validator/ValidationFailures.java   |  112 ++
 .../core/metamodel/util/DeweyOrderComparator.java  |   37 +
 .../apache/isis/core/metamodel/util/EventUtil.java |   43 +
 .../core/metamodel/util/pchain/ParentChain.java    |   83 ++
 .../metamodel/util/pchain/ParentChainDefault.java  |   49 +
 .../isis/core/metamodel/util/snapshot/Helper.java  |   91 ++
 .../core/metamodel/util/snapshot/IsisSchema.java   |  181 ++++
 .../isis/core/metamodel/util/snapshot/Place.java   |   65 ++
 .../core/metamodel/util/snapshot/XmlSchema.java    |  648 ++++++++++++
 .../core/metamodel/util/snapshot/XmlSnapshot.java  |  916 ++++++++++++++++
 .../core/metamodel/util/snapshot/XsMetaModel.java  |  337 ++++++
 .../metamodel/valuetypes/ValueTypeDefinition.java  |   45 +
 .../metamodel/valuetypes/ValueTypeProvider.java    |   29 +
 .../valuetypes/ValueTypeProviderDefault.java       |   54 +
 .../ValueTypeProviderForCollections.java           |   51 +
 .../metamodel/valuetypes/ValueTypeRegistry.java    |   96 ++
 .../apache/isis/metamodel/IsisModuleMetamodel.java |  101 --
 .../isis/metamodel/adapter/ObjectAdapter.java      |   61 --
 .../metamodel/adapter/ObjectAdapterProvider.java   |   35 -
 .../adapter/oid/ObjectNotFoundException.java       |   36 -
 .../adapter/oid/ObjectPersistenceException.java    |   42 -
 .../org/apache/isis/metamodel/adapter/oid/Oid.java |  140 ---
 .../isis/metamodel/adapter/oid/Oid_Marshaller.java |  254 -----
 .../isis/metamodel/adapter/oid/Oid_Parented.java   |  146 ---
 .../isis/metamodel/adapter/oid/Oid_Root.java       |  167 ---
 .../isis/metamodel/adapter/oid/Oid_Value.java      |   87 --
 .../isis/metamodel/adapter/oid/ParentedOid.java    |   54 -
 .../adapter/oid/PojoRecreationException.java       |   29 -
 .../adapter/oid/PojoRefreshException.java          |   32 -
 .../apache/isis/metamodel/adapter/oid/RootOid.java |   46 -
 .../isis/metamodel/adapter/package-info.java       |   32 -
 .../authorization/standard/AuthorizationFacet.java |   32 -
 .../standard/AuthorizationFacetAbstract.java       |   78 --
 .../standard/AuthorizationFacetFactory.java        |   46 -
 .../standard/AuthorizationFacetImpl.java           |   30 -
 .../authorization/standard/package-info.java       |   33 -
 .../isis/metamodel/commons/ArrayExtensions.java    |   69 --
 .../apache/isis/metamodel/commons/CanBeVoid.java   |   25 -
 .../isis/metamodel/commons/ClassExtensions.java    |  175 ---
 .../isis/metamodel/commons/ClassFunctions.java     |   46 -
 .../isis/metamodel/commons/ClassPredicates.java    |   37 -
 .../apache/isis/metamodel/commons/ClassUtil.java   |  192 ----
 .../metamodel/commons/CloseableExtensions.java     |   40 -
 .../isis/metamodel/commons/DateExtensions.java     |   35 -
 .../metamodel/commons/InputStreamExtensions.java   |   69 --
 .../isis/metamodel/commons/ListExtensions.java     |  115 --
 .../apache/isis/metamodel/commons/LocaleUtil.java  |   40 -
 .../org/apache/isis/metamodel/commons/MapUtil.java |   48 -
 .../isis/metamodel/commons/MethodExtensions.java   |   92 --
 .../commons/MethodInvocationPreprocessor.java      |  154 ---
 .../apache/isis/metamodel/commons/MethodUtil.java  |  202 ----
 .../isis/metamodel/commons/ObjectExtensions.java   |   82 --
 .../isis/metamodel/commons/ResourceUtil.java       |   83 --
 .../isis/metamodel/commons/StringExtensions.java   |  393 -------
 .../metamodel/commons/ThrowableExtensions.java     |   82 --
 .../apache/isis/metamodel/commons/ToString.java    |  165 ---
 .../apache/isis/metamodel/commons/Wormhole.java    |   50 -
 .../isis/metamodel/commons/package-info.java       |   27 -
 .../org/apache/isis/metamodel/consent/Allow.java   |   56 -
 .../org/apache/isis/metamodel/consent/Consent.java |   73 --
 .../isis/metamodel/consent/ConsentAbstract.java    |  159 ---
 .../isis/metamodel/consent/InteractionAdvisor.java |  103 --
 .../metamodel/consent/InteractionContextType.java  |  135 ---
 .../metamodel/consent/InteractionInitiatedBy.java  |   33 -
 .../isis/metamodel/consent/InteractionResult.java  |  155 ---
 .../metamodel/consent/InteractionResultSet.java    |  104 --
 .../org/apache/isis/metamodel/consent/Veto.java    |   48 -
 .../isis/metamodel/context/MetaModelContext.java   |  212 ----
 .../metamodel/context/MetaModelContextAware.java   |   29 -
 .../context/MetaModelContext_usingIoc.java         |  172 ---
 .../isis/metamodel/context/MetaModelContexts.java  |   44 -
 .../metamodel/exceptions/MetaModelException.java   |   43 -
 .../persistence/ObjectNotFoundException.java       |   38 -
 .../persistence/ObjectPersistenceException.java    |   42 -
 .../persistence/PojoRecreationException.java       |   31 -
 .../persistence/PojoRefreshException.java          |   34 -
 .../org/apache/isis/metamodel/facetapi/Facet.java  |  123 ---
 .../isis/metamodel/facetapi/FacetAbstract.java     |  287 -----
 .../isis/metamodel/facetapi/FacetHolder.java       |  150 ---
 .../isis/metamodel/facetapi/FacetHolderImpl.java   |  168 ---
 .../apache/isis/metamodel/facetapi/FacetUtil.java  |   96 --
 .../metamodel/facetapi/FacetWithAttributes.java    |   32 -
 .../isis/metamodel/facetapi/FeatureType.java       |  159 ---
 .../isis/metamodel/facetapi/IdentifiedHolder.java  |   31 -
 .../isis/metamodel/facetapi/MetaModelRefiner.java  |   34 -
 .../isis/metamodel/facetapi/MethodRemover.java     |   71 --
 .../apache/isis/metamodel/facets/Annotations.java  |  695 ------------
 .../isis/metamodel/facets/CollectionUtils.java     |  129 ---
 .../facets/ContributeeMemberFacetFactory.java      |   45 -
 .../isis/metamodel/facets/DependentArgUtils.java   |  199 ----
 .../isis/metamodel/facets/DomainEventHelper.java   |  441 --------
 .../apache/isis/metamodel/facets/FacetFactory.java |  337 ------
 .../metamodel/facets/FacetFactoryAbstract.java     |   70 --
 .../isis/metamodel/facets/FacetedMethod.java       |  215 ----
 .../metamodel/facets/FacetedMethodParameter.java   |   50 -
 .../isis/metamodel/facets/ImperativeFacet.java     |  169 ---
 .../metamodel/facets/ImperativeFacetMulti.java     |   33 -
 .../facets/MethodFilteringFacetFactory.java        |   33 -
 .../isis/metamodel/facets/MethodFinderUtils.java   |  239 -----
 .../metamodel/facets/MethodLiteralConstants.java   |   77 --
 .../facets/MethodPrefixBasedFacetFactory.java      |   39 -
 .../MethodPrefixBasedFacetFactoryAbstract.java     |  138 ---
 .../metamodel/facets/MethodRemoverConstants.java   |   44 -
 .../isis/metamodel/facets/MultipleValueFacet.java  |   26 -
 .../metamodel/facets/ObjectSpecIdFacetFactory.java |   37 -
 .../facets/OrphanedSupportingMethodValidator.java  |  126 ---
 .../metamodel/facets/PostConstructMethodCache.java |   30 -
 ...ropertyOrCollectionIdentifyingFacetFactory.java |   83 --
 ...rCollectionIdentifyingFacetFactoryAbstract.java |   43 -
 .../metamodel/facets/SingleClassValueFacet.java    |   35 -
 .../facets/SingleClassValueFacetAbstract.java      |   60 --
 .../isis/metamodel/facets/SingleIntValueFacet.java |   27 -
 .../facets/SingleIntValueFacetAbstract.java        |   47 -
 .../metamodel/facets/SingleStringValueFacet.java   |   23 -
 .../facets/SingleStringValueFacetAbstract.java     |   58 -
 .../isis/metamodel/facets/SingleValueFacet.java    |   28 -
 .../metamodel/facets/SingleValueFacetAbstract.java |   46 -
 .../apache/isis/metamodel/facets/TypedHolder.java  |   55 -
 .../isis/metamodel/facets/TypedHolderDefault.java  |   58 -
 .../isis/metamodel/facets/WhereValueFacet.java     |   29 -
 .../metamodel/facets/WhereValueFacetAbstract.java  |   57 -
 ...lementSpecificationProviderFromTypeOfFacet.java |   37 -
 .../facets/actcoll/typeof/TypeOfFacet.java         |  126 ---
 .../facets/actcoll/typeof/TypeOfFacetAbstract.java |   40 -
 .../actcoll/typeof/TypeOfFacetDefaultToObject.java |   30 -
 .../typeof/TypeOfFacetInferredFromArray.java       |   30 -
 .../typeof/TypeOfFacetInferredFromGenerics.java    |   30 -
 .../action/ActionAnnotationFacetFactory.java       |  287 -----
 ...nChoicesForCollectionParameterFacetFactory.java |  161 ---
 .../action/associateWith/AssociatedWithFacet.java  |   30 -
 .../associateWith/AssociatedWithFacetAbstract.java |   45 -
 .../AssociatedWithFacetForActionAnnotation.java    |   32 -
 .../command/CommandFacetForActionAnnotation.java   |  123 ---
 ...ommandFacetForActionAnnotationAsConfigured.java |   39 -
 .../command/CommandFacetFromConfiguration.java     |   46 -
 .../hidden/HiddenFacetForActionAnnotation.java     |   56 -
 .../action/invocation/ActionDomainEventFacet.java  |   33 -
 .../invocation/ActionDomainEventFacetAbstract.java |  165 ---
 .../invocation/ActionDomainEventFacetDefault.java  |   33 -
 .../ActionDomainEventFacetForActionAnnotation.java |   32 -
 .../action/invocation/ActionInvocationFacet.java   |   51 -
 .../invocation/ActionInvocationFacetAbstract.java  |   38 -
 ...ctionInvocationFacetForDomainEventAbstract.java |  513 ---------
 ...ionFacetForDomainEventFromActionAnnotation.java |   40 -
 ...onInvocationFacetForDomainEventFromDefault.java |   40 -
 .../actions/action/invocation/CommandUtil.java     |  113 --
 .../PrototypeFacetForActionAnnotation.java         |   51 -
 .../PublishedActionFacetForActionAnnotation.java   |   99 --
 ...ActionFacetForActionAnnotationAsConfigured.java |   31 -
 .../PublishedActionFacetFromConfiguration.java     |   32 -
 ...ctionSemanticsFacetFallbackToNonIdempotent.java |   32 -
 .../ActionSemanticsFacetForActionAnnotation.java   |   49 -
 .../typeof/TypeOfFacetForActionAnnotation.java     |   33 -
 .../facets/actions/command/CommandFacet.java       |   55 -
 .../actions/command/CommandFacetAbstract.java      |  123 ---
 .../actions/defaults/ActionDefaultsFacet.java      |   35 -
 .../defaults/ActionDefaultsFacetAbstract.java      |   36 -
 .../method/ActionDefaultsFacetViaMethod.java       |   88 --
 .../ActionDefaultsFacetViaMethodFactory.java       |   88 --
 .../FileAcceptFacetForActionAnnotation.java        |   47 -
 .../facets/actions/homepage/HomePageFacet.java     |   34 -
 .../actions/homepage/HomePageFacetAbstract.java    |   36 -
 .../facets/actions/homepage/HomePageFacetImpl.java |   30 -
 .../annotation/HomePageFacetAnnotation.java        |   31 -
 .../annotation/HomePageFacetAnnotationFactory.java |  130 ---
 .../actions/layout/ActionLayoutFacetFactory.java   |  171 ---
 ...tionPositionFacetForActionLayoutAnnotation.java |   46 -
 .../layout/ActionPositionFacetForActionXml.java    |   41 -
 ...okmarkPolicyFacetForActionLayoutAnnotation.java |   58 -
 .../layout/BookmarkPolicyFacetForActionXml.java    |   42 -
 .../CssClassFaFacetForActionLayoutAnnotation.java  |   57 -
 .../layout/CssClassFaFacetForActionXml.java        |   44 -
 .../CssClassFacetForActionLayoutAnnotation.java    |   47 -
 .../actions/layout/CssClassFacetForActionXml.java  |   42 -
 .../DescribedAsFacetForActionLayoutAnnotation.java |   47 -
 .../layout/DescribedAsFacetForActionXml.java       |   42 -
 .../HiddenFacetForActionLayoutAnnotation.java      |   56 -
 .../actions/layout/HiddenFacetForActionXml.java    |   51 -
 .../NamedFacetForActionLayoutAnnotation.java       |   48 -
 .../actions/layout/NamedFacetForActionXml.java     |   44 -
 ...tContributedFacetForActionLayoutAnnotation.java |   52 -
 .../PromptStyleFacetForActionLayoutAnnotation.java |   97 --
 .../layout/PromptStyleFacetForActionXml.java       |   57 -
 .../RedirectFacetFromActionLayoutAnnotation.java   |   47 -
 .../actions/layout/RedirectFacetFromActionXml.java |   43 -
 .../notcontributed/NotContributedFacet.java        |   40 -
 .../NotContributedFacetAbstract.java               |   73 --
 ...tributedFacetDerivedFromDomainServiceFacet.java |   47 -
 ...dFacetDerivedFromDomainServiceFacetFactory.java |   58 -
 .../NotContributedFacetDerivedFromMixinFacet.java  |   37 -
 ...ntributedFacetDerivedFromMixinFacetFactory.java |   52 -
 .../notinservicemenu/NotInServiceMenuFacet.java    |   38 -
 .../NotInServiceMenuFacetAbstract.java             |   40 -
 ...viceMenuFacetDerivedFromDomainServiceFacet.java |   54 -
 ...uFacetDerivedFromDomainServiceFacetFactory.java |   59 --
 .../actions/position/ActionPositionFacet.java      |   44 -
 .../position/ActionPositionFacetAbstract.java      |   57 -
 .../position/ActionPositionFacetFallback.java      |   31 -
 .../facets/actions/prototype/PrototypeFacet.java   |   30 -
 .../actions/prototype/PrototypeFacetAbstract.java  |   56 -
 .../actions/publish/PublishedActionFacet.java      |   30 -
 .../publish/PublishedActionFacetAbstract.java      |   38 -
 .../facets/actions/redirect/RedirectFacet.java     |   33 -
 .../actions/redirect/RedirectFacetAbstract.java    |   66 --
 .../actions/redirect/RedirectFacetFallback.java    |   31 -
 .../actions/semantics/ActionSemanticsFacet.java    |   33 -
 .../semantics/ActionSemanticsFacetAbstract.java    |   39 -
 .../validate/ActionParameterValidationFacet.java   |   45 -
 .../ActionParameterValidationFacetAbstract.java    |   47 -
 .../actions/validate/ActionValidationFacet.java    |   49 -
 .../validate/ActionValidationFacetAbstract.java    |   47 -
 .../ActionParameterValidationFacetViaMethod.java   |   84 --
 .../method/ActionValidationFacetViaMethod.java     |   84 --
 .../ActionValidationFacetViaMethodFactory.java     |  117 --
 .../facets/all/deficiencies/DeficiencyFacet.java   |  134 ---
 .../facets/all/describedas/DescribedAsFacet.java   |   33 -
 .../all/describedas/DescribedAsFacetAbstract.java  |   36 -
 .../isis/metamodel/facets/all/help/HelpFacet.java  |   29 -
 .../facets/all/help/HelpFacetAbstract.java         |   36 -
 .../metamodel/facets/all/hide/HiddenFacet.java     |   31 -
 .../all/i18n/DescribedAsFacetTranslated.java       |   64 --
 .../facets/all/i18n/NamedFacetTranslated.java      |   72 --
 .../facets/all/i18n/PluralFacetTranslated.java     |   55 -
 .../facets/all/i18n/TranslationFacetFactory.java   |  119 ---
 .../metamodel/facets/all/named/NamedFacet.java     |   42 -
 .../facets/all/named/NamedFacetAbstract.java       |   59 --
 .../facets/all/named/NamedFacetInferred.java       |   31 -
 .../collections/CollectionFacetAbstract.java       |   40 -
 .../CollectionAccessorFacetViaAccessor.java        |  109 --
 .../CollectionAccessorFacetViaAccessorFactory.java |  112 --
 .../clear/CollectionClearFacetFactory.java         |   70 --
 .../clear/CollectionClearFacetViaAccessor.java     |   79 --
 .../clear/CollectionClearFacetViaClearMethod.java  |   70 --
 .../CollectionAnnotationFacetFactory.java          |  293 -----
 .../collection/defaultview/DefaultViewFacet.java   |   26 -
 .../defaultview/DefaultViewFacetAbstract.java      |   35 -
 .../DisabledFacetForCollectionAnnotation.java      |   69 --
 .../hidden/HiddenFacetForCollectionAnnotation.java |   56 -
 ...ectionAddToFacetForDomainEventFromAbstract.java |  124 ---
 ...acetForDomainEventFromCollectionAnnotation.java |   43 -
 ...lectionAddToFacetForDomainEventFromDefault.java |   41 -
 .../modify/CollectionDomainEventFacet.java         |   34 -
 .../modify/CollectionDomainEventFacetAbstract.java |  145 ---
 .../modify/CollectionDomainEventFacetDefault.java  |   32 -
 ...ionDomainEventFacetForCollectionAnnotation.java |   45 -
 ...nRemoveFromFacetForDomainEventFromAbstract.java |  123 ---
 ...acetForDomainEventFromCollectionAnnotation.java |   43 -
 ...onRemoveFromFacetForDomainEventFromDefault.java |   41 -
 .../NotPersistedFacetForCollectionAnnotation.java  |   55 -
 ...fFacetOnCollectionFromCollectionAnnotation.java |   47 -
 ...abledFacetOnCollectionDerivedFromImmutable.java |   39 -
 ...cetOnCollectionDerivedFromImmutableFactory.java |   45 -
 .../javautilcollection/CollectionFacetFactory.java |   86 --
 .../javautilcollection/JavaArrayFacet.java         |   84 --
 .../javautilcollection/JavaCollectionFacet.java    |   78 --
 .../layout/CollectionLayoutFacetFactory.java       |  123 ---
 ...CssClassFacetForCollectionLayoutAnnotation.java |   45 -
 .../layout/CssClassFacetForCollectionXml.java      |   42 -
 ...aultViewFacetForCollectionLayoutAnnotation.java |   48 -
 .../layout/DefaultViewFacetForCollectionXml.java   |   42 -
 ...cribedAsFacetForCollectionLayoutAnnotation.java |   45 -
 .../layout/DescribedAsFacetForCollectionXml.java   |   42 -
 .../HiddenFacetForCollectionLayoutAnnotation.java  |   58 -
 .../layout/HiddenFacetForCollectionXml.java        |   51 -
 .../NamedFacetForCollectionLayoutAnnotation.java   |   52 -
 .../layout/NamedFacetForCollectionXml.java         |   47 -
 .../PagedFacetForCollectionLayoutAnnotation.java   |   46 -
 .../layout/PagedFacetForCollectionXml.java         |   41 -
 ...SortedByFacetForCollectionLayoutAnnotation.java |   53 -
 .../layout/SortedByFacetForCollectionXml.java      |   56 -
 .../collections/modify/CollectionAddToFacet.java   |   37 -
 .../modify/CollectionAddToFacetAbstract.java       |   36 -
 .../modify/CollectionAddToFacetViaAccessor.java    |   77 --
 .../modify/CollectionAddToFacetViaMethod.java      |   74 --
 ...tionAddToRemoveFromAndValidateFacetFactory.java |  177 ----
 .../collections/modify/CollectionClearFacet.java   |   36 -
 .../modify/CollectionClearFacetAbstract.java       |   36 -
 .../facets/collections/modify/CollectionFacet.java |  112 --
 .../modify/CollectionRemoveFromFacet.java          |   39 -
 .../modify/CollectionRemoveFromFacetAbstract.java  |   36 -
 .../CollectionRemoveFromFacetViaAccessor.java      |   80 --
 .../modify/CollectionRemoveFromFacetViaMethod.java |   74 --
 .../TypeOfFacetInferredFromSupportingMethods.java  |   31 -
 .../parented/ParentedCollectionFacetDefault.java   |   37 -
 .../ParentedFacetSinceCollectionFactory.java       |   53 -
 .../facets/collections/sortedby/SortedByFacet.java |   32 -
 .../sortedby/SortedByFacetAbstract.java            |   38 -
 .../annotation/SortedByFacetAnnotationFactory.java |   91 --
 .../validate/CollectionValidateAddToFacet.java     |   40 -
 .../CollectionValidateAddToFacetAbstract.java      |   48 -
 .../CollectionValidateAddToFacetViaMethod.java     |   82 --
 .../CollectionValidateRemoveFromFacet.java         |   39 -
 .../CollectionValidateRemoveFromFacetAbstract.java |   47 -
 ...CollectionValidateRemoveFromFacetViaMethod.java |   83 --
 .../collparam/semantics/CollectionSemantics.java   |  125 ---
 .../semantics/CollectionSemanticsFacet.java        |   29 -
 .../semantics/CollectionSemanticsFacetDefault.java |   47 -
 .../facets/fallback/ActionChoicesFacetNone.java    |   45 -
 .../facets/fallback/ActionDefaultsFacetNone.java   |   42 -
 .../facets/fallback/DescribedAsFacetNone.java      |   39 -
 .../facets/fallback/FallbackFacetFactory.java      |  144 ---
 .../metamodel/facets/fallback/HelpFacetNone.java   |   44 -
 .../LabelAtFacetFromLayoutConfiguration.java       |   30 -
 .../facets/fallback/MaxLengthFacetUnlimited.java   |   46 -
 .../facets/fallback/MultiLineFacetNone.java        |   36 -
 .../facets/fallback/NamedFacetDefault.java         |   33 -
 .../metamodel/facets/fallback/NamedFacetNone.java  |   44 -
 .../fallback/PagedFacetFromConfiguration.java      |   29 -
 .../metamodel/facets/fallback/TitleFacetNone.java  |   42 -
 .../metamodel/facets/jaxb/JaxbFacetFactory.java    |  399 -------
 .../facets/jaxb/XmlAccessorTypeFacet.java          |   31 -
 .../facets/jaxb/XmlAccessorTypeFacetAbstract.java  |   40 -
 .../facets/jaxb/XmlAccessorTypeFacetDefault.java   |   33 -
 .../facets/jaxb/XmlJavaTypeAdapterFacet.java       |   29 -
 .../jaxb/XmlJavaTypeAdapterFacetAbstract.java      |   38 -
 .../jaxb/XmlJavaTypeAdapterFacetDefault.java       |   31 -
 .../metamodel/facets/jaxb/XmlTransientFacet.java   |   29 -
 .../facets/jaxb/XmlTransientFacetAbstract.java     |   37 -
 .../facets/jaxb/XmlTransientFacetDefault.java      |   30 -
 .../facets/members/cssclass/CssClassFacet.java     |   37 -
 .../members/cssclass/CssClassFacetAbstract.java    |   51 -
 .../members/cssclass/CssClassFacetAbstract2.java   |   36 -
 .../CssClassFacetOnActionFromConfiguredRegex.java  |   30 -
 ...assFacetOnActionFromConfiguredRegexFactory.java |  120 ---
 .../facets/members/cssclassfa/CssClassFaFacet.java |   37 -
 .../cssclassfa/CssClassFaFacetAbstract.java        |   79 --
 .../members/cssclassfa/CssClassFaPosition.java     |  104 --
 .../annotprop/CssClassFaFacetOnMemberFactory.java  |  103 --
 ...CssClassFaFacetOnMemberFromConfiguredRegex.java |   31 -
 .../CssClassFaFacetOnMemberFromProperties.java     |   40 -
 .../cssclassfa/annotprop/MixinInterceptor.java     |   64 --
 .../DescribedAsFacetOnMemberDerivedFromType.java   |   32 -
 .../annotprop/DescribedAsFacetOnMemberFactory.java |   64 --
 .../DescribedAsFacetOnMemberFromProperties.java    |   37 -
 .../facets/members/disabled/DisabledFacet.java     |   54 -
 .../members/disabled/DisabledFacetAbstract.java    |  102 --
 .../DisabledFacetAbstractAlwaysEverywhere.java     |   40 -
 .../disabled/DisabledFacetAbstractImpl.java        |   83 --
 .../disabled/DisabledFacetForContributee.java      |   30 -
 .../disabled/method/DisableForContextFacet.java    |   37 -
 .../method/DisableForContextFacetAbstract.java     |   37 -
 .../method/DisableForContextFacetNone.java         |   49 -
 .../method/DisableForContextFacetViaMethod.java    |  100 --
 .../DisableForContextFacetViaMethodFactory.java    |   94 --
 .../facets/members/hidden/HiddenFacetAbstract.java |   84 --
 .../HiddenFacetAbstractAlwaysEverywhere.java       |   50 -
 .../members/hidden/HiddenFacetAbstractImpl.java    |   52 -
 .../HiddenFacetFromLayoutPropertiesAbstract.java   |   53 -
 .../members/hidden/method/HideForContextFacet.java |   37 -
 .../hidden/method/HideForContextFacetAbstract.java |   37 -
 .../hidden/method/HideForContextFacetNone.java     |   45 -
 .../method/HideForContextFacetViaMethod.java       |   78 --
 .../HideForContextFacetViaMethodFactory.java       |   82 --
 .../facets/members/order/MemberOrderFacet.java     |   59 --
 .../members/order/MemberOrderFacetAbstract.java    |  107 --
 .../annotprop/MemberOrderFacetAnnotation.java      |   35 -
 .../order/annotprop/MemberOrderFacetFactory.java   |   69 --
 .../MemberOrderFacetForActionAnnotation.java       |   34 -
 .../annotprop/MemberOrderFacetProperties.java      |   49 -
 .../order/annotprop/MemberOrderFacetXml.java       |   35 -
 .../ViewModelSemanticCheckingFacetFactory.java     |  209 ----
 .../facets/object/audit/AuditableFacet.java        |   40 -
 .../object/audit/AuditableFacetAbstract.java       |   61 --
 .../facets/object/audit/AuditableFacetImpl.java    |   30 -
 .../object/autocomplete/AutoCompleteFacet.java     |   35 -
 .../autocomplete/AutoCompleteFacetAbstract.java    |  126 ---
 .../object/bookmarkpolicy/BookmarkPolicyFacet.java |   31 -
 .../BookmarkPolicyFacetAbstract.java               |   59 --
 .../BookmarkPolicyFacetFallback.java               |   32 -
 .../BookmarkPolicyFacetFallbackFactory.java        |   88 --
 .../facets/object/callbacks/CallbackFacet.java     |   53 -
 .../object/callbacks/CallbackFacetAbstract.java    |   35 -
 .../object/callbacks/CreatedCallbackFacet.java     |   36 -
 .../callbacks/CreatedCallbackFacetAbstract.java    |   35 -
 .../callbacks/CreatedCallbackFacetFactory.java     |   51 -
 .../callbacks/CreatedCallbackFacetViaMethod.java   |   70 --
 .../callbacks/CreatedLifecycleEventFacet.java      |   30 -
 ...fecycleEventFacetForDomainObjectAnnotation.java |   46 -
 .../object/callbacks/LifecycleEventFacet.java      |   28 -
 .../object/callbacks/LoadCallbackFacetFactory.java |   65 --
 .../object/callbacks/LoadedCallbackFacet.java      |   37 -
 .../callbacks/LoadedCallbackFacetAbstract.java     |   35 -
 .../callbacks/LoadedCallbackFacetViaMethod.java    |   71 --
 .../callbacks/LoadedLifecycleEventFacet.java       |   30 -
 ...fecycleEventFacetForDomainObjectAnnotation.java |   44 -
 .../object/callbacks/LoadingCallbackFacet.java     |   28 -
 .../callbacks/LoadingCallbackFacetAbstract.java    |   39 -
 .../callbacks/LoadingCallbackFacetViaMethod.java   |   75 --
 .../callbacks/PersistCallbackFacetFactory.java     |   78 --
 .../PersistCallbackViaSaveMethodFacetFactory.java  |   78 --
 .../object/callbacks/PersistedCallbackFacet.java   |   36 -
 .../callbacks/PersistedCallbackFacetAbstract.java  |   35 -
 .../callbacks/PersistedCallbackFacetViaMethod.java |   71 --
 .../callbacks/PersistedLifecycleEventFacet.java    |   30 -
 ...fecycleEventFacetForDomainObjectAnnotation.java |   44 -
 .../object/callbacks/PersistingCallbackFacet.java  |   37 -
 .../callbacks/PersistingCallbackFacetAbstract.java |   35 -
 .../PersistingCallbackFacetViaMethod.java          |   71 --
 .../callbacks/PersistingLifecycleEventFacet.java   |   30 -
 ...fecycleEventFacetForDomainObjectAnnotation.java |   45 -
 .../callbacks/RemoveCallbackFacetFactory.java      |   81 --
 .../RemoveCallbackViaDeleteMethodFacetFactory.java |   81 --
 .../object/callbacks/RemovedCallbackFacet.java     |   35 -
 .../callbacks/RemovedCallbackFacetAbstract.java    |   39 -
 .../callbacks/RemovedCallbackFacetViaMethod.java   |   75 --
 .../object/callbacks/RemovingCallbackFacet.java    |   34 -
 .../callbacks/RemovingCallbackFacetAbstract.java   |   35 -
 .../callbacks/RemovingCallbackFacetViaMethod.java  |   71 --
 .../callbacks/RemovingLifecycleEventFacet.java     |   30 -
 ...fecycleEventFacetForDomainObjectAnnotation.java |   45 -
 .../callbacks/UpdateCallbackFacetFactory.java      |   68 --
 .../object/callbacks/UpdatedCallbackFacet.java     |   37 -
 .../callbacks/UpdatedCallbackFacetAbstract.java    |   35 -
 .../callbacks/UpdatedCallbackFacetViaMethod.java   |   71 --
 .../callbacks/UpdatedLifecycleEventFacet.java      |   30 -
 ...fecycleEventFacetForDomainObjectAnnotation.java |   45 -
 .../object/callbacks/UpdatingCallbackFacet.java    |   37 -
 .../callbacks/UpdatingCallbackFacetAbstract.java   |   35 -
 .../callbacks/UpdatingCallbackFacetViaMethod.java  |   71 --
 .../callbacks/UpdatingLifecycleEventFacet.java     |   30 -
 ...fecycleEventFacetForDomainObjectAnnotation.java |   45 -
 .../choices/ChoicesFacetFromBoundedAbstract.java   |  119 ---
 .../facets/object/choices/ChoicesFacetUtils.java   |   42 -
 .../facets/object/choices/QueryFindAllChoices.java |   57 -
 .../object/choices/enums/ChoicesFacetEnum.java     |   49 -
 .../facets/object/choices/enums/EnumFacet.java     |   26 -
 ...ingValueFacetUsingSemanticsProviderFactory.java |   49 -
 .../choices/enums/EnumValueSemanticsProvider.java  |  152 ---
 .../cssclass/method/CssClassFacetMethod.java       |   61 --
 .../method/CssClassFacetMethodFactory.java         |   52 -
 ...ssClassFaFacetForDomainObjectLayoutFactory.java |   43 -
 .../CssClassFaFacetForViewModelLayoutFactory.java  |   45 -
 .../facets/object/defaults/DefaultedFacet.java     |   47 -
 .../object/defaults/DefaultedFacetAbstract.java    |   84 --
 .../DefaultedFacetUsingDefaultsProvider.java       |   47 -
 .../object/defaults/DefaultsProviderUtil.java      |   75 --
 .../annotcfg/DefaultedFacetAnnotation.java         |   62 --
 ...tedFacetAnnotationElseConfigurationFactory.java |   71 --
 .../annotcfg/DefaultedFacetFromConfiguration.java  |   31 -
 .../object/disabled/DisabledObjectFacet.java       |   54 -
 .../disabled/DisabledObjectFacetAbstract.java      |   52 -
 .../method/DisabledObjectFacetViaMethod.java       |   93 --
 .../DisabledObjectFacetViaMethodFactory.java       |   88 --
 .../DomainObjectAnnotationFacetFactory.java        |  570 ----------
 .../AuditableFacetForDomainObjectAnnotation.java   |   74 --
 ...FacetForDomainObjectAnnotationAsConfigured.java |   31 -
 .../auditing/AuditableFacetFromConfiguration.java  |   36 -
 ...AutoCompleteFacetForDomainObjectAnnotation.java |   46 -
 .../ChoicesFacetForDomainObjectAnnotation.java     |   49 -
 ...EventDefaultFacetForDomainObjectAnnotation.java |   52 -
 ...EventDefaultFacetForDomainObjectAnnotation.java |   51 -
 ...EventDefaultFacetForDomainObjectAnnotation.java |   51 -
 .../ImmutableFacetForDomainObjectAnnotation.java   |  101 --
 ...FacetForDomainObjectAnnotationAsConfigured.java |   30 -
 .../editing/ImmutableFacetFromConfiguration.java   |   58 -
 ...ObjectSpecIdFacetForDomainObjectAnnotation.java |   47 -
 ...lishedObjectFacetForDomainObjectAnnotation.java |   67 --
 ...FacetForDomainObjectAnnotationAsConfigured.java |   30 -
 .../PublishedObjectFacetFromConfiguration.java     |   31 -
 ...atableObjectFacetForDomainObjectAnnotation.java |   73 --
 ...PolicyFacetForDomainObjectLayoutAnnotation.java |   46 -
 .../BookmarkPolicyFacetForDomainObjectXml.java     |   42 -
 ...arkPolicyFacetForViewModelLayoutAnnotation.java |   47 -
 ...lassFaFacetForDomainObjectLayoutAnnotation.java |   55 -
 .../CssClassFaFacetForDomainObjectXml.java         |   44 -
 ...ssClassFaFacetForViewModelLayoutAnnotation.java |   54 -
 ...sClassFacetForDomainObjectLayoutAnnotation.java |   57 -
 .../CssClassFacetForDomainObjectXml.java           |   42 -
 .../CssClassFacetForViewModelLayoutAnnotation.java |   45 -
 ...ObjectLayoutAnnotationUsingCssClassUiEvent.java |  121 ---
 ...wModelLayoutAnnotationUsingCssClassUiEvent.java |  118 ---
 ...ibedAsFacetForDomainObjectLayoutAnnotation.java |   46 -
 .../DescribedAsFacetForDomainObjectXml.java        |   42 -
 ...scribedAsFacetForViewModelLayoutAnnotation.java |   47 -
 .../DomainObjectLayoutFacetFactory.java            |  113 --
 ...mainObjectLayoutAnnotationUsingIconUiEvent.java |  117 --
 ...aViewModelLayoutAnnotationUsingIconUiEvent.java |  118 ---
 ...inObjectLayoutAnnotationUsingLayoutUiEvent.java |  118 ---
 ...iewModelLayoutAnnotationUsingLayoutUiEvent.java |  117 --
 .../NamedFacetForDomainObjectLayoutAnnotation.java |   47 -
 .../NamedFacetForDomainObjectXml.java              |   44 -
 .../NamedFacetForViewModelLayoutAnnotation.java    |   45 -
 .../PagedFacetForDomainObjectLayoutAnnotation.java |   46 -
 .../PagedFacetForViewModelLayoutAnnotation.java    |   46 -
 ...PluralFacetForDomainObjectLayoutAnnotation.java |   47 -
 .../PluralFacetForDomainObjectXml.java             |   40 -
 .../PluralFacetForViewModelLayoutAnnotation.java   |   47 -
 ...ainObjectLayoutAnnotationUsingTitleUiEvent.java |  135 ---
 ...ViewModelLayoutAnnotationUsingTitleUiEvent.java |  135 ---
 .../object/domainservice/DomainServiceFacet.java   |   52 -
 .../domainservice/DomainServiceFacetAbstract.java  |   65 --
 .../annotation/DomainServiceFacetAnnotation.java   |   35 -
 .../DomainServiceFacetAnnotationFactory.java       |  153 ---
 ...conFacetDerivedFromDomainServiceAnnotation.java |   47 -
 .../DomainServiceLayoutFacet.java                  |   36 -
 .../DomainServiceLayoutFacetAbstract.java          |   54 -
 .../DomainServiceLayoutFacetFactory.java           |   70 --
 ...NamedFacetForDomainServiceLayoutAnnotation.java |   36 -
 .../DomainServiceLayoutFacetAnnotation.java        |   34 -
 .../facets/object/encodeable/EncodableFacet.java   |   42 -
 .../object/encodeable/EncodableFacetAbstract.java  |   85 --
 .../object/encodeable/EncoderDecoderUtil.java      |   36 -
 .../annotcfg/EncodableFacetFromConfiguration.java  |   33 -
 .../encoder/EncodableFacetUsingEncoderDecoder.java |   75 --
 .../facets/object/entity/EntityFacet.java          |   54 -
 .../facets/object/facets/FacetsFacet.java          |   48 -
 .../facets/object/facets/FacetsFacetAbstract.java  |   94 --
 .../facets/annotation/FacetsFacetAnnotation.java   |   32 -
 .../annotation/FacetsFacetAnnotationFactory.java   |   54 -
 .../metamodel/facets/object/grid/GridFacet.java    |   41 -
 .../facets/object/grid/GridFacetDefault.java       |   84 --
 .../facets/object/grid/GridFacetFactory.java       |   46 -
 .../facets/object/hidden/HiddenObjectFacet.java    |   55 -
 .../object/hidden/HiddenObjectFacetAbstract.java   |   50 -
 .../hidden/method/HiddenObjectFacetViaMethod.java  |   65 --
 .../method/HiddenObjectFacetViaMethodFactory.java  |   90 --
 .../metamodel/facets/object/icon/IconFacet.java    |   44 -
 .../facets/object/icon/IconFacetAbstract.java      |   36 -
 .../facets/object/icon/method/IconFacetMethod.java |   52 -
 .../object/icon/method/IconFacetMethodFactory.java |   53 -
 .../RemoveAnnotatedMethodsFacetFactory.java        |   99 --
 ...oveDatanucleusPersistableTypesFacetFactory.java |   67 --
 .../RemoveDnPrefixedMethodsFacetFactory.java       |   46 -
 .../javalang/IteratorFilteringFacetFactory.java    |   55 -
 .../ignore/javalang/RemoveMethodsFacetFactory.java |  132 ---
 .../jdo/RemoveJdoEnhancementTypesFacetFactory.java |   66 --
 .../jdo/RemoveJdoPrefixedMethodsFacetFactory.java  |   48 -
 .../facets/object/immutable/ImmutableFacet.java    |   69 --
 .../object/immutable/ImmutableFacetAbstract.java   |   60 --
 .../CopyImmutableFacetOntoMembersFactory.java      |   45 -
 .../facets/object/layout/LayoutFacet.java          |   37 -
 .../facets/object/layout/LayoutFacetAbstract.java  |   41 -
 .../facets/object/layout/LayoutFacetFactory.java   |   56 -
 .../facets/object/layout/LayoutFacetFallback.java  |   43 -
 .../facets/object/layout/LayoutFacetMethod.java    |   54 -
 .../mixin/MetaModelValidatorForMixinTypes.java     |   55 -
 .../metamodel/facets/object/mixin/MixinFacet.java  |   74 --
 .../facets/object/mixin/MixinFacetAbstract.java    |  143 ---
 .../mixin/MixinFacetForDomainObjectAnnotation.java |   72 --
 .../object/mixin/MixinFacetForMixinAnnotation.java |   64 --
 .../mixin/MixinFacetForMixinAnnotationFactory.java |   64 --
 .../object/navparent/NavigableParentFacet.java     |   43 -
 .../navparent/NavigableParentFacetAbstract.java    |   36 -
 .../NavigableParentAnnotationFacetFactory.java     |  161 ---
 .../method/NavigableParentFacetMethod.java         |   60 --
 .../object/objectspecid/ObjectSpecIdFacet.java     |   33 -
 .../objectspecid/ObjectSpecIdFacetAbstract.java    |   66 --
 .../ObjectSpecIdFacetDerivedFromClassName.java     |   35 -
 ...jectSpecIdFacetDerivedFromClassNameFactory.java |  205 ----
 ...ectSpecIdFacetDerivedFromIoCNamingStrategy.java |   34 -
 .../ObjectSpecIdFacetOnStandaloneList.java         |   31 -
 .../ObjectValidPropertiesFacet.java                |   42 -
 .../ObjectValidPropertiesFacetAbstract.java        |   48 -
 .../impl/ObjectValidPropertiesFacetImpl.java       |   70 --
 .../ObjectValidPropertiesFacetImplFactory.java     |   35 -
 .../metamodel/facets/object/paged/PagedFacet.java  |   31 -
 .../facets/object/paged/PagedFacetAbstract.java    |   50 -
 .../PagedFacetForPagedAnnotationOnType.java        |   34 -
 .../object/parented/ParentedCollectionFacet.java   |   40 -
 .../parented/ParentedCollectionFacetAbstract.java  |   36 -
 .../object/parseable/InvalidEntryException.java    |   42 -
 .../facets/object/parseable/ParseableFacet.java    |   55 -
 .../object/parseable/ParseableFacetAbstract.java   |   90 --
 .../facets/object/parseable/ParserUtil.java        |   46 -
 .../object/parseable/TextEntryParseException.java  |   47 -
 .../annotcfg/ParseableFacetFromConfiguration.java  |   33 -
 .../parser/ParseableFacetUsingParser.java          |  132 ---
 .../facets/object/plural/PluralFacet.java          |   41 -
 .../facets/object/plural/PluralFacetAbstract.java  |   41 -
 .../plural/inferred/PluralFacetInferred.java       |   31 -
 .../facets/object/projection/ProjectionFacet.java  |   29 -
 .../object/projection/ProjectionFacetAbstract.java |   42 -
 .../ProjectionFacetFromProjectingProperty.java     |   65 --
 .../CssClassFacetDerivedFromProjectionFacet.java   |   54 -
 .../ident/IconFacetDerivedFromProjectionFacet.java |   52 -
 .../TitleFacetDerivedFromProjectionFacet.java      |   52 -
 .../object/promptStyle/PromptStyleFacet.java       |   33 -
 .../promptStyle/PromptStyleFacetAbstract.java      |   42 -
 .../promptStyle/PromptStyleFacetAsConfigured.java  |   45 -
 .../PromptStyleFacetFallBackToInline.java          |   37 -
 .../publishedobject/PublishedObjectFacet.java      |   30 -
 .../PublishedObjectFacetAbstract.java              |   38 -
 ...etOnCollectionDerivedFromRecreatableObject.java |   46 -
 ...CollectionDerivedFromViewModelFacetFactory.java |   54 -
 ...acetOnPropertyDerivedFromRecreatableObject.java |   48 -
 ...tyDerivedFromRecreatableObjectFacetFactory.java |   52 -
 .../RecreatableObjectFacetAbstract.java            |  129 ---
 ...ObjectFacetDeclarativeInitializingAbstract.java |  145 ---
 .../recreatable/RecreatableObjectFacetFactory.java |  131 ---
 ...ctFacetForRecreatableDomainObjectInterface.java |   46 -
 ...eObjectFacetForRecreatableObjectAnnotation.java |   34 -
 ...leObjectFacetForRecreatableObjectInterface.java |   45 -
 ...creatableObjectFacetForViewModelAnnotation.java |   35 -
 ...ableObjectFacetForXmlRootElementAnnotation.java |   81 --
 .../metamodel/facets/object/recreatable/Util.java  |   33 -
 .../metamodel/facets/object/title/TitleFacet.java  |   55 -
 .../facets/object/title/TitleFacetAbstract.java    |   45 -
 .../annotation/TitleAnnotationFacetFactory.java    |  187 ----
 .../annotation/TitleFacetViaTitleAnnotation.java   |  169 ---
 .../title/methods/TitleFacetViaMethodsFactory.java |   95 --
 .../title/methods/TitleFacetViaTitleMethod.java    |   93 --
 .../title/methods/TitleFacetViaToStringMethod.java |   70 --
 .../object/title/parser/TitleFacetUsingParser.java |   79 --
 .../validateobject/ValidateObjectFacet.java        |   55 -
 .../ValidateObjectFacetAbstract.java               |   49 -
 .../method/ValidateObjectFacetMethod.java          |   80 --
 .../method/ValidateObjectFacetMethodFactory.java   |   61 --
 .../facets/object/value/EqualByContentFacet.java   |   33 -
 .../object/value/EqualByContentFacetAbstract.java  |   36 -
 .../EqualByContentFacetViaValueSemantics.java      |   30 -
 .../value/ImmutableFacetViaValueSemantics.java     |   39 -
 .../object/value/MaxLengthFacetUsingParser.java    |   58 -
 .../value/TypicalLengthFacetUsingParser.java       |   53 -
 .../metamodel/facets/object/value/ValueFacet.java  |   35 -
 .../facets/object/value/ValueFacetAbstract.java    |  155 ---
 .../facets/object/value/ValueFacetSimple.java      |   37 -
 .../value/annotcfg/ValueFacetAnnotation.java       |   81 --
 ...ValueFacetAnnotationOrConfigurationFactory.java |  113 --
 .../annotcfg/ValueFacetFromConfiguration.java      |   38 -
 .../vsp/ValueFacetUsingSemanticsProvider.java      |   41 -
 .../ValueFacetUsingSemanticsProviderFactory.java   |   46 -
 .../ValueSemanticsProviderAndFacetAbstract.java    |  328 ------
 .../value/vsp/ValueSemanticsProviderUtil.java      |   67 --
 .../facets/object/viewmodel/ViewModelFacet.java    |  125 ---
 .../facets/object/wizard/WizardFacet.java          |   41 -
 .../facets/object/wizard/WizardFacetAbstract.java  |   36 -
 .../facets/objectvalue/choices/ChoicesFacet.java   |   49 -
 .../objectvalue/choices/ChoicesFacetAbstract.java  |   36 -
 .../objectvalue/fileaccept/FileAcceptFacet.java    |   35 -
 .../fileaccept/FileAcceptFacetAbstract.java        |   37 -
 .../facets/objectvalue/labelat/LabelAtFacet.java   |   36 -
 .../objectvalue/labelat/LabelAtFacetAbstract.java  |   56 -
 .../LabelAtFacetInferredFromMultiLineFacet.java    |   38 -
 .../objectvalue/mandatory/MandatoryFacet.java      |   57 -
 .../mandatory/MandatoryFacetAbstract.java          |  110 --
 .../mandatory/MandatoryFacetDefault.java           |   43 -
 .../facets/objectvalue/maxlen/MaxLengthFacet.java  |   41 -
 .../objectvalue/maxlen/MaxLengthFacetAbstract.java |   75 --
 .../objectvalue/multiline/MultiLineFacet.java      |   51 -
 .../multiline/MultiLineFacetAbstract.java          |   63 --
 .../MustSatisfySpecificationFacet.java             |   27 -
 .../MustSatisfySpecificationFacetAbstract.java     |  124 ---
 .../mustsatisfyspec/SpecificationEvaluator.java    |   80 --
 .../facets/objectvalue/regex/RegExFacet.java       |   38 -
 .../objectvalue/regex/RegExFacetAbstract.java      |  104 --
 .../renderedadjusted/RenderedAdjustedFacet.java    |   39 -
 .../RenderedAdjustedFacetAbstract.java             |   56 -
 .../objectvalue/typicallen/TypicalLengthFacet.java |   40 -
 .../typicallen/TypicalLengthFacetAbstract.java     |   45 -
 .../ActionParameterAutoCompleteFacet.java          |   47 -
 .../ActionParameterAutoCompleteFacetAbstract.java  |   41 -
 .../facets/param/autocomplete/MinLengthUtil.java   |   56 -
 .../ActionParameterAutoCompleteFacetViaMethod.java |  121 ---
 ...ParameterAutoCompleteFacetViaMethodFactory.java |   88 --
 ...ameterFromJavaxValidationAnnotationFactory.java |   56 -
 ...rameterFromJavaxValidationDigitsAnnotation.java |   59 --
 .../facets/param/choices/ActionChoicesFacet.java   |   38 -
 .../param/choices/ActionChoicesFacetAbstract.java  |   36 -
 .../param/choices/ActionParameterChoicesFacet.java |   42 -
 .../ActionParameterChoicesFacetAbstract.java       |   38 -
 .../choices/ActionParameterChoicesFacetNone.java   |   48 -
 ...rameterChoicesFacetDerivedFromChoicesFacet.java |   55 -
 ...ChoicesFacetDerivedFromChoicesFacetFactory.java |   55 -
 .../method/ActionChoicesFacetViaMethod.java        |  121 ---
 .../method/ActionChoicesFacetViaMethodFactory.java |  100 --
 .../ActionParameterChoicesFacetViaMethod.java      |  108 --
 ...ctionParameterChoicesFacetViaMethodFactory.java |   99 --
 .../defaults/ActionParameterDefaultsFacet.java     |   41 -
 .../ActionParameterDefaultsFacetAbstract.java      |   36 -
 ...ParameterDefaultFacetDerivedFromTypeFacets.java |   60 --
 ...arameterDefaultFacetDerivedFromTypeFactory.java |   64 --
 .../ActionParameterDefaultsFacetViaMethod.java     |  117 --
 ...tionParameterDefaultsFacetViaMethodFactory.java |  134 ---
 ...ameterAnnotationElseDerivedFromTypeFactory.java |   55 -
 ...DescribedAsFacetOnParameterDerivedFromType.java |   32 -
 .../disable/ActionParameterDisabledFacet.java      |   41 -
 .../ActionParameterDisabledFacetAbstract.java      |   49 -
 .../ActionParameterDisabledFacetViaMethod.java     |   95 --
 ...tionParameterDisabledFacetViaMethodFactory.java |   94 --
 .../param/hide/ActionParameterHiddenFacet.java     |   42 -
 .../hide/ActionParameterHiddenFacetAbstract.java   |   55 -
 .../ActionParameterHiddenFacetViaMethod.java       |   82 --
 ...ActionParameterHiddenFacetViaMethodFactory.java |   91 --
 .../CssClassFacetForParameterLayoutAnnotation.java |   46 -
 ...scribedAsFacetForParameterLayoutAnnotation.java |   46 -
 .../LabelAtFacetForParameterLayoutAnnotation.java  |   47 -
 ...MultiLineFacetForParameterLayoutAnnotation.java |   45 -
 .../NamedFacetForParameterLayoutAnnotation.java    |   51 -
 .../param/layout/ParameterLayoutFacetFactory.java  |   58 -
 ...dAdjustedFacetForParameterLayoutAnnotation.java |   58 -
 ...calLengthFacetForParameterLayoutAnnotation.java |   60 --
 .../MandatoryFacetOnParametersDefaultFactory.java  |   56 -
 .../NamedFacetForParameterUsingReflection.java     |   34 -
 .../ParameterNameFacetFactoryUsingReflection.java  |   74 --
 .../parameter/ParameterAnnotationFacetFactory.java |  134 ---
 .../FileAcceptFacetForParameterAnnotation.java     |   47 -
 .../MandatoryFacetForParameterAnnotation.java      |   81 --
 ...cetInvertedByNullableAnnotationOnParameter.java |   59 --
 .../MaxLengthFacetForParameterAnnotation.java      |   46 -
 ...fySpecificationFacetForParameterAnnotation.java |   69 --
 .../regex/RegExFacetForParameterAnnotation.java    |   72 --
 .../RegExFacetForPatternAnnotationOnParameter.java |   66 --
 .../TypicalLengthFacetOnParameterAnnotation.java   |   50 -
 ...picalLengthFacetOnParameterDerivedFromType.java |   49 -
 ...acetOnParameterDerivedFromTypeFacetFactory.java |   56 -
 .../validate/ActionParameterValidationFacet.java   |   45 -
 .../ActionParameterValidationFacetAbstract.java    |   47 -
 .../ActionParameterValidationFacetViaMethod.java   |   84 --
 ...onParameterValidationFacetViaMethodFactory.java |   82 --
 .../PropertyOrCollectionAccessorFacet.java         |   53 -
 .../PropertyOrCollectionAccessorFacetAbstract.java |   57 -
 .../propcoll/notpersisted/NotPersistedFacet.java   |   38 -
 .../notpersisted/NotPersistedFacetAbstract.java    |   36 -
 .../accessor/PropertyAccessorFacetViaAccessor.java |   96 --
 .../PropertyAccessorFacetViaAccessorFactory.java   |  113 --
 .../autocomplete/PropertyAutoCompleteFacet.java    |   51 -
 .../PropertyAutoCompleteFacetAbstract.java         |   39 -
 .../method/PropertyAutoCompleteFacetMethod.java    |  114 --
 .../PropertyAutoCompleteFacetMethodFactory.java    |   79 --
 ...ropertyFromJavaxValidationDigitsAnnotation.java |   60 --
 ...FromJavaxValidationDigitsAnnotationFactory.java |   59 --
 .../properties/businesskey/BusinessKeyFacet.java   |   36 -
 .../businesskey/BusinessKeyFacetAbstract.java      |   36 -
 .../properties/choices/PropertyChoicesFacet.java   |   50 -
 .../choices/PropertyChoicesFacetAbstract.java      |   36 -
 ...ropertyChoicesFacetDerivedFromChoicesFacet.java |   52 -
 ...ChoicesFacetDerivedFromChoicesFacetFactory.java |   45 -
 .../method/PropertyChoicesFacetViaMethod.java      |   93 --
 .../PropertyChoicesFacetViaMethodFactory.java      |   77 --
 .../properties/defaults/PropertyDefaultFacet.java  |   46 -
 .../defaults/PropertyDefaultFacetAbstract.java     |   36 -
 .../defaults/PropertyDefaultFacetNone.java         |   44 -
 ...pertyDefaultFacetDerivedFromDefaultedFacet.java |   57 -
 ...PropertyDefaultFacetDerivedFromTypeFactory.java |   64 --
 .../method/PropertyDefaultFacetViaMethod.java      |   88 --
 .../PropertyDefaultFacetViaMethodFactory.java      |   77 --
 ...isabledFacetOnPropertyDerivedFromImmutable.java |   38 -
 ...FacetOnPropertyDerivedFromImmutableFactory.java |   52 -
 .../inferred/DisabledFacetOnPropertyInferred.java  |   32 -
 .../DisabledFacetOnPropertyInferredFactory.java    |   56 -
 .../MandatoryFacetOnProperyDefaultFactory.java     |   57 -
 .../MultiLineFacetOnPropertyAnnotation.java        |   35 -
 .../properties/projection/ProjectingFacet.java     |   30 -
 .../projection/ProjectingFacetAbstract.java        |   41 -
 .../ProjectingFacetFromPropertyAnnotation.java     |   70 --
 .../property/PropertyAnnotationFacetFactory.java   |  377 -------
 .../command/CommandFacetForPropertyAnnotation.java |   99 --
 ...mandFacetForPropertyAnnotationAsConfigured.java |   37 -
 .../DisabledFacetForPropertyAnnotation.java        |   65 --
 ...acetForPropertyAnnotationInvertedSemantics.java |   32 -
 .../FileAcceptFacetForPropertyAnnotation.java      |   47 -
 .../hidden/HiddenFacetForPropertyAnnotation.java   |   56 -
 .../MandatoryFacetForPropertyAnnotation.java       |   90 --
 ...acetInvertedByNullableAnnotationOnProperty.java |   61 --
 .../MaxLengthFacetForPropertyAnnotation.java       |   46 -
 ...ropertyClearFacetForDomainEventFromDefault.java |   41 -
 ...rFacetForDomainEventFromPropertyAnnotation.java |   41 -
 .../property/modify/PropertyDomainEventFacet.java  |   33 -
 .../modify/PropertyDomainEventFacetAbstract.java   |  167 ---
 .../modify/PropertyDomainEventFacetDefault.java    |   40 -
 ...pertyDomainEventFacetForPropertyAnnotation.java |   40 -
 ...opertySetterFacetForDomainEventFromDefault.java |   42 -
 ...rFacetForDomainEventFromPropertyAnnotation.java |   41 -
 ...tySetterOrClearFacetForDomainEventAbstract.java |  340 ------
 .../facets/properties/property/modify/Utils.java   |   23 -
 ...sfySpecificationFacetForPropertyAnnotation.java |   66 --
 .../NotPersistedFacetForPropertyAnnotation.java    |   46 -
 ...ublishedPropertyFacetForPropertyAnnotation.java |   79 --
 ...ertyFacetForPropertyAnnotationAsConfigured.java |   27 -
 .../PublishedPropertyFacetFromConfiguration.java   |   31 -
 .../RegExFacetForPatternAnnotationOnProperty.java  |   76 --
 .../regex/RegExFacetForPropertyAnnotation.java     |   70 --
 .../CssClassFacetForPropertyLayoutAnnotation.java  |   47 -
 .../CssClassFacetForPropertyXml.java               |   42 -
 ...escribedAsFacetForPropertyLayoutAnnotation.java |   47 -
 .../DescribedAsFacetForPropertyXml.java            |   42 -
 .../HiddenFacetForPropertyLayoutAnnotation.java    |   56 -
 .../propertylayout/HiddenFacetForPropertyXml.java  |   51 -
 .../LabelAtFacetForPropertyLayoutAnnotation.java   |   47 -
 .../propertylayout/LabelAtFacetForPropertyXml.java |   42 -
 .../MultiLineFacetForPropertyLayoutAnnotation.java |   46 -
 .../MultiLineFacetForPropertyXml.java              |   41 -
 .../NamedFacetForPropertyLayoutAnnotation.java     |   51 -
 .../propertylayout/NamedFacetForPropertyXml.java   |   47 -
 ...romptStyleFacetForPropertyLayoutAnnotation.java |   96 --
 .../PromptStyleFacetForPropertyXml.java            |   57 -
 .../propertylayout/PropertyLayoutFacetFactory.java |  194 ----
 ...edAdjustedFacetForPropertyLayoutAnnotation.java |   58 -
 .../RenderedAdjustedFacetForPropertyXml.java       |   45 -
 ...icalLengthFacetForPropertyLayoutAnnotation.java |   60 --
 .../TypicalLengthFacetForPropertyXml.java          |   56 -
 ...UnchangingFacetForPropertyLayoutAnnotation.java |   59 --
 .../UnchangingFacetForPropertyXml.java             |   42 -
 .../properties/publish/PublishedPropertyFacet.java |   29 -
 .../publish/PublishedPropertyFacetAbstract.java    |   38 -
 ...nderedAsDayBeforeFacetAnnotationOnProperty.java |   38 -
 .../renderunchanged/UnchangingFacet.java           |   30 -
 .../renderunchanged/UnchangingFacetAbstract.java   |   36 -
 .../properties/searchable/SearchableFacet.java     |   49 -
 .../searchable/SearchableFacetAbstract.java        |   51 -
 .../TypicalLengthFacetOnPropertyAnnotation.java    |   50 -
 ...ypicalLengthFacetOnPropertyDerivedFromType.java |   49 -
 ...FacetOnPropertyDerivedFromTypeFacetFactory.java |   55 -
 .../update/NotPersistableFacetInferred.java        |   31 -
 .../update/PropertyModifyFacetFactory.java         |   68 --
 .../update/PropertySetAndClearFacetFactory.java    |  122 ---
 .../update/clear/PropertyClearFacet.java           |   43 -
 .../update/clear/PropertyClearFacetAbstract.java   |   35 -
 .../clear/PropertyClearFacetViaClearMethod.java    |   74 --
 .../clear/PropertyClearFacetViaSetterMethod.java   |   75 --
 .../update/init/PropertyInitializationFacet.java   |   48 -
 .../init/PropertyInitializationFacetAbstract.java  |   35 -
 ...PropertyInitializationFacetViaSetterMethod.java |   70 --
 .../update/modify/PropertySetterFacet.java         |   49 -
 .../update/modify/PropertySetterFacetAbstract.java |   35 -
 .../modify/PropertySetterFacetViaModifyMethod.java |   81 --
 .../modify/PropertySetterFacetViaSetterMethod.java |   76 --
 .../validating/PropertyValidateFacet.java          |   50 -
 .../validating/PropertyValidateFacetAbstract.java  |   57 -
 .../validating/PropertyValidateFacetNone.java      |   47 -
 .../dflt/PropertyValidateFacetDefault.java         |   49 -
 .../dflt/PropertyValidateFacetDefaultFactory.java  |   58 -
 .../method/PropertyValidateFacetViaMethod.java     |   83 --
 .../PropertyValidateFacetViaMethodFactory.java     |   76 --
 .../DateAndTimeValueSemanticsProviderAbstract.java |  116 --
 .../isis/metamodel/facets/value/JodaFunctions.java |   43 -
 .../ValueSemanticsProviderAbstractTemporal.java    |  373 -------
 .../value/bigdecimal/BigDecimalValueFacet.java     |   60 --
 .../bigdecimal/BigDecimalValueFacetAbstract.java   |   37 -
 ...malValueFacetUsingSemanticsProviderFactory.java |   44 -
 .../BigDecimalValueSemanticsProvider.java          |  143 ---
 .../value/biginteger/BigIntegerValueFacet.java     |   26 -
 ...gerValueFacetUsingSemanticsProviderFactory.java |   43 -
 .../BigIntegerValueSemanticsProvider.java          |  110 --
 .../facets/value/blobs/BlobValueFacet.java         |   26 -
 ...lobValueFacetUsingSemanticsProviderFactory.java |   41 -
 .../value/blobs/BlobValueSemanticsProvider.java    |  123 ---
 ...iveValueFacetUsingSemanticsProviderFactory.java |   42 -
 .../BooleanPrimitiveValueSemanticsProvider.java    |   55 -
 .../facets/value/booleans/BooleanValueFacet.java   |   29 -
 .../BooleanValueSemanticsProviderAbstract.java     |  129 ---
 ...perValueFacetUsingSemanticsProviderFactory.java |   42 -
 .../BooleanWrapperValueSemanticsProvider.java      |   69 --
 ...iveValueFacetUsingSemanticsProviderFactory.java |   42 -
 .../bytes/BytePrimitiveValueSemanticsProvider.java |   52 -
 .../facets/value/bytes/ByteValueFacet.java         |   30 -
 .../bytes/ByteValueSemanticsProviderAbstract.java  |  116 --
 ...perValueFacetUsingSemanticsProviderFactory.java |   42 -
 .../bytes/ByteWrapperValueSemanticsProvider.java   |   41 -
 ...iveValueFacetUsingSemanticsProviderFactory.java |   42 -
 .../chars/CharPrimitiveValueSemanticsProvider.java |   54 -
 .../facets/value/chars/CharValueFacet.java         |   30 -
 .../chars/CharValueSemanticsProviderAbstract.java  |  103 --
 ...perValueFacetUsingSemanticsProviderFactory.java |   42 -
 .../chars/CharWrapperValueSemanticsProvider.java   |   41 -
 .../facets/value/clobs/ClobValueFacet.java         |   26 -
 ...lobValueFacetUsingSemanticsProviderFactory.java |   42 -
 .../value/clobs/ClobValueSemanticsProvider.java    |  117 --
 .../facets/value/date/DateValueFacet.java          |   33 -
 .../date/DateValueSemanticsProviderAbstract.java   |  121 ---
 .../value/datejdk8local/Jdk8LocalDateUtil.java     |  170 ---
 .../datejdk8local/Jdk8LocalDateValueFacet.java     |   33 -
 ...ateValueFacetUsingSemanticsProviderFactory.java |   45 -
 .../Jdk8LocalDateValueSemanticsProvider.java       |  257 -----
 .../facets/value/datejdk8local/TimeFormatter.java  |   27 -
 .../facets/value/datejdk8local/TimeParser.java     |   27 -
 .../value/datejodalocal/JodaLocalDateUtil.java     |  130 ---
 .../datejodalocal/JodaLocalDateValueFacet.java     |   33 -
 ...ateValueFacetUsingSemanticsProviderFactory.java |   45 -
 .../JodaLocalDateValueSemanticsProvider.java       |  257 -----
 ...ateValueFacetUsingSemanticsProviderFactory.java |   45 -
 .../datesql/JavaSqlDateValueSemanticsProvider.java |   98 --
 .../datetimejdk8local/Jdk8LocalDateTimeUtil.java   |  157 ---
 .../Jdk8LocalDateTimeValueFacet.java               |   33 -
 ...imeValueFacetUsingSemanticsProviderFactory.java |   45 -
 .../Jdk8LocalDateTimeValueSemanticsProvider.java   |  275 -----
 .../value/datetimejdk8local/TimeFormatter.java     |   27 -
 .../facets/value/datetimejdk8local/TimeParser.java |   27 -
 .../Jdk8OffsetDateTimeValueFacet.java              |   33 -
 ...imeValueFacetUsingSemanticsProviderFactory.java |   45 -
 .../Jdk8OffsetDateTimeValueSemanticsProvider.java  |  103 --
 ...fsetDateTimeValueSemanticsProviderAbstract.java |  121 ---
 .../value/datetimejoda/JodaDateTimeValueFacet.java |   33 -
 ...imeValueFacetUsingSemanticsProviderFactory.java |   45 -
 .../JodaDateTimeValueSemanticsProvider.java        |  103 --
 ...JodaDateTimeValueSemanticsProviderAbstract.java |  121 ---
 .../datetimejodalocal/JodaLocalDateTimeUtil.java   |  127 ---
 .../JodaLocalDateTimeValueFacet.java               |   33 -
 ...imeValueFacetUsingSemanticsProviderFactory.java |   45 -
 .../JodaLocalDateTimeValueSemanticsProvider.java   |  259 -----
 ...ateValueFacetUsingSemanticsProviderFactory.java |   46 -
 .../JavaUtilDateValueSemanticsProvider.java        |   85 --
 .../doubles/DoubleFloatingPointValueFacet.java     |   30 -
 ...iveValueFacetUsingSemanticsProviderFactory.java |   42 -
 .../DoublePrimitiveValueSemanticsProvider.java     |   54 -
 .../DoubleValueSemanticsProviderAbstract.java      |  120 ---
 ...perValueFacetUsingSemanticsProviderFactory.java |   42 -
 .../DoubleWrapperValueSemanticsProvider.java       |   42 -
 ...iveValueFacetUsingSemanticsProviderFactory.java |   42 -
 .../FloatPrimitiveValueSemanticsProvider.java      |   54 -
 .../FloatValueSemanticsProviderAbstract.java       |  116 --
 ...perValueFacetUsingSemanticsProviderFactory.java |   42 -
 .../floats/FloatWrapperValueSemanticsProvider.java |   41 -
 .../value/floats/FloatingPointValueFacet.java      |   30 -
 .../facets/value/image/ImageValueFacet.java        |   34 -
 ...ageValueFacetUsingSemanticsProviderFactory.java |   43 -
 .../value/image/ImageValueSemanticsProvider.java   |  100 --
 .../image/ImageValueSemanticsProviderAbstract.java |  298 ------
 ...ageValueFacetUsingSemanticsProviderFactory.java |   44 -
 .../JavaAwtImageValueSemanticsProvider.java        |   83 --
 ...iveValueFacetUsingSemanticsProviderFactory.java |   42 -
 .../IntPrimitiveValueSemanticsProvider.java        |   54 -
 .../integer/IntValueSemanticsProviderAbstract.java |  114 --
 ...perValueFacetUsingSemanticsProviderFactory.java |   42 -
 .../integer/IntWrapperValueSemanticsProvider.java  |   41 -
 .../facets/value/integer/IntegerValueFacet.java    |   30 -
 .../localrespath/LocalResourcePathValueFacet.java  |   32 -
 ...athValueFacetUsingSemanticsProviderFactory.java |   44 -
 .../LocalResourcePathValueSemanticsProvider.java   |  130 ---
 ...iveValueFacetUsingSemanticsProviderFactory.java |   42 -
 .../longs/LongPrimitiveValueSemanticsProvider.java |   52 -
 .../facets/value/longs/LongValueFacet.java         |   30 -
 .../longs/LongValueSemanticsProviderAbstract.java  |  113 --
 ...perValueFacetUsingSemanticsProviderFactory.java |   42 -
 .../longs/LongWrapperValueSemanticsProvider.java   |   41 -
 .../facets/value/markup/MarkupValueFacet.java      |   30 -
 ...kupValueFacetUsingSemanticsProviderFactory.java |   38 -
 .../value/markup/MarkupValueSemanticsProvider.java |  114 --
 .../facets/value/password/PasswordValueFacet.java  |   33 -
 ...ordValueFacetUsingSemanticsProviderFactory.java |   43 -
 .../password/PasswordValueSemanticsProvider.java   |  119 ---
 ...iveValueFacetUsingSemanticsProviderFactory.java |   42 -
 .../ShortPrimitiveValueSemanticsProvider.java      |   52 -
 .../facets/value/shortint/ShortValueFacet.java     |   30 -
 .../ShortValueSemanticsProviderAbstract.java       |  115 --
 ...perValueFacetUsingSemanticsProviderFactory.java |   42 -
 .../ShortWrapperValueSemanticsProvider.java        |   41 -
 .../facets/value/string/StringValueFacet.java      |   31 -
 ...ingValueFacetUsingSemanticsProviderFactory.java |   42 -
 .../value/string/StringValueSemanticsProvider.java |  126 ---
 .../time/TimeValueSemanticsProviderAbstract.java   |  110 --
 .../JodaLocalTimeValueFacetSimpleFactory.java      |   46 -
 ...imeValueFacetUsingSemanticsProviderFactory.java |   46 -
 .../timesql/JavaSqlTimeValueSemanticsProvider.java |   95 --
 ...ampValueFacetUsingSemanticsProviderFactory.java |   47 -
 .../JavaSqlTimeStampValueSemanticsProvider.java    |   84 --
 .../TimeStampValueSemanticsProviderAbstract.java   |  101 --
 .../facets/value/treenode/TreeNodeValueFacet.java  |   27 -
 ...odeValueFacetUsingSemanticsProviderFactory.java |   40 -
 .../treenode/TreeNodeValueSemanticsProvider.java   |  136 ---
 .../metamodel/facets/value/url/URLValueFacet.java  |   31 -
 ...URLValueFacetUsingSemanticsProviderFactory.java |   44 -
 .../value/url/URLValueSemanticsProvider.java       |  127 ---
 .../facets/value/uuid/UUIDValueFacet.java          |   33 -
 ...UIDValueFacetUsingSemanticsProviderFactory.java |   44 -
 .../value/uuid/UUIDValueSemanticsProvider.java     |  112 --
 .../isis/metamodel/interactions/AccessContext.java |   42 -
 .../interactions/ActionArgUsabilityContext.java    |   76 --
 .../interactions/ActionArgValidityContext.java     |   68 --
 .../interactions/ActionArgVisibilityContext.java   |   76 --
 .../interactions/ActionInteractionContext.java     |   31 -
 .../interactions/ActionUsabilityContext.java       |   60 --
 .../interactions/ActionValidityContext.java        |   64 --
 .../interactions/ActionVisibilityContext.java      |   60 --
 .../interactions/CollectionAccessContext.java      |   48 -
 .../interactions/CollectionAddToContext.java       |   56 -
 .../interactions/CollectionRemoveFromContext.java  |   58 -
 .../interactions/CollectionUsabilityContext.java   |   48 -
 .../interactions/CollectionVisibilityContext.java  |   50 -
 .../interactions/DisablingInteractionAdvisor.java  |   46 -
 .../interactions/HidingInteractionAdvisor.java     |   47 -
 .../interactions/InteractionAdvisorFacet.java      |   45 -
 .../metamodel/interactions/InteractionContext.java |  171 ---
 .../metamodel/interactions/InteractionUtils.java   |   81 --
 .../metamodel/interactions/ObjectTitleContext.java |   56 -
 .../interactions/ObjectValidityContext.java        |   53 -
 .../interactions/ObjectVisibilityContext.java      |   55 -
 .../metamodel/interactions/ParseValueContext.java  |   59 --
 .../interactions/PropertyAccessContext.java        |   60 --
 .../interactions/PropertyModifyContext.java        |   61 --
 .../interactions/PropertyUsabilityContext.java     |   50 -
 .../interactions/PropertyVisibilityContext.java    |   50 -
 .../metamodel/interactions/ProposedHolder.java     |   38 -
 .../metamodel/interactions/UsabilityContext.java   |   55 -
 .../interactions/ValidatingInteractionAdvisor.java |   51 -
 .../metamodel/interactions/ValidityContext.java    |   42 -
 .../metamodel/interactions/VisibilityContext.java  |   54 -
 .../isis/metamodel/layout/DeweyOrderSet.java       |  404 -------
 .../MemberIdentifierComparator.java                |   44 -
 .../memberorderfacet/MemberOrderComparator.java    |   90 --
 .../MemberOrderFacetComparator.java                |   56 -
 .../OrderSetGroupNameComparator.java               |   55 -
 .../metamodel/objectmanager/ObjectManager.java     |  107 --
 .../objectmanager/ObjectManagerDefault.java        |   77 --
 .../objectmanager/create/ObjectCreator.java        |   82 --
 .../create/ObjectCreator_builtinHandlers.java      |  386 -------
 .../objectmanager/identify/ObjectIdentifier.java   |   63 --
 .../identify/ObjectIdentifier_builtinHandlers.java |  139 ---
 .../metamodel/objectmanager/load/ObjectLoader.java |   80 --
 .../load/ObjectLoader_builtinHandlers.java         |  259 -----
 .../objectmanager/refresh/ObjectRefresher.java     |   67 --
 .../refresh/ObjectRefresher_builtinHandlers.java   |  107 --
 ...arameterChoicesFacetFromParentedCollection.java |   76 --
 ...meterDefaultsFacetFromAssociatedCollection.java |   64 --
 .../param/DeriveFacetsPostProcessor.java           |  633 -----------
 .../ObjectSpecificationPostProcessor.java          |   28 -
 .../isis/metamodel/progmodel/ProgrammingModel.java |  179 ----
 .../progmodel/ProgrammingModelAbstract.java        |  253 -----
 .../progmodel/ProgrammingModelInitFilter.java      |   81 --
 .../ProgrammingModelInitFilterDefault.java         |   86 --
 .../progmodel/ProgrammingModelService.java         |   32 -
 .../dflt/ProgrammingModelFacetsJava8.java          |  388 -------
 .../isis/metamodel/services/CollectionHelper.java  |  100 --
 .../metamodel/services/ServiceInjectorDefault.java |   75 --
 .../metamodel/services/ServiceInjectorLegacy.java  |  286 -----
 .../isis/metamodel/services/ServiceUtil.java       |   41 -
 .../services/appfeat/ApplicationFeature.java       |  324 ------
 .../appfeat/ApplicationFeatureFactory.java         |   45 -
 .../services/appfeat/ApplicationFeatureId.java     |  492 ---------
 .../ApplicationFeatureRepositoryDefault.java       |  555 ----------
 .../services/appfeat/ApplicationFeatureType.java   |  102 --
 .../classsubstitutor/ClassSubstitutor.java         |   28 -
 .../classsubstitutor/ClassSubstitutorAbstract.java |  137 ---
 .../classsubstitutor/ClassSubstitutorDefault.java  |   76 --
 .../ClassSubstitutorForCollections.java            |   66 --
 .../classsubstitutor/ClassSubstitutorRegistry.java |   80 --
 .../command/CommandDtoServiceInternal.java         |   71 --
 .../services/container/query/QueryCardinality.java |   31 -
 .../metamodel/services/devutils/MemberType.java    |   25 -
 .../services/events/MetamodelEventService.java     |   94 --
 .../events/MetamodelEventSupport_Spring.java       |   77 --
 .../exceprecog/ExceptionRecognizerDocDefault.java  |   88 --
 .../services/grid/GridLoaderServiceDefault.java    |  257 -----
 .../services/grid/GridReaderUsingJaxb.java         |   76 --
 .../services/grid/GridServiceDefault.java          |  209 ----
 .../services/grid/GridSystemServiceAbstract.java   |  699 ------------
 .../grid/bootstrap3/GridSystemServiceBS3.java      |  674 ------------
 .../services/homepage/HomePageAction.java          |   63 --
 .../services/homepage/HomePageResolverService.java |   35 -
 .../metamodel/services/homepage/package-info.java  |   26 -
 .../ixn/InteractionDtoServiceInternal.java         |   51 -
 .../services/layout/LayoutServiceDefault.java      |  147 ---
 .../services/message/MessageServiceNoop.java       |   88 --
 .../services/metamodel/DomainMemberDefault.java    |  301 ------
 .../services/metamodel/DomainModelDefault.java     |   58 -
 .../services/metamodel/MetaModelExportSupport.java |   31 -
 .../services/metamodel/MetaModelExporter.java      |  570 ----------
 .../metamodel/MetaModelServiceDefault.java         |  272 -----
 .../isis/metamodel/services/metamodel/Util.java    |   35 -
 .../publishing/PublisherDispatchService.java       |   46 -
 .../services/registry/ServiceRegistryDefault.java  |  103 --
 .../services/registry/SpringContextProvider.java   |   23 -
 .../services/title/TitleServiceDefault.java        |   83 --
 .../title/TitlesAndTranslationsValidator.java      |  166 ---
 .../services/user/UserServiceDefault.java          |  177 ----
 .../org/apache/isis/metamodel/spec/ActionType.java |   41 -
 .../isis/metamodel/spec/DefaultProvider.java       |   31 -
 .../org/apache/isis/metamodel/spec/Described.java  |   35 -
 .../isis/metamodel/spec/DomainModelException.java  |   47 -
 .../spec/ElementSpecificationProvider.java         |   44 -
 .../apache/isis/metamodel/spec/EntityState.java    |   49 -
 .../isis/metamodel/spec/FreeStandingList.java      |   96 --
 .../apache/isis/metamodel/spec/Hierarchical.java   |   65 --
 .../metamodel/spec/InjectorMethodEvaluator.java    |   31 -
 .../apache/isis/metamodel/spec/ManagedObject.java  |  734 -------------
 .../spec/ObjectInstantiationException.java         |   41 -
 .../apache/isis/metamodel/spec/ObjectSpecId.java   |   62 --
 .../isis/metamodel/spec/ObjectSpecification.java   |  443 --------
 .../spec/ObjectSpecificationException.java         |   36 -
 .../apache/isis/metamodel/spec/Specification.java  |   50 -
 .../isis/metamodel/spec/feature/Contributed.java   |   31 -
 .../isis/metamodel/spec/feature/CurrentHolder.java |   46 -
 .../spec/feature/MutableCurrentHolder.java         |   64 --
 .../isis/metamodel/spec/feature/ObjectAction.java  |  589 -----------
 .../spec/feature/ObjectActionContainer.java        |   80 --
 .../spec/feature/ObjectActionParameter.java        |  235 ----
 .../metamodel/spec/feature/ObjectAssociation.java  |  253 -----
 .../spec/feature/ObjectAssociationContainer.java   |   72 --
 .../isis/metamodel/spec/feature/ObjectFeature.java |   79 --
 .../isis/metamodel/spec/feature/ObjectMember.java  |  227 ----
 .../spec/feature/OneToManyActionParameter.java     |   28 -
 .../spec/feature/OneToManyAssociation.java         |  101 --
 .../metamodel/spec/feature/OneToManyFeature.java   |   40 -
 .../spec/feature/OneToOneActionParameter.java      |   28 -
 .../spec/feature/OneToOneAssociation.java          |   53 -
 .../metamodel/spec/feature/OneToOneFeature.java    |   28 -
 .../isis/metamodel/specloader/CollectionUtils.java |   61 --
 .../specloader/InjectorMethodEvaluatorDefault.java |   91 --
 .../specloader/ProgrammingModelServiceDefault.java |  104 --
 .../specloader/ReflectiveActionException.java      |   43 -
 .../specloader/SpecificationCacheDefault.java      |  134 ---
 .../metamodel/specloader/SpecificationLoader.java  |  137 ---
 .../specloader/SpecificationLoaderDefault.java     |  521 ---------
 .../SpecificationLoaderDefault_debug.java          |   79 --
 .../specloader/classsubstitutor/ProxyEnhanced.java |   28 -
 .../specloader/facetprocessor/FacetProcessor.java  |  486 ---------
 .../isis/metamodel/specloader/package-info.java    |   43 -
 .../specloader/postprocessor/PostProcessor.java    |   59 --
 .../specloader/specimpl/ContributeeMember.java     |   67 --
 .../specloader/specimpl/FacetedMethodsBuilder.java |  614 -----------
 .../metamodel/specloader/specimpl/Factories.java   |   96 --
 .../specloader/specimpl/IntrospectionState.java    |   47 -
 .../specloader/specimpl/MixedInMember.java         |   40 -
 .../specimpl/ObjectActionContributee.java          |  253 -----
 .../specloader/specimpl/ObjectActionDefault.java   |  688 ------------
 .../specloader/specimpl/ObjectActionMixedIn.java   |  260 -----
 .../specimpl/ObjectActionParameterAbstract.java    |  492 ---------
 .../specimpl/ObjectActionParameterContributee.java |   25 -
 .../ObjectActionParameterContributeeAbstract.java  |   93 --
 .../specimpl/ObjectActionParameterMixedIn.java     |   25 -
 .../ObjectActionParameterMixedInAbstract.java      |   85 --
 .../specimpl/ObjectAssociationAbstract.java        |   97 --
 .../specloader/specimpl/ObjectMemberAbstract.java  |  409 -------
 .../specimpl/ObjectSpecificationAbstract.java      | 1118 -------------------
 .../OneToManyActionParameterContributee.java       |   43 -
 .../specimpl/OneToManyActionParameterDefault.java  |   43 -
 .../specimpl/OneToManyActionParameterMixedIn.java  |   40 -
 .../specimpl/OneToManyAssociationContributee.java  |  191 ----
 .../specimpl/OneToManyAssociationDefault.java      |  288 -----
 .../specimpl/OneToManyAssociationMixedIn.java      |  221 ----
 .../OneToOneActionParameterContributee.java        |   38 -
 .../specimpl/OneToOneActionParameterDefault.java   |   37 -
 .../specimpl/OneToOneActionParameterMixedIn.java   |   35 -
 .../specimpl/OneToOneAssociationContributee.java   |  174 ---
 .../specimpl/OneToOneAssociationDefault.java       |  361 -------
 .../specimpl/OneToOneAssociationMixedIn.java       |  206 ----
 .../metamodel/specloader/specimpl/Predicates.java  |  168 ---
 .../isis/metamodel/specloader/specimpl/Utils.java  |  103 --
 .../specimpl/dflt/ObjectSpecificationDefault.java  |  456 --------
 .../CollectionFacetOnStandaloneList.java           |   73 --
 .../DescribedAsFacetOnStandaloneList.java          |   31 -
 .../standalonelist/NamedFacetOnStandaloneList.java |   31 -
 .../ObjectSpecificationOnStandaloneList.java       |  186 ----
 .../PluralFacetOnStandaloneList.java               |   31 -
 .../traverser/TypeExtractorAbstract.java           |   84 --
 .../traverser/TypeExtractorMethodParameters.java   |   60 --
 .../traverser/TypeExtractorMethodReturn.java       |   47 -
 .../validator/MetaModelInvalidException.java       |   33 -
 .../specloader/validator/MetaModelValidator.java   |   44 -
 .../validator/MetaModelValidatorAbstract.java      |   69 --
 ...etaModelValidatorForConflictingOptionality.java |   62 --
 .../MetaModelValidatorForDeprecatedAbstract.java   |   68 --
 .../MetaModelValidatorForDeprecatedAnnotation.java |   54 -
 ...etaModelValidatorForDeprecatedMethodPrefix.java |   52 -
 .../MetaModelValidatorForValidationFailures.java   |   23 -
 .../validator/MetaModelValidatorVisiting.java      |  111 --
 .../specloader/validator/ValidationFailure.java    |   61 --
 .../specloader/validator/ValidationFailures.java   |  112 --
 .../isis/metamodel/util/DeweyOrderComparator.java  |   37 -
 .../org/apache/isis/metamodel/util/EventUtil.java  |   43 -
 .../isis/metamodel/util/pchain/ParentChain.java    |   83 --
 .../metamodel/util/pchain/ParentChainDefault.java  |   49 -
 .../isis/metamodel/util/snapshot/Helper.java       |   91 --
 .../isis/metamodel/util/snapshot/IsisSchema.java   |  181 ----
 .../apache/isis/metamodel/util/snapshot/Place.java |   65 --
 .../isis/metamodel/util/snapshot/XmlSchema.java    |  648 ------------
 .../isis/metamodel/util/snapshot/XmlSnapshot.java  |  916 ----------------
 .../isis/metamodel/util/snapshot/XsMetaModel.java  |  337 ------
 .../metamodel/valuetypes/ValueTypeDefinition.java  |   45 -
 .../metamodel/valuetypes/ValueTypeProvider.java    |   34 -
 .../valuetypes/ValueTypeProviderDefault.java       |   55 -
 .../ValueTypeProviderForCollections.java           |   56 -
 .../metamodel/valuetypes/ValueTypeRegistry.java    |   96 --
 .../metamodel/MetaModelContext_configTest.java     |   77 ++
 .../metamodel/MetaModelContext_forTesting.java     |  256 +++++
 .../core/metamodel/ServiceInjector_forTesting.java |   70 ++
 .../core/metamodel/ServiceRegistry_forTesting.java |  154 +++
 .../oid/CollectionOidTest_valueSemantics.java      |   47 +
 .../adapter/oid/OidMarshallerTest_marshall.java    |   50 +
 .../oid/OidMarshallerTest_roundtripping.java       |   59 ++
 .../adapter/oid/OidMarshallerTest_unmarshal.java   |  154 +++
 .../core/metamodel/adapter/oid/OidVersionTest.java |   70 ++
 ...dDefaultTest_valueSemantics_whenPersistent.java |   45 +
 ...idDefaultTest_valueSemantics_whenTransient.java |   46 +
 .../metamodel/adapter/oid/RootOidTest_create.java  |   62 ++
 .../core/metamodel/commons/IoUtils_CopyTest.java   |  136 +++
 .../commons/JavaClassUtilsTest_getBuiltIn.java     |   41 +
 .../metamodel/commons/ListUtilsTest_adjust.java    |   67 ++
 .../metamodel/commons/ListUtilsTest_insert.java    |   84 ++
 .../commons/ListUtilsTest_mutableCopy.java         |   89 ++
 .../core/metamodel/commons/LocaleUtilsTest.java    |   36 +
 .../isis/core/metamodel/commons/NameUtilTest.java  |   68 ++
 .../isis/core/metamodel/commons/PrintLocale.java   |   59 ++
 .../commons/StringUtilsTest_enumTitle.java         |   41 +
 .../commons/StringUtils_NaturalNameTest.java       |   59 ++
 .../commons/StringUtils_NaturalizeTest.java        |   49 +
 .../commons/StringUtils_NormalizedTest.java        |   65 ++
 .../StringUtils_RemoveLeadingWhiteSpace.java       |   51 +
 .../commons/StringUtils_SplitOnCommas.java         |   80 ++
 .../commons/StringUtils_StripLeadingSlashTest.java |   49 +
 .../commons/StringUtils_StripNewLinesTest.java     |   59 ++
 .../commons/StringUtils_camelLowerFirst.java       |   38 +
 .../commons/StringUtils_toLineSeparated.java       |   52 +
 .../commons/StringUtils_toLowerDashed.java         |   36 +
 .../metamodel/commons/TypesTest_filteredList.java  |   71 ++
 .../metamodel/commons/matchers/IsisMatchers.java   |   73 ++
 .../matchers/IsisMatchers_NonEmptyStringTest.java  |   53 +
 .../metamodel/consent/InteractionResultTest.java   |   85 ++
 .../core/metamodel/facetapi/FacetAbstractTest.java |   76 ++
 .../facetapi/FeatureTypeTest_identifierFor.java    |   85 ++
 .../facets/AbstractFacetFactoryJUnit4TestCase.java |  159 +++
 .../metamodel/facets/AbstractFacetFactoryTest.java |  169 +++
 .../core/metamodel/facets/AnnotationsTest.java     |   71 ++
 .../Annotations_getAnnotations_on_Class_Test.java  |  248 +++++
 .../Annotations_getAnnotations_on_Field_Test.java  |  203 ++++
 .../Annotations_getAnnotations_on_Method_Test.java |  184 ++++
 ...notations_getAnnotations_on_Parameter_Test.java |  200 ++++
 .../core/metamodel/facets/CollectionUtilsTest.java |  123 +++
 ...nEventHelperTest_newActionInteractionEvent.java |   87 ++
 ...HelperTest_newCollectionDomainEvent_forAdd.java |   84 ++
 ...perTest_newCollectionDomainEvent_forRemove.java |   84 ++
 ...HelperTest_newPropertyDomainEvent_forClear.java |   76 ++
 ...elperTest_newPropertyDomainEvent_forModify.java |   72 ++
 .../metamodel/facets/MethodFinderUtilsTest.java    |   72 ++
 .../metamodel/facets/MethodRemoverForTesting.java  |   81 ++
 .../metamodel/facets/ObjectAdapterUtilsTest.java   |   84 ++
 .../apache/isis/core/metamodel/facets/Utils.java   |   64 ++
 .../actions/ActionMethodsFacetFactoryTest.java     |  539 ++++++++++
 .../actions/IteratorFilteringFacetFactoryTest.java |   91 ++
 .../action/ActionAnnotationFacetFactoryTest.java   |  118 +++
 ...nnotationFacetFactoryTest_ActionInvocation.java |  234 ++++
 .../ActionAnnotationFacetFactoryTest_Command.java  |  313 ++++++
 .../ActionAnnotationFacetFactoryTest_Hidden.java   |   72 ++
 ...ctionAnnotationFacetFactoryTest_Invocation.java |  211 ++++
 ...ctionAnnotationFacetFactoryTest_Publishing.java |  313 ++++++
 ...ctionAnnotationFacetFactoryTest_RestrictTo.java |  109 ++
 ...ActionAnnotationFacetFactoryTest_Semantics.java |  111 ++
 .../ActionAnnotationFacetFactoryTest_TypeOf.java   |  177 ++++
 ...icsFacetFallbackToNonIdempotentFactoryTest.java |   73 ++
 .../PrototypeFacetAnnotationFactoryTest.java       |   77 ++
 ...kmarkableAnnotationFacetFactoryTest_action.java |   63 ++
 .../HomePageAnnotationFacetFactoryTest.java        |   66 ++
 ...tionLayoutAnnotationFacetFactoryJunit4Test.java |  407 +++++++
 ...nLayoutXmlLayoutAnnotationFacetFactoryTest.java |  197 ++++
 ...etDerivedFromDomainServiceFacetFactoryTest.java |  222 ++++
 ...etDerivedFromDomainServiceFacetFactoryTest.java |  223 ++++
 .../prototype/PrototypeFacetAbstractTest.java      |   58 +
 .../CollectionFieldMethodsFacetFactoryTest.java    |  589 +++++++++++
 .../collections/JavaCollectionFacetTest.java       |   90 ++
 .../CollectionAnnotationFacetFactoryTest.java      |  570 ++++++++++
 ...ollectionAnnotationFacetFactoryTest_typeOf.java |  137 +++
 ...bledAnnotationOnCollectionFacetFactoryTest.java |   82 ++
 ...stedAnnotationOnCollectionFacetFactoryTest.java |   71 ++
 ...etForCollectionLayoutAnnotationFactoryTest.java |   86 ++
 .../cssclassfa/CssClassFaFacetAbstractTest.java    |   45 +
 .../ViewModelSemanticCheckingFacetFactoryTest.java |  240 +++++
 ...okmarkableAnnotationFacetFactoryTest_class.java |   63 ++
 .../callback/CreatedCallbackFacetFactoryTest.java  |   67 ++
 .../callback/DeleteCallbackFacetFactoryTest.java   |   88 ++
 .../callback/LoadCallbackFacetFactoryTest.java     |   88 ++
 .../PersistAndSaveCallbackFacetFactoryTest.java    |  109 ++
 .../callback/PersistCallbackFacetFactoryTest.java  |   88 ++
 .../RemoveAndDeleteCallbackFacetFactoryTest.java   |  109 ++
 .../callback/RemoveCallbackFacetFactoryTest.java   |   88 ++
 .../callback/SaveCallbackFacetFactoryTest.java     |   88 ++
 .../callback/UpdateCallbackFacetFactoryTest.java   |   88 ++
 ...CssClassFaFacetOnTypeAnnotationFactoryTest.java |   68 ++
 .../object/defaults/DefaultedFacetFactoryTest.java |  228 ++++
 .../ObjectDisabledMethodFacetFactoryTest.java      |   72 ++
 ...oicesFacetFromBoundedAnnotationFactoryTest.java |   60 ++
 .../DomainObjectAnnotationFacetFactoryTest.java    |  861 +++++++++++++++
 .../ObjectTypeAnnotationFacetFactoryTest.java      |   65 ++
 .../DomainObjectLayoutFactoryTest.java             |  670 ++++++++++++
 .../DomainServiceFacetAnnotationFactoryTest.java   |   66 ++
 .../DomainServiceLayoutFacetFactoryTest.java       |  123 +++
 .../facets/FacetsFacetAnnotationFactoryTest.java   |  153 +++
 .../hidden/ObjectHiddenMethodFacetFactoryTest.java |   85 ++
 .../cssclass/CssClassFacetMethodFactoryTest.java   |   71 ++
 .../ident/cssclass/CssClassFacetMethodTest.java    |   85 ++
 .../CssClassFacetMethodWithProblemTest.java        |   84 ++
 .../ident/icon/IconFacetMethodFactoryTest.java     |   71 ++
 .../object/ident/icon/IconFacetMethodTest.java     |   84 ++
 .../ident/layout/LayoutFacetFactoryTest.java       |   71 ++
 .../object/ident/layout/LayoutFacetMethodTest.java |   84 ++
 .../ident/title/TitleFacetViaMethodTest.java       |   97 ++
 .../title/TitleFacetViaMethodsFactoryTest.java     |  112 ++
 .../TitleAnnotationFacetFactoryTest.java           |  262 +++++
 .../TitleFacetViaTitleAnnotationTest.java          |  153 +++
 .../object/layoutxml/GridFacetDefaultTest.java     |   60 ++
 .../navparent/NavigableParentFacetMethodTest.java  |   84 ++
 .../NavigableParentAnnotationFacetFactoryTest.java |  113 ++
 .../annotation/NavigableParentTestSamples.java     |   68 ++
 ...SpecIdFacetDerivedFromClassNameFactoryTest.java |   63 ++
 .../parseable/ParseableFacetUsingParserTest.java   |  131 +++
 .../facets/object/parseable/ValueProxy.java        |   23 +
 .../RecreatableObjectFacetFactoryTest.java         |   68 ++
 .../ObjectValidMethodFacetFactoryTest.java         |   66 ++
 ...eFacetAnnotationOrConfigurationFactoryTest.java |  504 +++++++++
 .../ordering/memberorder/DeweyOrderSetTest.java    |  265 +++++
 .../MemberOrderAnnotationFacetFactoryTest.java     |  143 +++
 .../memberorder/MemberOrderComparatorTest.java     |  181 ++++
 ...cetForParameterLayoutAnnotationFactoryTest.java |   58 +
 ...cetForParameterLayoutAnnotationFactoryTest.java |   79 ++
 .../ParameterAnnotationFacetFactoryTest.java       |  388 +++++++
 ...lableAnnotationOnParameterFacetFactoryTest.java |  106 ++
 ...RegExAnnotationOnParameterFacetFactoryTest.java |   79 ++
 .../PropertyMethodsFacetFactoryTest.java           |  671 ++++++++++++
 ...romptStyleFacetFromPropertyAnnotation_Test.java |  185 ++++
 ...sabledAnnotationOnPropertyFacetFactoryTest.java |  102 ++
 .../MandatoryAnnotationFacetFactoryTest.java       |   71 ++
 ...sistedAnnotationOnPropertyFacetFactoryTest.java |   71 ++
 .../PropertyAnnotationFacetFactoryTest.java        |  868 +++++++++++++++
 ...llableAnnotationOnPropertyFacetFactoryTest.java |  118 +++
 .../RegExAnnotationOnPropertyFacetFactoryTest.java |   90 ++
 ...acetForPropertyLayoutAnnotationFactoryTest.java |   68 ++
 ...acetForPropertyLayoutAnnotationFactoryTest.java |   95 ++
 ...ValidationDigitsAnnotationFacetFactoryTest.java |   79 ++
 .../DomainObjectWithMustSatisfyAnnotations.java    |   48 +
 .../DomainObjectWithoutMustSatisfyAnnotations.java |   48 +
 .../SpecificationAlwaysSatisfied.java              |   31 +
 .../specification/SpecificationAndTests.java       |  111 ++
 .../specification/SpecificationNeverSatisfied.java |   31 +
 .../specification/SpecificationNotTests.java       |   62 ++
 .../specification/SpecificationOrTests.java        |  110 ++
 ...cificationRequiresFirstLetterToBeUpperCase.java |   39 +
 .../BigDecimalValueSemanticsProviderTest.java      |   89 ++
 .../value/BigIntValueSemanticsProviderTest.java    |   88 ++
 .../value/BlobValueSemanticsProviderTest.java      |   65 ++
 .../value/BooleanValueSemanticsProviderTest.java   |  113 ++
 .../value/ByteValueSemanticsProviderTest.java      |   86 ++
 .../value/CharacterValueSemanticsProviderTest.java |   79 ++
 .../value/ClobValueSemanticsProviderTest.java      |   65 ++
 .../value/DoubleValueSemanticsProviderTest.java    |   84 ++
 .../value/FloatValueSemanticsProviderTest.java     |   93 ++
 .../ImageValueSemanticsProviderAbstractTest.java   |  126 +++
 .../value/IntValueSemanticsProviderTest.java       |   80 ++
 .../JavaSqlDateValueSemanticsProviderTest.java     |   91 ++
 .../JavaSqlTimeValueSemanticsProviderTest.java     |   90 ++
 .../JavaUtilDateValueSemanticsProviderTest.java    |   96 ++
 .../value/LongValueSemanticsProviderTest.java      |   91 ++
 .../value/PasswordValueSemanticsProviderTest.java  |   49 +
 .../value/ShortValueSemanticsProviderTest.java     |   87 ++
 .../value/StringValueSemanticsProviderTest.java    |   80 ++
 .../core/metamodel/facets/value/TestClock.java     |   69 ++
 .../ValueSemanticsProviderAbstractTestCase.java    |  165 +++
 ...odaLocalDateTimeValueSemanticsProviderTest.java |   81 ++
 ...jectAssociationPredicatesTest_visibleWhere.java |  150 +++
 .../interactions/InteractionUtils_isA_Test.java    |  104 ++
 .../ServiceInjectorDefaultTest_usingFields.java    |  144 +++
 ...erviceInjectorDefaultTest_validateServices.java |   81 ++
 ...InjectorDefaultTest_validateServices_happy.java |   89 ++
 .../services/ServiceInjectorLegacyTest.java        |  166 +++
 .../services/appfeat/ApplicationFeatureIdTest.java |  691 ++++++++++++
 .../ApplicationFeatureRepositoryDefaultTest.java   |  323 ++++++
 .../services/appfeat/ApplicationFeatureTest.java   |  163 +++
 .../appfeat/ApplicationFeatureTypeTest.java        |  191 ++++
 ...eptionRecognizerDocDefault_recognizes_Test.java |   57 +
 .../core/metamodel/services/grid/BS3GridTest.java  |  165 +++
 .../isis/core/metamodel/services/grid/Foo.java     |   22 +
 .../metamodel/services/grid/Foo.layout.xml         |    0
 .../isis/core/metamodel/services/grid/Foo2.java    |   22 +
 .../services/grid/Foo2.layout.fallback.xml         |    0
 .../isis/core/metamodel/services/grid/Foo3.java    |   22 +
 .../services/grid/Foo3.layout.fallback.xml         |    0
 .../metamodel/services/grid/Foo3.layout.xml        |    0
 .../isis/core/metamodel/services/grid/Foo4.java    |   22 +
 ...dLoaderServiceDefault_resourceNameFor_Test.java |   58 +
 .../services/menubars/BS3MenuBarsTest.java         |   62 ++
 .../metamodel/MetaModelServiceDefaultTest.java     |  242 +++++
 .../spec/ObjectSpecIdTest_constructor.java         |   43 +
 .../spec/ObjectSpecIdTest_valueSemantics.java      |   38 +
 .../metamodel/specloader/ReflectorTestPojo.java    |   52 +
 .../specloader/SpecificationCacheDefaultTest.java  |  120 +++
 .../SpecificationLoaderTestAbstract.java           |  185 ++++
 .../specloader/SpecificationLoaderTest_array.java  |   65 ++
 .../SpecificationLoaderTest_collection.java        |   67 ++
 .../specloader/SpecificationLoaderTest_value.java  |   46 +
 .../ClassSubstitutorTest_getClass.java             |   69 ++
 .../IntrospectionState_comparable_Test.java        |   87 ++
 .../specimpl/ObjectActionMixedInTest.java          |   64 ++
 ...ionParameterAbstractTest_getId_and_getName.java |  214 ++++
 .../specimpl/ObjectAssociationAbstractTest.java    |  211 ++++
 ...ObjectAssociationAbstractTest_alwaysHidden.java |  229 ++++
 .../specimpl/ObjectMemberAbstractTest.java         |   43 +
 .../testspec/ObjectSpecificationStub.java          |  358 +++++++
 .../metamodel/MetaModelContext_configTest.java     |   77 --
 .../metamodel/MetaModelContext_forTesting.java     |  256 -----
 .../isis/metamodel/ServiceInjector_forTesting.java |   70 --
 .../isis/metamodel/ServiceRegistry_forTesting.java |  154 ---
 .../oid/CollectionOidTest_valueSemantics.java      |   47 -
 .../adapter/oid/OidMarshallerTest_marshall.java    |   51 -
 .../oid/OidMarshallerTest_roundtripping.java       |   60 --
 .../adapter/oid/OidMarshallerTest_unmarshal.java   |  154 ---
 .../isis/metamodel/adapter/oid/OidVersionTest.java |   71 --
 ...dDefaultTest_valueSemantics_whenPersistent.java |   45 -
 ...idDefaultTest_valueSemantics_whenTransient.java |   46 -
 .../metamodel/adapter/oid/RootOidTest_create.java  |   63 --
 .../isis/metamodel/commons/IoUtils_CopyTest.java   |  136 ---
 .../commons/JavaClassUtilsTest_getBuiltIn.java     |   41 -
 .../metamodel/commons/ListUtilsTest_adjust.java    |   67 --
 .../metamodel/commons/ListUtilsTest_insert.java    |   84 --
 .../commons/ListUtilsTest_mutableCopy.java         |   89 --
 .../isis/metamodel/commons/LocaleUtilsTest.java    |   36 -
 .../isis/metamodel/commons/NameUtilTest.java       |   68 --
 .../apache/isis/metamodel/commons/PrintLocale.java |   59 --
 .../commons/StringUtilsTest_enumTitle.java         |   41 -
 .../commons/StringUtils_NaturalNameTest.java       |   59 --
 .../commons/StringUtils_NaturalizeTest.java        |   49 -
 .../commons/StringUtils_NormalizedTest.java        |   65 --
 .../StringUtils_RemoveLeadingWhiteSpace.java       |   51 -
 .../commons/StringUtils_SplitOnCommas.java         |   80 --
 .../commons/StringUtils_StripLeadingSlashTest.java |   49 -
 .../commons/StringUtils_StripNewLinesTest.java     |   59 --
 .../commons/StringUtils_camelLowerFirst.java       |   38 -
 .../commons/StringUtils_toLineSeparated.java       |   52 -
 .../commons/StringUtils_toLowerDashed.java         |   36 -
 .../metamodel/commons/TypesTest_filteredList.java  |   71 --
 .../metamodel/commons/matchers/IsisMatchers.java   |   73 --
 .../matchers/IsisMatchers_NonEmptyStringTest.java  |   53 -
 .../metamodel/consent/InteractionResultTest.java   |   85 --
 .../isis/metamodel/facetapi/FacetAbstractTest.java |   76 --
 .../facetapi/FeatureTypeTest_identifierFor.java    |   85 --
 .../facets/AbstractFacetFactoryJUnit4TestCase.java |  159 ---
 .../metamodel/facets/AbstractFacetFactoryTest.java |  169 ---
 .../isis/metamodel/facets/AnnotationsTest.java     |   71 --
 .../Annotations_getAnnotations_on_Class_Test.java  |  248 -----
 .../Annotations_getAnnotations_on_Field_Test.java  |  203 ----
 .../Annotations_getAnnotations_on_Method_Test.java |  184 ----
 ...notations_getAnnotations_on_Parameter_Test.java |  200 ----
 .../isis/metamodel/facets/CollectionUtilsTest.java |  123 ---
 ...nEventHelperTest_newActionInteractionEvent.java |   87 --
 ...HelperTest_newCollectionDomainEvent_forAdd.java |   84 --
 ...perTest_newCollectionDomainEvent_forRemove.java |   84 --
 ...HelperTest_newPropertyDomainEvent_forClear.java |   76 --
 ...elperTest_newPropertyDomainEvent_forModify.java |   72 --
 .../metamodel/facets/MethodFinderUtilsTest.java    |   72 --
 .../metamodel/facets/MethodRemoverForTesting.java  |   81 --
 .../metamodel/facets/ObjectAdapterUtilsTest.java   |   84 --
 .../org/apache/isis/metamodel/facets/Utils.java    |   64 --
 .../actions/ActionMethodsFacetFactoryTest.java     |  538 ----------
 .../actions/IteratorFilteringFacetFactoryTest.java |   91 --
 .../action/ActionAnnotationFacetFactoryTest.java   |  118 ---
 ...nnotationFacetFactoryTest_ActionInvocation.java |  234 ----
 .../ActionAnnotationFacetFactoryTest_Command.java  |  313 ------
 .../ActionAnnotationFacetFactoryTest_Hidden.java   |   72 --
 ...ctionAnnotationFacetFactoryTest_Invocation.java |  211 ----
 ...ctionAnnotationFacetFactoryTest_Publishing.java |  313 ------
 ...ctionAnnotationFacetFactoryTest_RestrictTo.java |  109 --
 ...ActionAnnotationFacetFactoryTest_Semantics.java |  111 --
 .../ActionAnnotationFacetFactoryTest_TypeOf.java   |  177 ----
 ...icsFacetFallbackToNonIdempotentFactoryTest.java |   73 --
 .../PrototypeFacetAnnotationFactoryTest.java       |   77 --
 ...kmarkableAnnotationFacetFactoryTest_action.java |   63 --
 .../HomePageAnnotationFacetFactoryTest.java        |   66 --
 ...tionLayoutAnnotationFacetFactoryJunit4Test.java |  407 -------
 ...nLayoutXmlLayoutAnnotationFacetFactoryTest.java |  197 ----
 ...etDerivedFromDomainServiceFacetFactoryTest.java |  222 ----
 ...etDerivedFromDomainServiceFacetFactoryTest.java |  223 ----
 .../prototype/PrototypeFacetAbstractTest.java      |   58 -
 .../CollectionFieldMethodsFacetFactoryTest.java    |  589 -----------
 .../collections/JavaCollectionFacetTest.java       |   90 --
 .../CollectionAnnotationFacetFactoryTest.java      |  572 ----------
 ...ollectionAnnotationFacetFactoryTest_typeOf.java |  137 ---
 ...bledAnnotationOnCollectionFacetFactoryTest.java |   82 --
 ...stedAnnotationOnCollectionFacetFactoryTest.java |   71 --
 ...etForCollectionLayoutAnnotationFactoryTest.java |   86 --
 .../cssclassfa/CssClassFaFacetAbstractTest.java    |   45 -
 .../ViewModelSemanticCheckingFacetFactoryTest.java |  240 -----
 ...okmarkableAnnotationFacetFactoryTest_class.java |   63 --
 .../callback/CreatedCallbackFacetFactoryTest.java  |   67 --
 .../callback/DeleteCallbackFacetFactoryTest.java   |   88 --
 .../callback/LoadCallbackFacetFactoryTest.java     |   88 --
 .../PersistAndSaveCallbackFacetFactoryTest.java    |  109 --
 .../callback/PersistCallbackFacetFactoryTest.java  |   88 --
 .../RemoveAndDeleteCallbackFacetFactoryTest.java   |  109 --
 .../callback/RemoveCallbackFacetFactoryTest.java   |   88 --
 .../callback/SaveCallbackFacetFactoryTest.java     |   88 --
 .../callback/UpdateCallbackFacetFactoryTest.java   |   88 --
 ...CssClassFaFacetOnTypeAnnotationFactoryTest.java |   68 --
 .../object/defaults/DefaultedFacetFactoryTest.java |  228 ----
 .../ObjectDisabledMethodFacetFactoryTest.java      |   72 --
 ...oicesFacetFromBoundedAnnotationFactoryTest.java |   60 --
 .../DomainObjectAnnotationFacetFactoryTest.java    |  861 ---------------
 .../ObjectTypeAnnotationFacetFactoryTest.java      |   65 --
 .../DomainObjectLayoutFactoryTest.java             |  670 ------------
 .../DomainServiceFacetAnnotationFactoryTest.java   |   66 --
 .../DomainServiceLayoutFacetFactoryTest.java       |  123 ---
 .../facets/FacetsFacetAnnotationFactoryTest.java   |  153 ---
 .../hidden/ObjectHiddenMethodFacetFactoryTest.java |   85 --
 .../cssclass/CssClassFacetMethodFactoryTest.java   |   71 --
 .../ident/cssclass/CssClassFacetMethodTest.java    |   85 --
 .../CssClassFacetMethodWithProblemTest.java        |   84 --
 .../ident/icon/IconFacetMethodFactoryTest.java     |   71 --
 .../object/ident/icon/IconFacetMethodTest.java     |   84 --
 .../ident/layout/LayoutFacetFactoryTest.java       |   71 --
 .../object/ident/layout/LayoutFacetMethodTest.java |   84 --
 .../ident/title/TitleFacetViaMethodTest.java       |   97 --
 .../title/TitleFacetViaMethodsFactoryTest.java     |  112 --
 .../TitleAnnotationFacetFactoryTest.java           |  263 -----
 .../TitleFacetViaTitleAnnotationTest.java          |  154 ---
 .../object/layoutxml/GridFacetDefaultTest.java     |   60 --
 .../navparent/NavigableParentFacetMethodTest.java  |   84 --
 .../NavigableParentAnnotationFacetFactoryTest.java |  113 --
 .../annotation/NavigableParentTestSamples.java     |   68 --
 ...SpecIdFacetDerivedFromClassNameFactoryTest.java |   67 --
 .../parseable/ParseableFacetUsingParserTest.java   |  131 ---
 .../facets/object/parseable/ValueProxy.java        |   23 -
 .../RecreatableObjectFacetFactoryTest.java         |   68 --
 .../ObjectValidMethodFacetFactoryTest.java         |   66 --
 ...eFacetAnnotationOrConfigurationFactoryTest.java |  504 ---------
 .../ordering/memberorder/DeweyOrderSetTest.java    |  265 -----
 .../MemberOrderAnnotationFacetFactoryTest.java     |  143 ---
 .../memberorder/MemberOrderComparatorTest.java     |  181 ----
 ...cetForParameterLayoutAnnotationFactoryTest.java |   58 -
 ...cetForParameterLayoutAnnotationFactoryTest.java |   79 --
 .../ParameterAnnotationFacetFactoryTest.java       |  388 -------
 ...lableAnnotationOnParameterFacetFactoryTest.java |  106 --
 ...RegExAnnotationOnParameterFacetFactoryTest.java |   79 --
 .../PropertyMethodsFacetFactoryTest.java           |  671 ------------
 ...romptStyleFacetFromPropertyAnnotation_Test.java |  185 ----
 ...sabledAnnotationOnPropertyFacetFactoryTest.java |  102 --
 .../MandatoryAnnotationFacetFactoryTest.java       |   71 --
 ...sistedAnnotationOnPropertyFacetFactoryTest.java |   71 --
 .../PropertyAnnotationFacetFactoryTest.java        |  869 ---------------
 ...llableAnnotationOnPropertyFacetFactoryTest.java |  118 ---
 .../RegExAnnotationOnPropertyFacetFactoryTest.java |   90 --
 ...acetForPropertyLayoutAnnotationFactoryTest.java |   68 --
 ...acetForPropertyLayoutAnnotationFactoryTest.java |   95 --
 ...ValidationDigitsAnnotationFacetFactoryTest.java |   80 --
 .../DomainObjectWithMustSatisfyAnnotations.java    |   48 -
 .../DomainObjectWithoutMustSatisfyAnnotations.java |   48 -
 .../SpecificationAlwaysSatisfied.java              |   31 -
 .../specification/SpecificationAndTests.java       |  111 --
 .../specification/SpecificationNeverSatisfied.java |   31 -
 .../specification/SpecificationNotTests.java       |   62 --
 .../specification/SpecificationOrTests.java        |  110 --
 ...cificationRequiresFirstLetterToBeUpperCase.java |   39 -
 .../BigDecimalValueSemanticsProviderTest.java      |   89 --
 .../value/BigIntValueSemanticsProviderTest.java    |   88 --
 .../value/BlobValueSemanticsProviderTest.java      |   65 --
 .../value/BooleanValueSemanticsProviderTest.java   |  113 --
 .../value/ByteValueSemanticsProviderTest.java      |   86 --
 .../value/CharacterValueSemanticsProviderTest.java |   79 --
 .../value/ClobValueSemanticsProviderTest.java      |   65 --
 .../value/DoubleValueSemanticsProviderTest.java    |   84 --
 .../value/FloatValueSemanticsProviderTest.java     |   93 --
 .../ImageValueSemanticsProviderAbstractTest.java   |  126 ---
 .../value/IntValueSemanticsProviderTest.java       |   80 --
 .../JavaSqlDateValueSemanticsProviderTest.java     |   91 --
 .../JavaSqlTimeValueSemanticsProviderTest.java     |   90 --
 .../JavaUtilDateValueSemanticsProviderTest.java    |   96 --
 .../value/LongValueSemanticsProviderTest.java      |   91 --
 .../value/PasswordValueSemanticsProviderTest.java  |   49 -
 .../value/ShortValueSemanticsProviderTest.java     |   87 --
 .../value/StringValueSemanticsProviderTest.java    |   80 --
 .../isis/metamodel/facets/value/TestClock.java     |   69 --
 .../ValueSemanticsProviderAbstractTestCase.java    |  165 ---
 ...odaLocalDateTimeValueSemanticsProviderTest.java |   81 --
 ...jectAssociationPredicatesTest_visibleWhere.java |  150 ---
 .../interactions/InteractionUtils_isA_Test.java    |  104 --
 .../ServiceInjectorDefaultTest_usingFields.java    |  144 ---
 ...erviceInjectorDefaultTest_validateServices.java |   81 --
 ...InjectorDefaultTest_validateServices_happy.java |   89 --
 .../services/ServiceInjectorLegacyTest.java        |  166 ---
 .../services/appfeat/ApplicationFeatureIdTest.java |  691 ------------
 .../ApplicationFeatureRepositoryDefaultTest.java   |  323 ------
 .../services/appfeat/ApplicationFeatureTest.java   |  163 ---
 .../appfeat/ApplicationFeatureTypeTest.java        |  191 ----
 ...eptionRecognizerDocDefault_recognizes_Test.java |   57 -
 .../isis/metamodel/services/grid/BS3GridTest.java  |  165 ---
 .../apache/isis/metamodel/services/grid/Foo.java   |   22 -
 .../apache/isis/metamodel/services/grid/Foo2.java  |   22 -
 .../apache/isis/metamodel/services/grid/Foo3.java  |   22 -
 .../apache/isis/metamodel/services/grid/Foo4.java  |   22 -
 ...dLoaderServiceDefault_resourceNameFor_Test.java |   58 -
 .../services/menubars/BS3MenuBarsTest.java         |   62 --
 .../metamodel/MetaModelServiceDefaultTest.java     |  242 -----
 .../spec/ObjectSpecIdTest_constructor.java         |   43 -
 .../spec/ObjectSpecIdTest_valueSemantics.java      |   38 -
 .../metamodel/specloader/ReflectorTestPojo.java    |   52 -
 .../specloader/SpecificationCacheDefaultTest.java  |  120 ---
 .../SpecificationLoaderTestAbstract.java           |  185 ----
 .../specloader/SpecificationLoaderTest_array.java  |   65 --
 .../SpecificationLoaderTest_collection.java        |   67 --
 .../specloader/SpecificationLoaderTest_value.java  |   46 -
 .../ClassSubstitutorTest_getClass.java             |   69 --
 .../IntrospectionState_comparable_Test.java        |   91 --
 .../specimpl/ObjectActionMixedInTest.java          |   64 --
 ...ionParameterAbstractTest_getId_and_getName.java |  214 ----
 .../specimpl/ObjectAssociationAbstractTest.java    |  211 ----
 ...ObjectAssociationAbstractTest_alwaysHidden.java |  229 ----
 .../specimpl/ObjectMemberAbstractTest.java         |   43 -
 .../testspec/ObjectSpecificationStub.java          |  358 -------
 .../dom/CustomerAsProxiedByDataNucleus.java        |    2 +-
 .../services/menubars/menubars.layout.xml          |    0
 .../org/apache/isis/runtime/IsisModuleRuntime.java |    2 +-
 .../apache/isis/runtime/context/IsisContext.java   |    2 +-
 .../runtime/context/session/RuntimeContext.java    |    6 +-
 .../context/session/RuntimeContextBase.java        |    8 +-
 .../persistence/adapter/ObjectAdapterForBean.java  |    8 +-
 .../runtime/persistence/adapter/PojoAdapter.java   |   12 +-
 .../persistence/session/PersistenceSession.java    |    8 +-
 .../session/PersistenceSessionFactory.java         |    2 +-
 .../transaction/AdapterAndProperty.java            |    8 +-
 .../transaction/AuditerDispatchService.java        |    6 +-
 .../transaction/ChangedObjectsService.java         |   10 +-
 .../apache/isis/runtime/session/IsisSession.java   |    4 +-
 .../runtime/session/IsisSessionFactoryDefault.java |    4 +-
 .../system/ObjectActionLayoutXmlDefaultTest.java   |   14 +-
 .../system/OneToManyAssociationDefaultTest.java    |   22 +-
 .../system/TypeExtractorMethodReturnTest.java      |    2 +-
 .../system/TypeExtractorMethodsParametersTest.java |    2 +-
 .../auth/AuthenticationSessionProviderDefault.java |    2 +-
 .../bookmarks/BookmarkServiceInternalDefault.java  |   12 +-
 .../command/CommandDtoServiceInternalDefault.java  |   16 +-
 .../command/CommandExecutorServiceDefault.java     |   18 +-
 .../factory/FactoryServiceDefault.java             |   10 +-
 .../homepage/HomePageResolverServiceDefault.java   |   20 +-
 .../ixn/InteractionDtoServiceInternalDefault.java  |   12 +-
 .../menubars/bootstrap3/MenuBarsServiceBS3.java    |   24 +-
 .../menubars/bootstrap3/ServiceAndAction.java      |    4 +-
 .../publish/PublishedObjectsDefault.java           |    4 +-
 .../publish/PublisherDispatchServiceDefault.java   |    6 +-
 .../repository/RepositoryServiceDefault.java       |    4 +-
 .../routing/RoutingServiceDefault.java             |    2 +-
 .../wrapper/WrapperFactoryDefault.java             |    2 +-
 .../AbstractCollectionInvocationHandler.java       |    2 +-
 .../handlers/CollectionInvocationHandler.java      |    4 +-
 .../DelegatingInvocationHandlerDefault.java        |    6 +-
 .../handlers/DomainObjectInvocationHandler.java    |   42 +-
 .../wrapper/handlers/MapInvocationHandler.java     |    4 +-
 .../wrapper/handlers/ProxyContextHandler.java      |    4 +-
 .../wrapper/internal/util/MethodPrefixFinder.java  |   26 +-
 .../wrapper/proxy/ProxyCreator.java                |    2 +-
 .../xmlsnapshot/XmlSnapshotBuilder.java            |    8 +-
 .../xmlsnapshot/XmlSnapshotServiceDefault.java     |    6 +-
 .../webapp/context/IsisWebAppCommonContext.java    |    8 +-
 .../isis/webapp/context/memento/ObjectMemento.java |    2 +-
 .../context/memento/ObjectMementoCollection.java   |    2 +-
 .../context/memento/ObjectMementoService.java      |    6 +-
 .../templresources/TemplateResourceServlet.java    |    6 +-
 .../apache/isis/webapp/routing/RedirectFilter.java |    2 +-
 .../isis/webapp/routing/RedirectServlet.java       |    2 +-
 .../bootstrapping/AutoConfigurationTest.java       |    4 +-
 .../SpringServiceInjectOrderTest.java              |    2 +-
 .../SpringServiceProvisioningTest.java             |    2 +-
 .../DomainModelTest_usingBadDomain.java            |    4 +-
 ...nModelTest_usingBadDomain_noActionEnforced.java |    4 +-
 .../DomainModelTest_usingGoodDomain.java           |    6 +-
 .../domainmodel/SpecloaderPerformanceTest.java     |    2 +-
 .../publishing/PublisherServiceTest.java           |    2 +-
 .../bootstrapping/builtin-domain-services.list     |    4 +-
 .../api/permission/ApplicationPermission.java      |    2 +-
 .../api/permission/ApplicationPermissionMode.java  |    2 +-
 .../ApplicationPermissionRepository.java           |    2 +-
 .../api/permission/ApplicationPermissionRule.java  |    2 +-
 .../api/permission/ApplicationPermissionValue.java |    2 +-
 .../permission/ApplicationPermissionValueSet.java  |    2 +-
 .../permission/PermissionsEvaluationService.java   |    2 +-
 .../PermissionsEvaluationServiceAbstract.java      |    2 +-
 .../extensions/secman/api/user/AccountType.java    |    2 +-
 .../secman/api/user/ApplicationUserStatus.java     |    2 +-
 .../secman/model/app/feature/ApplicationClass.java |    2 +-
 .../model/app/feature/ApplicationClassAction.java  |    2 +-
 .../app/feature/ApplicationClassCollection.java    |    2 +-
 .../model/app/feature/ApplicationClassMember.java  |    2 +-
 .../app/feature/ApplicationClassProperty.java      |    2 +-
 .../app/feature/ApplicationFeatureViewModel.java   |    8 +-
 .../app/feature/ApplicationFeatureViewModels.java  |    4 +-
 .../model/app/feature/ApplicationPackage.java      |    4 +-
 .../app/feature/ApplicationPermission_feature.java |    4 +-
 .../user/ApplicationUser_filterPermissions.java    |    6 +-
 .../app/user/ApplicationUser_permissions.java      |    4 +-
 .../model/app/user/UserPermissionViewModel.java    |    8 +-
 .../model/facets/TenantedAuthorizationFacet.java   |    6 +-
 .../facets/TenantedAuthorizationFacetDefault.java  |   10 +-
 .../facets/TenantedAuthorizationFacetFactory.java  |    8 +-
 .../jdo/dom/permission/ApplicationPermission.java  |    8 +-
 .../ApplicationPermissionRepository.java           |    8 +-
 .../secman/jdo/dom/role/ApplicationRole.java       |    4 +-
 .../secman/jdo/dom/user/ApplicationUser.java       |    2 +-
 .../AbstractRoleAndPermissionsFixtureScript.java   |    2 +-
 .../secman/shiro/PermissionForMember.java          |    2 +-
 .../ui/components/ExcelFileModel.java              |    8 +-
 .../pdfjs/metamodel/facet/PdfJsViewerFacet.java    |    2 +-
 .../metamodel/facet/PdfJsViewerFacetAbstract.java  |    6 +-
 .../facet/PdfJsViewerFacetFromAnnotation.java      |    2 +-
 .../PdfJsViewerFacetFromAnnotationFactory.java     |   12 +-
 .../pdfjs/ui/components/PdfJsViewerPanel.java      |    2 +-
 .../PdfJsViewerPanelComponentFactory.java          |    2 +-
 .../SupportingMethodValidatorRefinerFactory.java   |   16 +-
 .../services/IncubatorMetaModelPlugin.java         |    4 +-
 .../facets/value/color/ColorValueFacet.java        |    4 +-
 ...lorValueFacetUsingSemanticsProviderFactory.java |    4 +-
 .../value/color/ColorValueSemanticsProvider.java   |   10 +-
 .../facets/value/money/MoneyValueFacet.java        |    4 +-
 ...neyValueFacetUsingSemanticsProviderFactory.java |    4 +-
 .../value/money/MoneyValueSemanticsProvider.java   |   12 +-
 ...ageValueFacetUsingSemanticsProviderFactory.java |    4 +-
 .../PercentageValueSemanticsProvider.java          |   12 +-
 .../value/ColorValueSemanticsProviderTest.java     |    8 +-
 .../value/MoneyValueSemanticsProviderTest.java     |   10 +-
 .../PercentageValueSemanticsProviderTest.java      |    8 +-
 .../PolishMoneyValueSemanticsProviderTest.java     |   10 +-
 .../runtime/system/persistence/ObjectFactory.java  |    2 +-
 .../runtime/viewer/web/WebAppSpecification.java    |    2 +-
 .../datanucleus/DataNucleusContextUtil.java        |    2 +-
 .../datanucleus/DataNucleusException.java          |    2 +-
 .../datanucleus/JDOStateManagerForIsis.java        |    2 +-
 .../datanucleus/metamodel/JdoPropertyUtils.java    |    8 +-
 .../commands/AbstractDataNucleusObjectCommand.java |    2 +-
 .../commands/DataNucleusCreateObjectCommand.java   |    2 +-
 .../commands/DataNucleusDeleteObjectCommand.java   |    2 +-
 .../PersistenceQueryFindAllInstancesProcessor.java |    2 +-
 ...sistenceQueryFindUsingApplibQueryProcessor.java |   10 +-
 .../queries/PersistenceQueryProcessor.java         |    2 +-
 .../queries/PersistenceQueryProcessorAbstract.java |    2 +-
 .../datanucleus/persistence/queries/QueryUtil.java |    2 +-
 .../persistence/spi/JdoObjectIdSerializer.java     |    6 +-
 .../service/JdoPersistenceLifecycleService.java    |    2 +-
 .../datanucleus5/jdosupport/IsisJdoSupportDN5.java |    4 +-
 .../metamodel/JdoProgrammingModelPlugin.java       |   26 +-
 ...JdoDatastoreIdentityAnnotationFacetFactory.java |    8 +-
 .../JdoDatastoreIdentityFacet.java                 |    2 +-
 .../JdoDatastoreIdentityFacetAbstract.java         |    6 +-
 .../JdoDatastoreIdentityFacetAnnotation.java       |    2 +-
 .../JdoDatastoreIdentityFacetImpl.java             |    2 +-
 .../JdoDiscriminatorAnnotationFacetFactory.java    |   18 +-
 .../discriminator/JdoDiscriminatorFacet.java       |    2 +-
 .../JdoDiscriminatorFacetDefault.java              |    4 +-
 ...nferredFromJdoDiscriminatorValueAnnotation.java |    4 +-
 ...cIdFacetForJdoPersistenceCapableAnnotation.java |    6 +-
 ...doPersistenceCapableAnnotationFacetFactory.java |   14 +-
 .../JdoPersistenceCapableFacet.java                |    2 +-
 .../JdoPersistenceCapableFacetAbstract.java        |    8 +-
 .../JdoPersistenceCapableFacetAnnotation.java      |    2 +-
 .../JdoPersistenceCapableFacetImpl.java            |   10 +-
 .../facets/object/query/JdoNamedQuery.java         |    4 +-
 .../object/query/JdoQueriesFacetAnnotation.java    |    2 +-
 .../query/JdoQueryAnnotationFacetFactory.java      |   12 +-
 .../facets/object/query/JdoQueryFacet.java         |    2 +-
 .../facets/object/query/JdoQueryFacetAbstract.java |    8 +-
 .../object/query/JdoQueryFacetAnnotation.java      |    2 +-
 .../object/query/VisitorForClauseAbstract.java     |   10 +-
 .../facets/object/query/VisitorForFromClause.java  |    8 +-
 .../object/query/VisitorForVariablesClause.java    |    8 +-
 .../version/JdoVersionAnnotationFacetFactory.java  |   20 +-
 .../facets/object/version/JdoVersionFacet.java     |    2 +-
 .../version/JdoVersionFacetFromAnnotation.java     |    4 +-
 ...DerivedFromJdoColumnAnnotationFacetFactory.java |   28 +-
 .../BigDecimalFacetDerivedFromJdoColumn.java       |    8 +-
 .../prop/column/BigDecimalFacetFallback.java       |   10 +-
 .../column/MandatoryFacetDerivedFromJdoColumn.java |    4 +-
 ...ndatoryFacetInferredFromAbsenceOfJdoColumn.java |    4 +-
 ...ndatoryFromJdoColumnAnnotationFacetFactory.java |   30 +-
 ...DerivedFromJdoColumnAnnotationFacetFactory.java |   28 +-
 .../column/MaxLengthFacetDerivedFromJdoColumn.java |    4 +-
 .../JdoNotPersistentAnnotationFacetFactory.java    |    8 +-
 .../prop/notpersistent/JdoNotPersistentFacet.java  |    4 +-
 .../JdoNotPersistentFacetAbstract.java             |    6 +-
 .../JdoNotPersistentFacetAnnotation.java           |    2 +-
 .../notpersistent/JdoNotPersistentFacetImpl.java   |    2 +-
 ...FacetDerivedFromJdoNotPersistentAnnotation.java |    4 +-
 ...ledFacetDerivedFromJdoPrimaryKeyAnnotation.java |    4 +-
 .../JdoPrimaryKeyAnnotationFacetFactory.java       |    6 +-
 .../facets/prop/primarykey/JdoPrimaryKeyFacet.java |    4 +-
 .../primarykey/JdoPrimaryKeyFacetAbstract.java     |    6 +-
 .../primarykey/JdoPrimaryKeyFacetAnnotation.java   |    2 +-
 .../prop/primarykey/JdoPrimaryKeyFacetImpl.java    |    2 +-
 ...nalFacetDerivedFromJdoPrimaryKeyAnnotation.java |    6 +-
 .../util/JdoPrimaryKeyPropertyPredicate.java       |    8 +-
 .../objectadapter/ObjectAdapterContext.java        |   28 +-
 .../ObjectAdapterContext_DependencyInjection.java  |    2 +-
 .../ObjectAdapterContext_Factories.java            |   10 +-
 ...ObjectAdapterContext_LifecycleEventSupport.java |    4 +-
 .../ObjectAdapterContext_NewIdentifier.java        |   10 +-
 ...ctAdapterContext_ObjectAdapterByIdProvider.java |   18 +-
 ...ObjectAdapterContext_ObjectAdapterProvider.java |   10 +-
 .../ObjectAdapterContext_ObjectCreation.java       |   16 +-
 .../DataNucleusApplicationComponents5.java         |    4 +-
 .../persistence/IsisLifecycleListener.java         |    2 +-
 .../persistence/IsisPersistenceSessionJdo.java     |    2 +-
 .../persistence/IsisPersistenceSessionJdoBase.java |   10 +-
 .../persistence/IsisTransactionJdo.java            |    6 +-
 .../persistence/PersistenceSession5.java           |   54 +-
 .../persistence/PersistenceSessionFactory5.java    |    2 +-
 .../persistence/command/PersistenceCommand.java    |    2 +-
 .../command/PersistenceCommandAbstract.java        |    2 +-
 .../persistence/query/PersistenceQuery.java        |    2 +-
 .../query/PersistenceQueryAbstract.java            |    2 +-
 .../persistence/query/PersistenceQueryFactory.java |    8 +-
 .../query/PersistenceQueryFindAllInstances.java    |    4 +-
 ...ersistenceQueryFindUsingApplibQueryDefault.java |   10 +-
 .../ObjectReflectorDefaultTest_object.java         |   81 ++
 .../ObjectReflectorDefaultTest_object.java         |   81 --
 ...atastoreIdentityAnnotationFacetFactoryTest.java |    8 +-
 ...JdoDiscriminatorAnnotationFacetFactoryTest.java |   14 +-
 ...rsistenceCapableAnnotationFacetFactoryTest.java |   10 +-
 .../JdoVersionAnnotationFacetFactoryTest.java      |    8 +-
 ...AnnotationFacetFactoryTest_refineMetaModel.java |   14 +-
 ...vedFromJdoColumnAnnotationFacetFactoryTest.java |   10 +-
 ...vedFromJdoColumnAnnotationFacetFactoryTest.java |    8 +-
 ...JdoNotPersistentAnnotationFacetFactoryTest.java |   10 +-
 ...venJdoPrimaryKeyAnnotationFacetFactoryTest.java |   12 +-
 .../adapterfactory/pojo/PojoAdapterTest.java       |    8 +-
 .../transaction/PojoAdapterBuilder.java            |   10 +-
 .../runtime/system/ObjectMemberAbstractTest.java   |   48 +-
 .../WrapperFactoryDefault_wrappedObject_Test.java  |   44 +-
 ...actoryDefault_wrappedObject_transient_Test.java |   36 +-
 .../base/applib/matchers/IsisMatchers.java         |    2 +-
 .../excel/applib/dom/util/CellMarshaller.java      |    6 +-
 .../excel/applib/dom/util/ExcelConverter.java      |   16 +-
 .../excel/applib/dom/util/ExcelServiceImpl.java    |    4 +-
 .../applib/validate/ValidateDomainModel.java       |    8 +-
 .../sse/applib/value/ListeningMarkup.java          |    2 +-
 .../facets/SseAnnotationFacetFactory.java          |   10 +-
 .../sse/metamodel/facets/SseObserveFacet.java      |    2 +-
 .../metamodel/facets/SseObserveFacetAbstract.java  |    8 +-
 ...eObserveFacetForServerSentEventsAnnotation.java |    2 +-
 .../restfulobjects/rendering/IResourceContext.java |    8 +-
 .../viewer/restfulobjects/rendering/OidUtils.java  |    6 +-
 .../rendering/ReprRendererAbstract.java            |    6 +-
 .../AbstractObjectMemberReprRenderer.java          |   13 +-
 .../domainobjects/ActionResultReprRenderer.java    |    7 +-
 .../domainobjects/CollectionSemantics.java         |    2 +-
 .../domainobjects/DomainObjectLinkTo.java          |    4 +-
 .../domainobjects/DomainObjectReprRenderer.java    |   22 +-
 .../domainobjects/DomainServiceLinkTo.java         |    4 +-
 .../rendering/domainobjects/JsonValueEncoder.java  |   12 +-
 .../domainobjects/JsonValueEncoder_Converters.java |    2 +-
 .../rendering/domainobjects/ListReprRenderer.java  |    4 +-
 .../rendering/domainobjects/MemberType.java        |   30 +-
 .../rendering/domainobjects/MutatorSpec.java       |    2 +-
 .../domainobjects/ObjectActionReprRenderer.java    |   10 +-
 .../domainobjects/ObjectAdapterLinkTo.java         |    4 +-
 .../rendering/domainobjects/ObjectAndAction.java   |    4 +-
 .../domainobjects/ObjectAndActionInvocation.java   |   10 +-
 .../domainobjects/ObjectAndCollection.java         |    4 +-
 .../domainobjects/ObjectAndCollection2.java        |    4 +-
 .../rendering/domainobjects/ObjectAndMember.java   |    4 +-
 .../rendering/domainobjects/ObjectAndProperty.java |    4 +-
 .../domainobjects/ObjectAndProperty2.java          |    4 +-
 .../ObjectCollectionReprRenderer.java              |    8 +-
 .../domainobjects/ObjectPropertyReprRenderer.java  |   16 +-
 .../domainobjects/ScalarValueReprRenderer.java     |    6 +-
 .../AbstractTypeFeatureReprRenderer.java           |    4 +-
 .../AbstractTypeMemberReprRenderer.java            |    2 +-
 .../domaintypes/ActionDescriptionReprRenderer.java |    8 +-
 .../ActionParameterDescriptionReprRenderer.java    |    8 +-
 .../CollectionDescriptionReprRenderer.java         |    4 +-
 .../domaintypes/DomainTypeReprRenderer.java        |   12 +-
 .../domaintypes/ObjectSpecAndSuperSpec.java        |    2 +-
 .../rendering/domaintypes/ParentSpecAndAction.java |    4 +-
 .../domaintypes/ParentSpecAndActionParam.java      |    4 +-
 .../domaintypes/ParentSpecAndCollection.java       |    4 +-
 .../domaintypes/ParentSpecAndFeature.java          |    4 +-
 .../domaintypes/ParentSpecAndProperty.java         |    4 +-
 .../PropertyDescriptionReprRenderer.java           |    6 +-
 .../domaintypes/TypeActionResultReprRenderer.java  |    2 +-
 .../domaintypes/TypeListReprRenderer.java          |    2 +-
 .../rendering/service/RepresentationService.java   |    2 +-
 .../RepresentationServiceContentNegotiator.java    |    2 +-
 .../service/conneg/ContentNegotiationService.java  |    2 +-
 .../conneg/ContentNegotiationServiceAbstract.java  |    2 +-
 ...entNegotiationServiceForRestfulObjectsV1_0.java |   10 +-
 .../ContentNegotiationServiceOrgApacheIsisV1.java  |   16 +-
 .../ContentNegotiationServiceXRoDomainType.java    |    2 +-
 .../service/swagger/internal/ClassExcluder.java    |    4 +-
 .../swagger/internal/ClassExcluderAbstract.java    |    4 +-
 .../service/swagger/internal/Generation.java       |   24 +-
 .../swagger/internal/SwaggerSpecGenerator.java     |    2 +-
 .../rendering/service/swagger/internal/Util.java   |   16 +-
 .../JsonValueEncoderTest_appendValueAndFormat.java |   10 +-
 .../JsonValueEncoderTest_asAdapter.java            |   14 +-
 .../JsonValueEncoderTest_asObject.java             |   12 +-
 .../viewer/context/ResourceContext.java            |    8 +-
 .../mappers/ExceptionMapperForObjectNotFound.java  |    2 +-
 .../restfulobjects/viewer/mappers/FailureUtil.java |    2 +-
 .../resources/DomainObjectResourceServerside.java  |   18 +-
 .../viewer/resources/DomainResourceHelper.java     |   10 +-
 .../resources/DomainServiceResourceServerside.java |    8 +-
 .../resources/DomainTypeResourceServerside.java    |   18 +-
 .../viewer/resources/HomePageReprRenderer.java     |    4 +-
 .../resources/HomePageResourceServerside.java      |    2 +-
 .../viewer/resources/ImageResourceServerside.java  |    2 +-
 .../viewer/resources/JsonParserHelper.java         |    8 +-
 .../resources/MenuBarsResourceServerside.java      |    2 +-
 .../viewer/resources/ObjectActionArgHelper.java    |   14 +-
 .../resources/ObjectAdapterAccessHelper.java       |   18 +-
 .../resources/ObjectAdapterUpdateHelper.java       |   14 +-
 .../viewer/resources/ResourceAbstract.java         |    8 +-
 .../viewer/resources/UserResourceServerside.java   |    2 +-
 .../resources/VersionResourceServerside.java       |    2 +-
 .../webmodule/IsisRestfulObjectsSessionFilter.java |    6 +-
 ..._ensureCompatibleAcceptHeader_ContractTest.java |    6 +-
 .../context/ResourceContext_getArg_Test.java       |    6 +-
 .../wicket/model/common/OnSelectionHandler.java    |    2 +-
 .../viewer/wicket/model/links/LinkAndLabel.java    |    6 +-
 .../wicket/model/mementos/ActionMemento.java       |   10 +-
 .../model/mementos/ActionParameterMemento.java     |    8 +-
 .../wicket/model/mementos/CollectionMemento.java   |    8 +-
 .../wicket/model/mementos/PageParameterNames.java  |    4 +-
 .../wicket/model/mementos/PropertyMemento.java     |    8 +-
 .../wicket/model/models/ActionArgumentModel.java   |    2 +-
 .../viewer/wicket/model/models/ActionModel.java    |   30 +-
 .../wicket/model/models/BookmarkTreeNode.java      |   12 +-
 .../model/models/BookmarkTreeNodeComparator.java   |    6 +-
 .../wicket/model/models/BookmarkedPagesModel.java  |    2 +-
 .../wicket/model/models/EntityCollectionModel.java |   26 +-
 .../viewer/wicket/model/models/EntityModel.java    |   16 +-
 .../model/models/EntityModelForReference.java      |    4 +-
 .../wicket/model/models/ImageResourceCache.java    |    4 +-
 .../wicket/model/models/ObjectAdapterModel.java    |    4 +-
 .../viewer/wicket/model/models/ScalarModel.java    |   38 +-
 .../model/models/ScalarModelWithMultiPending.java  |    2 +-
 .../wicket/model/models/ServiceActionsModel.java   |    4 +-
 .../viewer/wicket/model/models/ValueModel.java     |    4 +-
 .../isis/viewer/wicket/model/models/VoidModel.java |    2 +-
 .../models/whereami/WhereAmIModelDefault.java      |    2 +-
 .../wicket/model/models/EntityModel_hintsTest.java |    4 +-
 .../models/LowestCommonSuperclassClosureTest.java  |    2 +-
 .../ScalarModel_isScalarSubtypingAnyOf_Test.java   |    8 +-
 .../wicket/ui/CollectionContentsAsFactory.java     |    4 +-
 .../isis/viewer/wicket/ui/ComponentType.java       |    4 +-
 .../actionresponse/ActionResultResponseType.java   |    6 +-
 .../ui/components/about/JarManifestModel.java      |    2 +-
 .../ui/components/actioninfo/ActionInfoPanel.java  |    2 +-
 .../components/actionmenu/CssClassFaBehavior.java  |    2 +-
 .../entityactions/AdditionalLinksPanel.java        |    2 +-
 .../entityactions/EntityActionLinkFactory.java     |    4 +-
 .../actionmenu/entityactions/LinkAndLabelUtil.java |    4 +-
 .../actionmenu/serviceactions/CssMenuItem.java     |   12 +-
 .../serviceactions/ServiceActionLinkFactory.java   |    2 +-
 .../serviceactions/ServiceActionUtil.java          |    2 +-
 .../serviceactions/ServiceAndAction.java           |    2 +-
 .../actionprompt/ActionPromptHeaderPanel.java      |    4 +-
 .../actions/ActionFormExecutorStrategy.java        |    2 +-
 .../components/actions/ActionParametersForm.java   |    8 +-
 .../actions/ActionParametersFormPanel.java         |    2 +-
 .../components/actions/ActionParametersPanel.java  |    1 -
 .../bookmarkedpages/BookmarkedPagesPanel.java      |    8 +-
 .../collection/AssociatedWithActionsHelper.java    |   12 +-
 .../ui/components/collection/CollectionPanel.java  |    6 +-
 .../selector/CollectionSelectorHelper.java         |    4 +-
 .../selector/CollectionSelectorPanel.java          |    2 +-
 .../CollectionContentsAsAjaxTablePanel.java        |   20 +-
 .../CollectionContentsSortableDataProvider.java    |   18 +-
 .../ajaxtable/IsisAjaxFallbackDataTable.java       |    2 +-
 .../columns/ObjectAdapterPropertyColumn.java       |    4 +-
 .../columns/ObjectAdapterTitleColumn.java          |    2 +-
 .../columns/ObjectAdapterToggleboxColumn.java      |    2 +-
 .../icons/CollectionContentsAsIconsPanel.java      |    2 +-
 .../CollectionContentsAsIconsPanelFactory.java     |    4 +-
 .../summary/CollectionContentsAsSummary.java       |   10 +-
 .../CollectionContentsAsSummaryFactory.java        |    8 +-
 .../entity/EntityComponentFactoryAbstract.java     |    4 +-
 .../entity/collection/EntityCollectionPanel.java   |   10 +-
 .../components/entity/fieldset/PropertyGroup.java  |   14 +-
 .../entity/header/EntityHeaderPanel.java           |    2 +-
 .../entity/icontitle/EntityIconAndTitlePanel.java  |    6 +-
 .../icontitle/EntityIconAndTitlePanelFactory.java  |    4 +-
 .../selector/links/EntityLinksSelectorPanel.java   |    2 +-
 .../links/EntityLinksSelectorPanelFactory.java     |    4 +-
 .../ui/components/property/PropertyEditPanel.java  |    4 +-
 .../property/PropertyFormExecutorStrategy.java     |    2 +-
 .../PropertyEditPromptHeaderPanel.java             |    4 +-
 .../components/scalars/IsisConverterLocator.java   |    6 +-
 .../ui/components/scalars/ScalarPanelAbstract.java |    8 +-
 .../components/scalars/ScalarPanelAbstract2.java   |   18 +-
 .../scalars/ScalarPanelSelect2Abstract.java        |    2 +-
 .../scalars/ScalarPanelTextFieldAbstract.java      |   10 +-
 .../ScalarPanelTextFieldDatePickerAbstract.java    |    2 +-
 .../ScalarPanelTextFieldParseableAbstract.java     |    4 +-
 .../ui/components/scalars/TextFieldValueModel.java |    2 +-
 .../scalars/image/JavaAwtImagePanel.java           |    4 +-
 .../scalars/image/JavaAwtImagePanelFactory.java    |    4 +-
 .../isisapplib/IsisBlobOrClobPanelAbstract.java    |    4 +-
 .../components/scalars/markup/MarkupComponent.java |    2 +-
 .../components/scalars/primitive/BooleanPanel.java |    4 +-
 .../scalars/reference/EntityLinkSelect2Panel.java  |    2 +-
 .../scalars/reference/ReferencePanel.java          |    6 +-
 .../scalars/reference/ReferencePanelFactory.java   |    4 +-
 .../scalars/string/MultiLineStringPanel.java       |    6 +-
 .../scalars/string/StringPanelFactory.java         |    2 +-
 .../scalars/value/ValuePanelFactory.java           |    2 +-
 .../valuechoices/ValueChoicesSelect2Panel.java     |    2 +-
 .../StandaloneCollectionPanel.java                 |    2 +-
 .../components/tree/IsisToWicketTreeAdapter.java   |    4 +-
 .../ui/components/unknown/UnknownModelPanel.java   |    2 +-
 .../widgets/breadcrumbs/BreadcrumbModel.java       |    6 +-
 .../widgets/breadcrumbs/BreadcrumbPanel.java       |    4 +-
 .../entitysimplelink/EntityLinkSimplePanel.java    |    2 +-
 .../EntityLinkSimplePanelFactory.java              |    4 +-
 .../widgets/linkandlabel/ActionLink.java           |    4 +-
 .../widgets/linkandlabel/ActionLinkFactory.java    |    2 +-
 .../linkandlabel/ActionLinkFactoryAbstract.java    |   14 +-
 .../ui/components/widgets/select2/ChoiceExt.java   |    2 +-
 .../widgets/select2/Select2ChoiceExt.java          |    2 +-
 .../widgets/select2/Select2MultiChoiceExt.java     |    2 +-
 .../ObjectAdapterMementoProviderAbstract.java      |    8 +-
 ...entoProviderForReferenceObjectAutoComplete.java |    4 +-
 ...derForReferenceParamOrPropertyAutoComplete.java |    2 +-
 .../widgets/zclip/ZeroClipboardPanel.java          |    2 +-
 .../viewer/wicket/ui/errors/ExceptionModel.java    |    2 +-
 .../viewer/wicket/ui/pages/entity/EntityPage.java  |   12 +-
 .../isis/viewer/wicket/ui/panels/FormAbstract.java |    2 +-
 .../wicket/ui/panels/FormExecutorDefault.java      |    8 +-
 .../wicket/ui/panels/FormExecutorStrategy.java     |    2 +-
 .../isis/viewer/wicket/ui/panels/PanelBase.java    |    2 +-
 .../wicket/ui/panels/PromptFormAbstract.java       |    2 +-
 .../ui/ComponentFactoryAbstractTest_init.java      |    4 +-
 ...ollectionContentsSelectorDropdownPanelTest.java |    4 +-
 ...tAdapterMementoProviderForValueChoicesTest.java |    6 +-
 .../integration/ConverterForObjectAdapter.java     |   10 +-
 .../ConverterForObjectAdapterMemento.java          |    6 +-
 .../viewer/integration/WebRequestCycleForIsis.java |    4 +-
 .../ComponentFactoryRegistryDefault.java           |    2 +-
 .../viewer/services/DeepLinkServiceWicket.java     |    4 +-
 .../services/ImageResourceCacheClassPath.java      |    8 +-
 .../viewer/services/mementos/CollectionData.java   |    2 +-
 .../wicket/viewer/services/mementos/Data.java      |    4 +-
 .../viewer/services/mementos/ObjectData.java       |    2 +-
 .../viewer/services/mementos/ObjectMarshaller.java |   18 +-
 .../services/mementos/ObjectMementoLegacy.java     |   16 +-
 .../mementos/ObjectMementoServiceWicket.java       |   10 +-
 .../services/mementos/ObjectUnmarshaller.java      |   36 +-
 .../viewer/services/mementos/StandaloneData.java   |    8 +-
 .../viewer/wicketapp/IsisWicketApplication.java    |    4 +-
 .../wicketapp/IsisWicketApplication_Defaults.java  |    2 +-
 3160 files changed, 120558 insertions(+), 120580 deletions(-)

diff --git a/core/config/src/main/java/org/apache/isis/core/config/presets/DebugMetaModel.properties b/core/config/src/main/java/org/apache/isis/core/config/presets/DebugMetaModel.properties
index 92500e0..c6e2e2a 100644
--- a/core/config/src/main/java/org/apache/isis/core/config/presets/DebugMetaModel.properties
+++ b/core/config/src/main/java/org/apache/isis/core/config/presets/DebugMetaModel.properties
@@ -16,4 +16,4 @@
 #  under the License.
 
 logging.level.org.apache.isis.metamodel.specloader.MetaModelValidatorServiceDefault = DEBUG
-logging.level.org.apache.isis.metamodel.specloader.SpecificationLoaderDefault = DEBUG
\ No newline at end of file
+logging.level.SpecificationLoaderDefault = DEBUG
\ No newline at end of file
diff --git a/core/config/src/main/java/org/apache/isis/core/config/presets/DebugProgrammingModel.properties b/core/config/src/main/java/org/apache/isis/core/config/presets/DebugProgrammingModel.properties
index ce27d89..631c685 100644
--- a/core/config/src/main/java/org/apache/isis/core/config/presets/DebugProgrammingModel.properties
+++ b/core/config/src/main/java/org/apache/isis/core/config/presets/DebugProgrammingModel.properties
@@ -15,5 +15,5 @@
 #  specific language governing permissions and limitations
 #  under the License.
 
-logging.level.org.apache.isis.metamodel.specloader.ProgrammingModelServiceDefault = DEBUG
-logging.level.org.apache.isis.metamodel.specloader.specimpl.FacetedMethodsBuilder = DEBUG
+logging.level.ProgrammingModelServiceDefault = DEBUG
+logging.level.FacetedMethodsBuilder = DEBUG
diff --git a/core/config/src/main/java/org/apache/isis/core/config/presets/SilenceMetaModel.properties b/core/config/src/main/java/org/apache/isis/core/config/presets/SilenceMetaModel.properties
index 03be4e2..573565c 100644
--- a/core/config/src/main/java/org/apache/isis/core/config/presets/SilenceMetaModel.properties
+++ b/core/config/src/main/java/org/apache/isis/core/config/presets/SilenceMetaModel.properties
@@ -16,4 +16,4 @@
 #  under the License.
 
 logging.level.org.apache.isis.metamodel.specloader.MetaModelValidatorServiceDefault = WARN
-logging.level.org.apache.isis.metamodel.specloader.SpecificationLoaderDefault = WARN
\ No newline at end of file
+logging.level.SpecificationLoaderDefault = WARN
\ No newline at end of file
diff --git a/core/config/src/main/java/org/apache/isis/core/config/presets/SilenceProgrammingModel.properties b/core/config/src/main/java/org/apache/isis/core/config/presets/SilenceProgrammingModel.properties
index ff10cdc..8907faf 100644
--- a/core/config/src/main/java/org/apache/isis/core/config/presets/SilenceProgrammingModel.properties
+++ b/core/config/src/main/java/org/apache/isis/core/config/presets/SilenceProgrammingModel.properties
@@ -15,5 +15,5 @@
 #  specific language governing permissions and limitations
 #  under the License.
 
-logging.level.org.apache.isis.metamodel.specloader.ProgrammingModelServiceDefault = WARN
-logging.level.org.apache.isis.metamodel.specloader.specimpl.FacetedMethodsBuilder = WARN
+logging.level.ProgrammingModelServiceDefault = WARN
+logging.level.FacetedMethodsBuilder = WARN
diff --git a/core/detached-tests/src/test/java/org/apache/isis/core/commons/internal/reflection/ReflectTest.java b/core/detached-tests/src/test/java/org/apache/isis/core/commons/internal/reflection/ReflectTest.java
index b9dd308..993bb45 100644
--- a/core/detached-tests/src/test/java/org/apache/isis/core/commons/internal/reflection/ReflectTest.java
+++ b/core/detached-tests/src/test/java/org/apache/isis/core/commons/internal/reflection/ReflectTest.java
@@ -34,7 +34,7 @@ import static org.junit.jupiter.api.Assertions.assertNotNull;
 import org.apache.isis.applib.annotation.Programmatic;
 import org.apache.isis.applib.services.jaxb.JaxbServiceDefault;
 import org.apache.isis.core.commons.internal.reflection._Reflect.InterfacePolicy;
-import org.apache.isis.metamodel.services.user.UserServiceDefault;
+import org.apache.isis.core.metamodel.services.user.UserServiceDefault;
 
 import static org.apache.isis.core.commons.internal.reflection._Reflect.getAnnotation;
 import static org.apache.isis.core.commons.internal.reflection._Reflect.streamAllMethods;
@@ -55,7 +55,7 @@ class ReflectTest {
                 .collect(Collectors.joining(",\n"));
 
         assertEquals(""
-                + "org.apache.isis.metamodel.services.user.UserServiceDefault$SudoServiceSpi,\n"
+                + "UserServiceDefault$SudoServiceSpi,\n"
                 + "java.lang.Object", 
                 typeListLiteral);
 
@@ -71,7 +71,7 @@ class ReflectTest {
                 .collect(Collectors.joining(",\n"));
 
         assertEquals(
-                "org.apache.isis.metamodel.services.user.UserServiceDefault$SudoServiceSpi,\n"
+                "UserServiceDefault$SudoServiceSpi,\n"
                         + "org.apache.isis.applib.services.sudo.SudoService$Spi,\n"
                         + "java.lang.Object", 
                         typeListLiteral);
@@ -91,8 +91,8 @@ class ReflectTest {
         assertEquals(""
                 + "public abstract void org.apache.isis.applib.services.sudo.SudoService$Spi.releaseRunAs(),\n"
                 + "public abstract void org.apache.isis.applib.services.sudo.SudoService$Spi.runAs(java.lang.String,java.util.List),\n"
-                + "public void org.apache.isis.metamodel.services.user.UserServiceDefault$SudoServiceSpi.releaseRunAs(),\n"
-                + "public void org.apache.isis.metamodel.services.user.UserServiceDefault$SudoServiceSpi.runAs(java.lang.String,java.util.List)"
+                + "public void UserServiceDefault$SudoServiceSpi.releaseRunAs(),\n"
+                + "public void UserServiceDefault$SudoServiceSpi.runAs(java.lang.String,java.util.List)"
                 ,
                 typeListLiteral);
 
diff --git a/core/detached-tests/src/test/java/org/apache/isis/core/metamodel/facets/object/mixin/MixinIntendedAs.java b/core/detached-tests/src/test/java/org/apache/isis/core/metamodel/facets/object/mixin/MixinIntendedAs.java
index 8d48977..9ebfeaa 100644
--- a/core/detached-tests/src/test/java/org/apache/isis/core/metamodel/facets/object/mixin/MixinIntendedAs.java
+++ b/core/detached-tests/src/test/java/org/apache/isis/core/metamodel/facets/object/mixin/MixinIntendedAs.java
@@ -29,19 +29,19 @@ import org.apache.isis.applib.Identifier;
 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.metamodel.MetaModelContext_forTesting;
-import org.apache.isis.metamodel.context.MetaModelContext;
-import org.apache.isis.metamodel.facetapi.FacetHolder;
-import org.apache.isis.metamodel.facetapi.FeatureType;
-import org.apache.isis.metamodel.facetapi.MethodRemover;
-import org.apache.isis.metamodel.facets.AbstractFacetFactoryTest;
-import org.apache.isis.metamodel.facets.FacetFactory;
-import org.apache.isis.metamodel.facets.FacetedMethodParameter;
-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.services.title.TitleServiceDefault;
+import org.apache.isis.core.metamodel.MetaModelContext_forTesting;
+import org.apache.isis.core.metamodel.context.MetaModelContext;
+import org.apache.isis.core.metamodel.facetapi.FacetHolder;
+import org.apache.isis.core.metamodel.facetapi.FeatureType;
+import org.apache.isis.core.metamodel.facetapi.MethodRemover;
+import org.apache.isis.core.metamodel.facets.AbstractFacetFactoryTest;
+import org.apache.isis.core.metamodel.facets.FacetFactory;
+import org.apache.isis.core.metamodel.facets.FacetedMethodParameter;
+import org.apache.isis.core.metamodel.facets.MethodRemoverConstants;
+import org.apache.isis.core.metamodel.progmodel.ProgrammingModelAbstract;
+import org.apache.isis.core.metamodel.progmodel.ProgrammingModelInitFilterDefault;
+import org.apache.isis.core.metamodel.progmodels.dflt.ProgrammingModelFacetsJava8;
+import org.apache.isis.core.metamodel.services.title.TitleServiceDefault;
 
 import lombok.val;
 
diff --git a/core/detached-tests/src/test/java/org/apache/isis/core/metamodel/facets/object/mixin/MixinIntendedAsActionTest.java b/core/detached-tests/src/test/java/org/apache/isis/core/metamodel/facets/object/mixin/MixinIntendedAsActionTest.java
index 465a037..89e0342 100644
--- a/core/detached-tests/src/test/java/org/apache/isis/core/metamodel/facets/object/mixin/MixinIntendedAsActionTest.java
+++ b/core/detached-tests/src/test/java/org/apache/isis/core/metamodel/facets/object/mixin/MixinIntendedAsActionTest.java
@@ -32,7 +32,6 @@ import org.apache.isis.applib.annotation.Collection;
 import org.apache.isis.applib.annotation.DomainObject;
 import org.apache.isis.applib.annotation.Mixin;
 import org.apache.isis.applib.annotation.Property;
-import org.apache.isis.metamodel.facets.object.mixin.MixinFacet;
 
 import lombok.Data;
 import lombok.RequiredArgsConstructor;
diff --git a/core/detached-tests/src/test/java/org/apache/isis/core/metamodel/facets/param/name/ParameterNameFacetTest.java b/core/detached-tests/src/test/java/org/apache/isis/core/metamodel/facets/param/name/ParameterNameFacetTest.java
index 10ac73d..62dbb32 100644
--- a/core/detached-tests/src/test/java/org/apache/isis/core/metamodel/facets/param/name/ParameterNameFacetTest.java
+++ b/core/detached-tests/src/test/java/org/apache/isis/core/metamodel/facets/param/name/ParameterNameFacetTest.java
@@ -31,13 +31,13 @@ import static org.junit.Assert.assertThat;
 
 import org.apache.isis.applib.annotation.ParameterLayout;
 import org.apache.isis.applib.services.inject.ServiceInjector;
-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;
-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.core.metamodel.MetaModelContext_forTesting;
+import org.apache.isis.core.metamodel.facets.AbstractFacetFactoryJUnit4TestCase;
+import org.apache.isis.core.metamodel.facets.FacetFactory;
+import org.apache.isis.core.metamodel.facets.all.named.NamedFacet;
+import org.apache.isis.core.metamodel.progmodel.ProgrammingModelAbstract;
+import org.apache.isis.core.metamodel.progmodel.ProgrammingModelInitFilterDefault;
+import org.apache.isis.core.metamodel.progmodels.dflt.ProgrammingModelFacetsJava8;
 
 import lombok.val;
 
diff --git a/core/metamodel/log4j2-test.xml b/core/metamodel/log4j2-test.xml
index e2f1c80..26dc93b 100644
--- a/core/metamodel/log4j2-test.xml
+++ b/core/metamodel/log4j2-test.xml
@@ -16,7 +16,7 @@
 	<Loggers>
 	
 	
-		<Logger name="org.apache.isis.metamodel.specloader.SpecificationLoaderDefault" level="warn" />
+		<Logger name="org.apache.isis.core.metamodel.specloader.SpecificationLoaderDefault" level="warn" />
 	
 		<Logger name="org.apache.catalina.startup.DigesterFactory" level="error" />
 		<Logger name="org.apache.catalina.util.LifecycleBase" level="error" />
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/IsisModuleMetamodel.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/IsisModuleMetamodel.java
new file mode 100644
index 0000000..4b68215
--- /dev/null
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/IsisModuleMetamodel.java
@@ -0,0 +1,101 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ */
+package org.apache.isis.core.metamodel;
+
+import org.springframework.context.annotation.Configuration;
+import org.springframework.context.annotation.Import;
+
+import org.apache.isis.applib.IsisModuleApplib;
+import org.apache.isis.core.config.IsisModuleCoreConfig;
+import org.apache.isis.core.metamodel.context.MetaModelContexts;
+import org.apache.isis.core.metamodel.objectmanager.ObjectManagerDefault;
+import org.apache.isis.core.metamodel.progmodel.ProgrammingModelInitFilterDefault;
+import org.apache.isis.core.metamodel.specloader.InjectorMethodEvaluatorDefault;
+import org.apache.isis.core.metamodel.specloader.ProgrammingModelServiceDefault;
+import org.apache.isis.core.metamodel.specloader.SpecificationLoaderDefault;
+import org.apache.isis.core.metamodel.services.ServiceInjectorDefault;
+import org.apache.isis.core.metamodel.services.appfeat.ApplicationFeatureFactory;
+import org.apache.isis.core.metamodel.services.appfeat.ApplicationFeatureRepositoryDefault;
+import org.apache.isis.core.metamodel.services.classsubstitutor.ClassSubstitutorDefault;
+import org.apache.isis.core.metamodel.services.classsubstitutor.ClassSubstitutorRegistry;
+import org.apache.isis.core.metamodel.services.classsubstitutor.ClassSubstitutorForCollections;
+import org.apache.isis.core.metamodel.services.events.MetamodelEventService;
+import org.apache.isis.core.metamodel.services.events.MetamodelEventSupport_Spring;
+import org.apache.isis.core.metamodel.services.exceprecog.ExceptionRecognizerDocDefault;
+import org.apache.isis.core.metamodel.services.grid.GridLoaderServiceDefault;
+import org.apache.isis.core.metamodel.services.grid.GridReaderUsingJaxb;
+import org.apache.isis.core.metamodel.services.grid.GridServiceDefault;
+import org.apache.isis.core.metamodel.services.grid.bootstrap3.GridSystemServiceBS3;
+import org.apache.isis.core.metamodel.services.layout.LayoutServiceDefault;
+import org.apache.isis.core.metamodel.services.metamodel.MetaModelServiceDefault;
+import org.apache.isis.core.metamodel.services.registry.ServiceRegistryDefault;
+import org.apache.isis.core.metamodel.services.title.TitleServiceDefault;
+import org.apache.isis.core.metamodel.services.user.UserServiceDefault;
+import org.apache.isis.core.metamodel.valuetypes.ValueTypeProviderDefault;
+import org.apache.isis.core.metamodel.valuetypes.ValueTypeProviderForCollections;
+import org.apache.isis.core.metamodel.valuetypes.ValueTypeRegistry;
+import org.apache.isis.security.api.IsisModuleSecurityApi;
+
+@Configuration
+@Import({
+        // modules
+        IsisModuleApplib.class,
+        IsisModuleCoreConfig.class,
+        IsisModuleSecurityApi.class,
+
+        // @Configuration's
+        MetaModelContexts.class,
+        MetamodelEventSupport_Spring.class,
+
+        // @Component's
+        ProgrammingModelInitFilterDefault.class,
+        ClassSubstitutorDefault.class,
+        ClassSubstitutorForCollections.class,
+        ClassSubstitutorRegistry.class,
+        ValueTypeProviderDefault.class,
+        ValueTypeProviderForCollections.class,
+        ValueTypeRegistry.class,
+
+        // @Service's
+        ObjectManagerDefault.class,
+        ServiceInjectorDefault.class,
+        ApplicationFeatureFactory.class,
+        MetamodelEventService.class,
+        ExceptionRecognizerDocDefault.class,
+        GridLoaderServiceDefault.class,
+        GridReaderUsingJaxb.class,
+        GridServiceDefault.class,
+        GridSystemServiceBS3.class,
+        InjectorMethodEvaluatorDefault.class,
+        LayoutServiceDefault.class,
+        MetaModelServiceDefault.class,
+        ProgrammingModelServiceDefault.class,
+        ServiceRegistryDefault.class,
+        TitleServiceDefault.class,
+        SpecificationLoaderDefault.class,
+        UserServiceDefault.class,
+        UserServiceDefault.SudoServiceSpi.class,
+
+        // @Repository's
+        ApplicationFeatureRepositoryDefault.class,
+
+})
+public class IsisModuleMetamodel {
+
+}
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/adapter/ObjectAdapter.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/adapter/ObjectAdapter.java
new file mode 100644
index 0000000..963a1b2
--- /dev/null
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/adapter/ObjectAdapter.java
@@ -0,0 +1,61 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ */
+
+package org.apache.isis.core.metamodel.adapter;
+
+import org.apache.isis.core.metamodel.adapter.oid.Oid;
+import org.apache.isis.core.metamodel.adapter.oid.ParentedOid;
+import org.apache.isis.core.metamodel.spec.ManagedObject;
+
+/**
+ * Adapters to domain objects, where the application is written in terms of
+ * domain objects and those objects are represented within the NOF through these
+ * adapter, and not directly.
+ */
+public interface ObjectAdapter extends ManagedObject {
+
+    /**
+     * The object's unique {@link Oid}.
+     *
+     * <p>
+     * This id allows the object to added to, stored by,
+     * and retrieved from the object store.  Objects can be looked up by their
+     * {@link Oid}.
+     *
+     * <p>
+     * Note that standalone value objects ("foobar", or 5, or a date),
+     * are not mapped and have a <tt>null</tt> oid.
+     */
+    Oid getOid(); //XXX[2033] referenced by 'metamodel' only to create a bookmark (CommandUtil)
+
+//    /**
+//     * Returns either itself (if this is a root) or for parented collections, the
+//     * adapter corresponding to their {@link ParentedOid#getParentOid() root oid}.
+//     */
+//    ObjectAdapter getAggregateRoot(); //XXX[2033] not referenced by 'metamodel'
+
+    /**
+     * Whether this instance belongs to another object (meaning its
+     * {@link #getOid()} will be a {@link ParentedOid}).
+     */
+    default boolean isParentedCollection() {
+        return getOid() instanceof ParentedOid;
+    }
+
+}
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/adapter/ObjectAdapterProvider.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/adapter/ObjectAdapterProvider.java
new file mode 100644
index 0000000..a8b2f77
--- /dev/null
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/adapter/ObjectAdapterProvider.java
@@ -0,0 +1,35 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ */
+package org.apache.isis.core.metamodel.adapter;
+
+import javax.annotation.Nullable;
+
+/**
+ * 
+ * @since 2.0
+ *
+ */
+public interface ObjectAdapterProvider {
+
+    /**
+     * @return standalone (value) or root adapter
+     */
+    @Nullable ObjectAdapter adapterFor(@Nullable Object pojo);
+
+}
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/adapter/oid/ObjectNotFoundException.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/adapter/oid/ObjectNotFoundException.java
new file mode 100644
index 0000000..5a034b1
--- /dev/null
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/adapter/oid/ObjectNotFoundException.java
@@ -0,0 +1,36 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ */
+
+package org.apache.isis.core.metamodel.adapter.oid;
+
+/**
+ * Indicates that the <tt>PojoRecreator</tt> was unable to instantiate a new pojo for the specified
+ * {@link Oid}.
+ */
+public class ObjectNotFoundException extends ObjectPersistenceException {
+    private static final long serialVersionUID = 1L;
+
+    public ObjectNotFoundException(final Oid oid) {
+        super("Object not found in store with oid " + oid);
+    }
+
+    public ObjectNotFoundException(final Oid oid, final Throwable cause) {
+        super("Object not found in store with oid " + oid, cause);
+    }
+}
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/adapter/oid/ObjectPersistenceException.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/adapter/oid/ObjectPersistenceException.java
new file mode 100644
index 0000000..42270ae
--- /dev/null
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/adapter/oid/ObjectPersistenceException.java
@@ -0,0 +1,42 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ */
+
+package org.apache.isis.core.metamodel.adapter.oid;
+
+import org.apache.isis.core.commons.exceptions.IsisException;
+
+public class ObjectPersistenceException extends IsisException {
+    private static final long serialVersionUID = 1L;
+
+    public ObjectPersistenceException() {
+        super();
+    }
+
+    public ObjectPersistenceException(final String message) {
+        super(message);
+    }
+
+    public ObjectPersistenceException(final String message, final Throwable cause) {
+        super(message, cause);
+    }
+
+    public ObjectPersistenceException(final Throwable cause) {
+        super(cause);
+    }
+}
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/adapter/oid/Oid.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/adapter/oid/Oid.java
new file mode 100644
index 0000000..4e53f3f
--- /dev/null
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/adapter/oid/Oid.java
@@ -0,0 +1,140 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ */
+
+package org.apache.isis.core.metamodel.adapter.oid;
+
+import java.io.Serializable;
+
+import org.apache.isis.applib.annotation.Value;
+import org.apache.isis.applib.services.bookmark.Bookmark;
+import org.apache.isis.core.metamodel.spec.ObjectSpecId;
+import org.apache.isis.core.metamodel.spec.feature.OneToManyAssociation;
+
+
+/**
+ * An immutable identifier for either a root object (subtype {@link RootOid}) or
+ * a parented collection (subtype {@link ParentedOid}).
+ *
+ * <p>
+ * Note that value objects (strings, ints, {@link Value}s etc) do not have an {@link Oid}.
+ */
+public interface Oid extends Serializable {
+
+    /**
+     * A string representation of this {@link Oid}.
+     */
+    String enString();
+
+    /**
+     * Flags whether this OID is for a transient (not-yet-persisted) object,
+     * or a view model object, or for a persistent object.
+     *
+     * <p>
+     * In the case of an {@link ParentedOid}, is determined by the state
+     * of its {@link ParentedOid#getParentOid() root}'s {@link RootOid#isTransient() state}.
+     */
+    boolean isTransient();
+
+    boolean isViewModel();
+
+    boolean isPersistent();
+
+    default boolean isValue() {
+        return false; // default, only overridden by Oid_Value
+    }
+    
+    /**
+     * {@link ObjectSpecId} of the domain object this instance is representing, or when parented,
+     * the ObjectSpecId of the parent domain object. When representing a value returns {@code null}.   
+     */
+    ObjectSpecId getObjectSpecId();
+
+    // -- MARSHALLING
+
+    public static interface Marshaller {
+
+        String marshal(ParentedOid parentedOid);
+
+        String marshal(RootOid rootOid);
+
+        String joinAsOid(String domainType, String instanceId);
+
+    }
+
+    public static Marshaller marshaller() {
+        return Oid_Marshaller.INSTANCE;
+    }
+
+    // -- UN-MARSHALLING
+
+    public static interface Unmarshaller {
+
+        <T extends Oid> T unmarshal(String oidStr, Class<T> requestedType);
+
+        String splitInstanceId(String oidStr);
+
+    }
+
+    public static Unmarshaller unmarshaller() {
+        return Oid_Marshaller.INSTANCE;
+    }
+
+    // -- FACTORIES
+
+    /** for convenience*/
+    public static final class Factory {
+
+        public static RootOid value() {
+            return Oid_Value.INSTANCE;
+        }
+
+        // -- LEGACY
+
+        public static RootOid ofBookmark(Bookmark bookmark) {
+            return Oid_Root.of(
+                    ObjectSpecId.of(bookmark.getObjectType()), 
+                    bookmark.getIdentifier(), 
+                    bookmark.getObjectState());
+        }
+
+        public static RootOid viewmodelOf(ObjectSpecId objectSpecId, String mementoStr) {
+            return Oid_Root.of(objectSpecId, mementoStr, Bookmark.ObjectState.VIEW_MODEL);
+        }
+
+        public static RootOid transientOf(ObjectSpecId objectSpecId, String identifier) {
+            return Oid_Root.of(objectSpecId, identifier, Bookmark.ObjectState.TRANSIENT);
+        }
+
+        public static RootOid persistentOf(ObjectSpecId objectSpecId, String identifier) {
+            return Oid_Root.of(objectSpecId, identifier, Bookmark.ObjectState.PERSISTENT);
+        }
+
+        // -- PARENTED COLLECTIONS
+
+        public static ParentedOid parentedOfOneToMany(RootOid parentRootOid, OneToManyAssociation oneToMany) {
+            return Oid_Parented.ofOneToManyId(parentRootOid, oneToMany.getId());
+        }
+
+        public static ParentedOid parentedOfOneToManyId(RootOid parentRootOid, String oneToManyId) {
+            return Oid_Parented.ofOneToManyId(parentRootOid, oneToManyId);
+        }
+        
+    }
+
+}
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/adapter/oid/Oid_Marshaller.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/adapter/oid/Oid_Marshaller.java
new file mode 100644
index 0000000..d7512f5
--- /dev/null
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/adapter/oid/Oid_Marshaller.java
@@ -0,0 +1,254 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ */
+package org.apache.isis.core.metamodel.adapter.oid;
+
+import java.util.Iterator;
+import java.util.List;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+import java.util.stream.Stream;
+
+import org.apache.isis.applib.services.bookmark.Bookmark;
+import org.apache.isis.core.commons.internal.assertions._Assert;
+import org.apache.isis.core.commons.internal.base._Casts;
+import org.apache.isis.core.commons.internal.base._Strings;
+import org.apache.isis.core.commons.internal.collections._Lists;
+import org.apache.isis.core.commons.internal.exceptions._Exceptions;
+import org.apache.isis.core.metamodel.spec.ObjectSpecId;
+
+import static org.apache.isis.core.commons.internal.base._Strings.splitThenStream;
+
+/**
+ * Factory for subtypes of {@link Oid}, based on their oid str.
+ *
+ * <p>
+ * Examples
+ * <dl>
+ * <dt>CUS:123</dt>
+ * <dd>persistent root</dd>
+ * <dt>!CUS:123</dt>
+ * <dd>transient root</dd>
+ * <dt>*CUS:123</dt>
+ * <dd>view model root</dd>
+ * <dt>CUS:123$items</dt>
+ * <dd>collection of persistent root</dd>
+ * <dt>!CUS:123$items</dt>
+ * <dd>collection of transient root</dd>
+ * <dt>CUS:123~NME:2</dt>
+ * <dd>aggregated object within persistent root</dd>
+ * <dt>!CUS:123~NME:2</dt>
+ * <dd>aggregated object within transient root</dd>
+ * <dt>CUS:123~NME:2~CTY:LON</dt>
+ * <dd>aggregated object within aggregated object within root</dd>
+ * <dt>CUS:123~NME:2$items</dt>
+ * <dd>collection of an aggregated object within root</dd>
+ * <dt>CUS:123~NME:2~CTY:LON$streets</dt>
+ * <dd>collection of an aggregated object within aggregated object within root</dd>
+ * </dl>
+ *
+ * <p>
+ * Separators:
+ * <dl>
+ * <dt>!</dt>
+ * <dd>precedes root object type, indicates transient</dd>
+ * <dt>*</dt>
+ * <dd>precedes root object type, indicates transient</dd>
+ * <dt>:</dt>
+ * <dd>precedes root object identifier</dd>
+ * <dt>~</dt>
+ * <dd>precedes aggregate oid</dd>
+ * <dt>$</dt>
+ * <dd>precedes collection name</dd>
+ * <dt>^</dt>
+ * <dd>precedes version</dd>
+ * </dl>
+ *
+ * <p>
+ * Note that # and ; were not chosen as separators to minimize noise when URL encoding OIDs.
+ */
+final class Oid_Marshaller implements Oid.Marshaller, Oid.Unmarshaller {
+
+    public final static Oid_Marshaller INSTANCE = new Oid_Marshaller();
+
+    private Oid_Marshaller(){}
+
+    // -- public constants
+    public static final String VIEWMODEL_INDICATOR =
+            Bookmark.ObjectState.VIEW_MODEL.getCode(); // "*"
+
+
+    // -- private constants
+    private static final String TRANSIENT_INDICATOR =
+            Bookmark.ObjectState.TRANSIENT.getCode() ; // "!"
+
+    private static final String SEPARATOR = ":";
+    private static final String SEPARATOR_NESTING = "~";
+    private static final String SEPARATOR_PARENTED = "$";
+    private static final String SEPARATOR_VERSION = "^"; // legacy
+
+    private static final String WORD = "[^" + SEPARATOR + SEPARATOR_NESTING + SEPARATOR_PARENTED + "\\" + SEPARATOR_VERSION + "#" + "]+";
+
+    private static final String WORD_GROUP = "(" + WORD + ")";
+
+    private static Pattern OIDSTR_PATTERN =
+            Pattern.compile(
+                    "^(" +
+                            "(" +
+                            "([" + TRANSIENT_INDICATOR + VIEWMODEL_INDICATOR + "])?" +
+                            WORD_GROUP + SEPARATOR + WORD_GROUP +
+                            ")" +
+                            "(" +
+                            "(" + SEPARATOR_NESTING + WORD + SEPARATOR + WORD + ")*" + // nesting of aggregates
+                            ")" +
+                            ")" +
+                            "(" + "[" + SEPARATOR_PARENTED + "]" + WORD + ")?"  + // optional collection name
+                            "([\\" + SEPARATOR_VERSION + "].*)?" + // to be compatible with previous patterns, that optionally included version information
+                    "$");
+
+
+    // -- join, split
+
+    @Override //implementing Oid.Marshaller
+    public String joinAsOid(String domainType, String instanceId) {
+        return domainType + SEPARATOR + instanceId;
+    }
+
+    @Override //implementing Oid.Unarshaller
+    public String splitInstanceId(String oidStr) {
+        final int indexOfSeperator = oidStr.indexOf(SEPARATOR);
+        return indexOfSeperator > 0? oidStr.substring(indexOfSeperator+1): null;
+    }
+
+
+
+    // -- unmarshal
+
+    @Override
+    public <T extends Oid> T unmarshal(String oidStr, Class<T> requestedType) {
+
+        final Matcher matcher = OIDSTR_PATTERN.matcher(oidStr);
+        if (!matcher.matches()) {
+            throw _Exceptions.illegalArgument("Could not parse OID '" + oidStr + "'; should match pattern: " + OIDSTR_PATTERN.pattern());
+        }
+
+        final String isTransientOrViewModelStr = getGroup(matcher, 3);
+        final Bookmark.ObjectState state;
+        if("!".equals(isTransientOrViewModelStr)) {
+            state = Bookmark.ObjectState.TRANSIENT;
+        } else if("*".equals(isTransientOrViewModelStr)) {
+            state = Bookmark.ObjectState.VIEW_MODEL;
+        } else {
+            state = Bookmark.ObjectState.PERSISTENT;
+        }
+
+        final String rootObjectType = getGroup(matcher, 4);
+        final String rootIdentifier = getGroup(matcher, 5);
+
+        final String aggregateOidPart = getGroup(matcher, 6);
+        final List<AggregateOidPart> aggregateOidParts = _Lists.newArrayList();
+        
+        if(aggregateOidPart != null) {
+            final Stream<String> tildaSplitted = splitThenStream(aggregateOidPart, SEPARATOR_NESTING); 
+
+            tildaSplitted.forEach(str->{
+                if(_Strings.isNullOrEmpty(str)) {
+                    return; // leading "~"
+                }
+                final Iterator<String> colonSplitIter = splitThenStream(str, SEPARATOR).iterator();
+                final String objectType = colonSplitIter.next();
+                final String localId = colonSplitIter.next();
+                aggregateOidParts.add(new AggregateOidPart(objectType, localId));
+            });
+
+        }
+        final String collectionPart = getGroup(matcher, 8);
+        final String oneToManyId = collectionPart != null ? collectionPart.substring(1) : null;
+
+        if(oneToManyId == null) {
+            if(aggregateOidParts.isEmpty()) {
+                ensureCorrectType(oidStr, requestedType, RootOid.class);
+                return _Casts.uncheckedCast(
+                        Oid_Root.of(ObjectSpecId.of(rootObjectType), rootIdentifier, state));
+            } else {
+                throw _Exceptions.illegalArgument("Aggregated Oids are no longer supported");
+            }
+        } else {
+            final String oidStrWithoutCollectionName = getGroup(matcher, 1);
+
+            final String parentOidStr = oidStrWithoutCollectionName;
+
+            RootOid parentOid = this.unmarshal(parentOidStr, RootOid.class);
+            ensureCorrectType(oidStr, requestedType, ParentedOid.class);
+            return _Casts.uncheckedCast( Oid_Parented.ofOneToManyId(parentOid, oneToManyId) );
+        }
+    }
+
+
+
+    private static class AggregateOidPart {
+        AggregateOidPart(String objectType, String localId) {
+            this.objectType = objectType;
+            this.localId = localId;
+        }
+        String objectType;
+        String localId;
+        @Override
+        public String toString() {
+            return SEPARATOR_NESTING + objectType + SEPARATOR + localId;
+        }
+    }
+
+
+    private <T> void ensureCorrectType(String oidStr, Class<T> requestedType, 
+            final Class<? extends Oid> actualType) {
+
+        if(!requestedType.isAssignableFrom(actualType)) {
+            throw new IllegalArgumentException(
+                    String.format("OID '%s' was unmarshealled to type '%s' which cannot be assigned "
+                            + "to requested type '%s'",
+                            oidStr, actualType.getSimpleName(), requestedType.getSimpleName()) );
+        }
+    }
+
+    private String getGroup(final Matcher matcher, final int group) {
+        final int groupCount = matcher.groupCount();
+        if(group > groupCount) {
+            return null;
+        }
+        final String val = matcher.group(group);
+        return _Strings.emptyToNull(val);
+    }
+
+
+    // -- marshal
+    @Override
+    public final String marshal(RootOid rootOid) {
+        _Assert.assertFalse("can not marshal values", rootOid.isValue());
+        final String transientIndicator = rootOid.isTransient()? TRANSIENT_INDICATOR : "";
+        final String viewModelIndicator = rootOid.isViewModel()? VIEWMODEL_INDICATOR : "";
+        return transientIndicator + viewModelIndicator + rootOid.getObjectSpecId() + SEPARATOR + rootOid.getIdentifier();
+    }
+
+    @Override
+    public String marshal(ParentedOid parentedOid) {
+        return parentedOid.getParentOid().enString() + SEPARATOR_PARENTED + parentedOid.getName();
+    }
+
+
+}
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/adapter/oid/Oid_Parented.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/adapter/oid/Oid_Parented.java
new file mode 100644
index 0000000..551d207
--- /dev/null
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/adapter/oid/Oid_Parented.java
@@ -0,0 +1,146 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ */
+
+package org.apache.isis.core.metamodel.adapter.oid;
+
+import java.io.IOException;
+import java.util.Objects;
+
+import org.apache.isis.core.metamodel.spec.ObjectSpecId;
+
+import static org.apache.isis.core.commons.internal.base._With.requires;
+
+final class Oid_Parented implements ParentedOid {
+
+    private static final long serialVersionUID = 1L;
+
+    private final String oneToManyId;
+    private final int hashCode;
+
+    private final RootOid parentRootOid;
+
+    static Oid_Parented ofOneToManyId(RootOid parentRootOid, String oneToManyId) {
+        return new Oid_Parented(parentRootOid, oneToManyId);
+    }
+
+    private Oid_Parented(RootOid parentRootOid, String oneToManyId) {
+        requires(parentRootOid, "parentRootOid");
+        this.parentRootOid = parentRootOid;
+        this.oneToManyId = oneToManyId;
+        this.hashCode = calculateHash();
+    }
+
+    @Override
+    public RootOid getParentOid() {
+        return parentRootOid;
+    }
+    
+    @Override
+    public ObjectSpecId getObjectSpecId() {
+        return getParentOid().getObjectSpecId();
+    }
+
+    @Override
+    public boolean isTransient() {
+        return getParentOid().isTransient();
+    }
+
+    @Override
+    public boolean isViewModel() {
+        return getParentOid().isViewModel();
+    }
+
+    @Override
+    public boolean isPersistent() {
+        return getParentOid().isPersistent();
+    }
+
+    public static Oid_Parented deString(String oidStr) {
+        return unmarshaller().unmarshal(oidStr, Oid_Parented.class);
+    }
+
+    @Override
+    public String enString() {
+        return marshaller().marshal(this);
+    }
+
+    private Oid_Parented(Oid_Parented oid) throws IOException {
+        this.parentRootOid = oid.getParentOid();
+        this.oneToManyId = oid.oneToManyId;
+        this.hashCode = calculateHash();
+    }
+
+    @Override
+    public String getName() {
+        return oneToManyId;
+    }
+
+
+    // /////////////////////////////////////////////////////////
+    // toString
+    // /////////////////////////////////////////////////////////
+
+    @Override
+    public String toString() {
+        return enString();
+    }
+
+    // /////////////////////////////////////////////////////////
+    // Value semantics
+    // /////////////////////////////////////////////////////////
+
+    @Override
+    public boolean equals(final Object other) {
+        if (other == this) {
+            return true;
+        }
+        if (other == null) {
+            return false;
+        }
+        if (getClass() != other.getClass()) {
+            return false;
+        }
+        return equals((Oid_Parented) other);
+    }
+
+    public boolean equals(final Oid_Parented other) {
+        return Objects.equals(other.getParentOid(), getParentOid()) 
+                && Objects.equals(other.oneToManyId, oneToManyId);
+    }
+
+
+    @Override
+    public int hashCode() {
+        return hashCode;
+    }
+
+    private int calculateHash() {
+        return Objects.hash(getParentOid(), oneToManyId);
+    }
+
+    /**
+     * When the RootOid is persisted, all its &quot;children&quot;
+     * need updating similarly.
+     */
+    public Oid_Parented asPersistent(RootOid newParentRootOid) {
+        return new Oid_Parented(newParentRootOid, oneToManyId);
+    }
+
+
+}
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/adapter/oid/Oid_Root.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/adapter/oid/Oid_Root.java
new file mode 100644
index 0000000..ff270c4
--- /dev/null
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/adapter/oid/Oid_Root.java
@@ -0,0 +1,167 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ */
+
+package org.apache.isis.core.metamodel.adapter.oid;
+
+import java.util.Objects;
+
+import org.apache.isis.applib.services.bookmark.Bookmark;
+import org.apache.isis.core.commons.internal.url.UrlDecoderUtil;
+import org.apache.isis.core.metamodel.spec.ObjectSpecId;
+import org.apache.isis.schema.common.v1.BookmarkObjectState;
+import org.apache.isis.schema.common.v1.OidDto;
+
+import static org.apache.isis.core.commons.internal.base._With.requires;
+
+import lombok.val;
+
+final class Oid_Root implements RootOid {
+
+    private final static long serialVersionUID = 2L;
+
+    private final ObjectSpecId objectSpecId;
+    private final String identifier;
+    private final Bookmark.ObjectState state;
+    private final int hashCode;
+
+    public static Oid_Root of(
+            ObjectSpecId objectSpecId, 
+            String identifier, 
+            Bookmark.ObjectState state) {
+
+        return new Oid_Root(objectSpecId, identifier, state);
+    }
+
+    private Oid_Root(ObjectSpecId objectSpecId, String identifier, Bookmark.ObjectState state) {
+
+        requires(objectSpecId, "objectSpecId");
+        requires(identifier, "identifier");
+        requires(state, "state");
+
+        this.objectSpecId = objectSpecId;
+        this.identifier = identifier;
+        this.state = state;
+        this.hashCode = calculateHash();
+
+    }
+
+    // -- deString'able, enString
+    public static Oid_Root deStringEncoded(final String urlEncodedOidStr) {
+        final String oidStr = UrlDecoderUtil.urlDecode(urlEncodedOidStr);
+        return deString(oidStr);
+    }
+
+    public static Oid_Root deString(final String oidStr) {
+        return Oid.unmarshaller().unmarshal(oidStr, Oid_Root.class);
+    }
+
+    @Override
+    public String enString() {
+        return Oid.marshaller().marshal(this);
+    }
+
+    // -- Properties
+    @Override
+    public ObjectSpecId getObjectSpecId() {
+        return objectSpecId;
+    }
+
+    @Override
+    public String getIdentifier() {
+        return identifier;
+    }
+
+    @Override
+    public boolean isTransient() {
+        return state == Bookmark.ObjectState.TRANSIENT;
+    }
+
+    @Override
+    public boolean isViewModel() {
+        return state == Bookmark.ObjectState.VIEW_MODEL;
+    }
+
+    @Override
+    public boolean isPersistent() {
+        return state == Bookmark.ObjectState.PERSISTENT;
+    }
+
+    @Override
+    public Bookmark asBookmark() {
+        val objectType = state.getCode() + getObjectSpecId().asString();
+        val identifier = getIdentifier();
+        return new Bookmark(objectType, identifier);
+    }
+
+    @Override
+    public OidDto asOidDto() {
+
+        val oidDto = new OidDto();
+
+        oidDto.setType(getObjectSpecId().asString());
+        oidDto.setId(getIdentifier());
+
+        val bookmarkState = state.toBookmarkState();
+        oidDto.setObjectState(
+                bookmarkState != BookmarkObjectState.PERSISTENT 
+                ? bookmarkState  
+                        : null); // persistent is assumed if not specified...
+
+        return oidDto;
+    }
+
+
+    @Override
+    public boolean equals(final Object other) {
+        if (other == null) {
+            return false;
+        }
+        if (other == this) {
+            return true;
+        }
+        if (getClass() != other.getClass()) {
+            return false;
+        }
+        return equals((Oid_Root) other);
+    }
+
+    public boolean equals(final Oid_Root other) {
+        return Objects.equals(objectSpecId, other.getObjectSpecId()) 
+                && Objects.equals(identifier, other.getIdentifier())
+                && Objects.equals(state, other.state);
+    }
+
+    @Override
+    public int hashCode() {
+        return hashCode;
+    }
+
+    @Override
+    public String toString() {
+        return enString();
+    }
+
+    // -- HELPER
+
+    private int calculateHash() {
+        return Objects.hash(objectSpecId, identifier, state);
+    }
+
+
+}
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/adapter/oid/Oid_Value.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/adapter/oid/Oid_Value.java
new file mode 100644
index 0000000..e14ee9b
--- /dev/null
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/adapter/oid/Oid_Value.java
@@ -0,0 +1,87 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ */
+
+package org.apache.isis.core.metamodel.adapter.oid;
+
+import org.apache.isis.applib.services.bookmark.Bookmark;
+import org.apache.isis.core.metamodel.spec.ObjectSpecId;
+import org.apache.isis.schema.common.v1.OidDto;
+
+final class Oid_Value implements RootOid {
+
+    private final static long serialVersionUID = 1L;
+
+    static final Oid_Value INSTANCE = new Oid_Value();
+
+    @Override
+    public String enString() {
+        return null;
+    }
+
+    @Override
+    public boolean isValue() { 
+        return true; 
+    }
+
+    @Override
+    public boolean isTransient() {
+        return false;
+    }
+
+    @Override
+    public boolean isViewModel() {
+        return false;
+    }
+
+    @Override
+    public boolean isPersistent() {
+        return false;
+    }
+
+    @Override
+    public ObjectSpecId getObjectSpecId() {
+        return null;
+    }
+
+    @Override
+    public String getIdentifier() {
+        return null;
+    }
+
+    @Override
+    public String toString() {
+        return "VALUE_OID";
+    }
+
+    @Override
+    public int hashCode() {
+        return 0;
+    }
+
+    @Override
+    public Bookmark asBookmark() {
+        return null;
+    }
+
+    @Override
+    public OidDto asOidDto() {
+        return null;
+    }
+
+}
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/adapter/oid/ParentedOid.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/adapter/oid/ParentedOid.java
new file mode 100644
index 0000000..f721fba
--- /dev/null
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/adapter/oid/ParentedOid.java
@@ -0,0 +1,54 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ */
+
+package org.apache.isis.core.metamodel.adapter.oid;
+
+import org.apache.isis.applib.annotation.Collection;
+import org.apache.isis.core.commons.internal.url.UrlDecoderUtil;
+import org.apache.isis.core.metamodel.spec.feature.OneToManyAssociation;
+
+/**
+ * Used as the {@link Oid} for {@link OneToManyAssociation} (collections).
+ */
+public interface ParentedOid extends Oid {
+
+    /**
+     * object identifier of the domain object that is holding the {@link OneToManyAssociation}
+     * this instance is representing
+     */
+    RootOid getParentOid();
+
+    /**
+     * id of the {@link OneToManyAssociation} this instance is representing, that is 
+     * the member name, that is annotated with {@link Collection}
+     */
+    String getName();
+
+    // -- DECODE FROM STRING
+
+    public static ParentedOid deStringEncoded(final String urlEncodedOidStr) {
+        final String oidStr = UrlDecoderUtil.urlDecode(urlEncodedOidStr);
+        return deString(oidStr);
+    }
+
+    public static ParentedOid deString(String enString) {
+        return unmarshaller().unmarshal(enString, ParentedOid.class);
+    }
+
+}
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/adapter/oid/PojoRecreationException.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/adapter/oid/PojoRecreationException.java
new file mode 100644
index 0000000..f9bba6c
--- /dev/null
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/adapter/oid/PojoRecreationException.java
@@ -0,0 +1,29 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ */
+
+package org.apache.isis.core.metamodel.adapter.oid;
+
+public class PojoRecreationException extends ObjectPersistenceException {
+    private static final long serialVersionUID = 1L;
+
+    public PojoRecreationException(Oid oid, Throwable cause) {
+        super("Could not recreate pojo for oid oid " + oid, cause);
+
+    }
+}
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/adapter/oid/PojoRefreshException.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/adapter/oid/PojoRefreshException.java
new file mode 100644
index 0000000..71be982
--- /dev/null
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/adapter/oid/PojoRefreshException.java
@@ -0,0 +1,32 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ */
+
+package org.apache.isis.core.metamodel.adapter.oid;
+
+public class PojoRefreshException extends ObjectNotFoundException {
+    private static final long serialVersionUID = 1L;
+
+    public PojoRefreshException(Oid oid) {
+        super(oid);
+    }
+
+    public PojoRefreshException(Oid oid, Throwable cause) {
+        super(oid, cause);
+    }
+}
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/adapter/oid/RootOid.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/adapter/oid/RootOid.java
new file mode 100644
index 0000000..4c951b3
--- /dev/null
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/adapter/oid/RootOid.java
@@ -0,0 +1,46 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ */
+
+package org.apache.isis.core.metamodel.adapter.oid;
+
+import org.apache.isis.applib.services.bookmark.Bookmark;
+import org.apache.isis.core.commons.internal.url.UrlDecoderUtil;
+import org.apache.isis.schema.common.v1.OidDto;
+
+public interface RootOid extends Oid {
+
+    String getIdentifier();
+
+    Bookmark asBookmark();
+
+    OidDto asOidDto();
+
+    // -- DECODE FROM STRING
+
+    public static RootOid deStringEncoded(final String urlEncodedOidStr) {
+        final String oidStr = UrlDecoderUtil.urlDecode(urlEncodedOidStr);
+        return deString(oidStr);
+    }
+
+    public static RootOid deString(final String oidStr) {
+        return Oid.unmarshaller().unmarshal(oidStr, RootOid.class);
+    }
+
+
+}
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/adapter/package-info.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/adapter/package-info.java
new file mode 100644
index 0000000..53c74ca
--- /dev/null
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/adapter/package-info.java
@@ -0,0 +1,32 @@
+/*
+ *  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.
+ */
+
+/**
+ * Defines {@link org.apache.isis.core.metamodel.adapter.ObjectAdapter} interface,
+ * a wrapper around each domain object pojo.
+ *
+ * <p>
+ * {@link org.apache.isis.core.metamodel.adapter.ObjectAdapter} is analogous
+ * to {@link java.lang.Object java.lang.Object}; from it the {@link org.apache.isis.core.metamodel.spec.ObjectSpecification}
+ * can be obtained (analogous to {@link java.lang.Class java.lang.Class}.
+ *
+ * <p>
+ * The other significant type defined by
+ */
+package org.apache.isis.core.metamodel.adapter;
\ No newline at end of file
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/authorization/standard/AuthorizationFacet.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/authorization/standard/AuthorizationFacet.java
new file mode 100644
index 0000000..72a6564
--- /dev/null
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/authorization/standard/AuthorizationFacet.java
@@ -0,0 +1,32 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ */
+
+package org.apache.isis.core.metamodel.authorization.standard;
+
+import org.apache.isis.core.metamodel.facetapi.Facet;
+import org.apache.isis.core.metamodel.interactions.DisablingInteractionAdvisor;
+import org.apache.isis.core.metamodel.interactions.HidingInteractionAdvisor;
+
+/**
+ * Optionally hide or disable an object, property, collection or action
+ * depending on the authorization.
+ */
+public interface AuthorizationFacet extends Facet, HidingInteractionAdvisor, DisablingInteractionAdvisor {
+
+}
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/authorization/standard/AuthorizationFacetAbstract.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/authorization/standard/AuthorizationFacetAbstract.java
new file mode 100644
index 0000000..6f569c9
--- /dev/null
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/authorization/standard/AuthorizationFacetAbstract.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.core.metamodel.authorization.standard;
+
+import org.apache.isis.applib.services.wrapper.events.UsabilityEvent;
+import org.apache.isis.applib.services.wrapper.events.VisibilityEvent;
+import org.apache.isis.core.metamodel.facetapi.Facet;
+import org.apache.isis.core.metamodel.facetapi.FacetAbstract;
+import org.apache.isis.core.metamodel.facetapi.FacetHolder;
+import org.apache.isis.core.metamodel.interactions.UsabilityContext;
+import org.apache.isis.core.metamodel.interactions.VisibilityContext;
+import org.apache.isis.security.api.authorization.manager.AuthorizationManager;
+
+import lombok.val;
+import lombok.extern.log4j.Log4j2;
+
+@Log4j2
+public abstract class AuthorizationFacetAbstract extends FacetAbstract implements AuthorizationFacet {
+
+    public static Class<? extends Facet> type() {
+        return AuthorizationFacet.class;
+    }
+
+    private final AuthorizationManager authorizationManager;
+
+    public AuthorizationFacetAbstract(
+            final FacetHolder holder) {
+        super(type(), holder, Derivation.NOT_DERIVED);
+        this.authorizationManager = getAuthorizationManager();
+    }
+
+    @Override
+    public String hides(VisibilityContext<? extends VisibilityEvent> ic) {
+        
+        val hides = authorizationManager.isVisible(getAuthenticationSession(), ic.getIdentifier()) 
+                ? null 
+                        : "Not authorized to view";
+        
+        if(hides!=null && log.isDebugEnabled()) {
+            log.debug("hides[{}] -> {}", ic.getIdentifier(), hides);
+        }
+        
+        return hides;
+    }
+
+    @Override
+    public String disables(UsabilityContext<? extends UsabilityEvent> ic) {
+        
+        val disables = authorizationManager.isUsable(getAuthenticationSession(), ic.getIdentifier()) 
+                ? null 
+                        : "Not authorized to edit";
+        
+        if(disables!=null && log.isDebugEnabled()) {
+            log.debug("disables[{}] -> {}", ic.getIdentifier(), disables);
+        }
+        
+        return disables;
+    }
+
+
+}
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/authorization/standard/AuthorizationFacetFactory.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/authorization/standard/AuthorizationFacetFactory.java
new file mode 100644
index 0000000..3f7d04f
--- /dev/null
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/authorization/standard/AuthorizationFacetFactory.java
@@ -0,0 +1,46 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ */
+
+package org.apache.isis.core.metamodel.authorization.standard;
+
+import org.apache.isis.core.metamodel.facetapi.FacetHolder;
+import org.apache.isis.core.metamodel.facetapi.FeatureType;
+import org.apache.isis.core.metamodel.facets.FacetFactoryAbstract;
+
+public class AuthorizationFacetFactory extends FacetFactoryAbstract {
+
+    public AuthorizationFacetFactory() {
+        super(FeatureType.EVERYTHING_BUT_PARAMETERS);
+    }
+
+    @Override
+    public void process(final ProcessClassContext processClassContext) {
+        super.addFacet(createFacet(processClassContext.getFacetHolder()));
+    }
+
+    @Override
+    public void process(final ProcessMethodContext processMethodContext) {
+        super.addFacet(createFacet(processMethodContext.getFacetHolder()));
+    }
+
+    private AuthorizationFacetImpl createFacet(final FacetHolder holder) {
+        return new AuthorizationFacetImpl(holder);
+    }
+
+}
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/authorization/standard/AuthorizationFacetImpl.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/authorization/standard/AuthorizationFacetImpl.java
new file mode 100644
index 0000000..2a419c3
--- /dev/null
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/authorization/standard/AuthorizationFacetImpl.java
@@ -0,0 +1,30 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ */
+
+package org.apache.isis.core.metamodel.authorization.standard;
+
+import org.apache.isis.core.metamodel.facetapi.FacetHolder;
+
+public class AuthorizationFacetImpl extends AuthorizationFacetAbstract {
+
+    public AuthorizationFacetImpl(final FacetHolder holder) {
+        super(holder);
+    }
+
+}
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/authorization/standard/package-info.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/authorization/standard/package-info.java
new file mode 100644
index 0000000..ea27f71
--- /dev/null
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/authorization/standard/package-info.java
@@ -0,0 +1,33 @@
+/*
+ *  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.
+ */
+
+/**
+ * Authorization API..
+ *
+ * <p>
+ * Used in two different ways:
+ * <ul>
+ * <li>in prototyping or single user, used by the {@link org.apache.isis.runtimes.dflt.runtime.authorization.standard.AuthorizationFacetFactoryImpl facet factory}
+ *     implementations, that is, enforcing authorization on the "client-side".
+ *     </li>
+ * <li>In client/server mode, used by a {@link org.apache.isis.metamodel.facetdecorator.FacetDecorator} for proxy authorization,
+ *     that is, enforcing authorization by delegating to the "server-side".</li>
+ * </ul>
+ */
+package org.apache.isis.core.metamodel.authorization.standard;
\ No newline at end of file
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/commons/ArrayExtensions.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/commons/ArrayExtensions.java
new file mode 100644
index 0000000..a9882b3
--- /dev/null
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/commons/ArrayExtensions.java
@@ -0,0 +1,69 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ */
+
+package org.apache.isis.core.metamodel.commons;
+
+import java.lang.reflect.Array;
+import java.lang.reflect.Constructor;
+import java.lang.reflect.InvocationTargetException;
+
+import org.apache.isis.core.commons.exceptions.IsisException;
+
+public final class ArrayExtensions {
+
+    private ArrayExtensions() {
+    }
+
+    static Object[] convertPrimitiveToObjectArray(final Object extendee, final Class<?> arrayType) {
+        Object[] convertedArray;
+        try {
+            final Class<?> wrapperClass = ClassExtensions.asWrapped(arrayType);
+            final Constructor<?> constructor = wrapperClass.getConstructor(new Class[] { String.class });
+            final int len = Array.getLength(extendee);
+            convertedArray = (Object[]) Array.newInstance(wrapperClass, len);
+            for (int i = 0; i < len; i++) {
+                convertedArray[i] = constructor.newInstance(new Object[] { Array.get(extendee, i).toString() });
+            }
+        } catch (final NoSuchMethodException e) {
+            throw new IsisException(e);
+        } catch (final ArrayIndexOutOfBoundsException e) {
+            throw new IsisException(e);
+        } catch (final IllegalArgumentException e) {
+            throw new IsisException(e);
+        } catch (final InstantiationException e) {
+            throw new IsisException(e);
+        } catch (final IllegalAccessException e) {
+            throw new IsisException(e);
+        } catch (final InvocationTargetException e) {
+            throw new IsisException(e);
+        }
+        return convertedArray;
+    }
+
+    public static Object[] asCharToCharacterArray(final Object extendee) {
+        final char[] original = (char[]) extendee;
+        final int len = original.length;
+        final Character[] converted = new Character[len];
+        for (int i = 0; i < converted.length; i++) {
+            converted[i] = Character.valueOf(original[i]);
+        }
+        return converted;
+    }
+
+}
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/commons/CanBeVoid.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/commons/CanBeVoid.java
new file mode 100644
index 0000000..29f1c81
--- /dev/null
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/commons/CanBeVoid.java
@@ -0,0 +1,25 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ */
+
+package org.apache.isis.core.metamodel.commons;
+
+public enum CanBeVoid {
+    TRUE,
+    FALSE
+}
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/commons/ClassExtensions.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/commons/ClassExtensions.java
new file mode 100644
index 0000000..587951b
--- /dev/null
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/commons/ClassExtensions.java
@@ -0,0 +1,175 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ */
+
+package org.apache.isis.core.metamodel.commons;
+
+import java.lang.reflect.Constructor;
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
+import java.lang.reflect.Modifier;
+import java.net.URL;
+
+import org.apache.isis.core.commons.exceptions.IsisException;
+import org.apache.isis.core.commons.internal.collections._Lists;
+import org.apache.isis.core.commons.internal.exceptions._Exceptions;
+import org.apache.isis.core.commons.internal.resources._Resources;
+
+import lombok.val;
+
+public final class ClassExtensions {
+
+
+    private ClassExtensions() {
+    }
+
+    public static Object newInstance(final Class<?> extendee, final Class<?> constructorParamType, final Object constructorArg) {
+        return ClassExtensions.newInstance(extendee, new Class[] { constructorParamType }, new Object[] { constructorArg });
+    }
+
+    /**
+     * Tries to instantiate using a constructor accepting the supplied
+     * arguments; if no such constructor then falls back to trying the no-arg
+     * constructor.
+     */
+    public static Object newInstance(final Class<?> extendee, final Class<?>[] constructorParamTypes, final Object[] constructorArgs) {
+        try {
+            Constructor<?> constructor;
+            try {
+                constructor = extendee.getConstructor(constructorParamTypes);
+                return constructor.newInstance(constructorArgs);
+            } catch (final NoSuchMethodException ex) {
+                try {
+                    constructor = extendee.getConstructor();
+                    return constructor.newInstance();
+                } catch (final NoSuchMethodException e) {
+                    val msg = String.format("Failed to call contructor for type %s trying, "
+                            + "args '%s' then trying no args.",
+                            extendee.getName(),
+                            _Lists.of(constructorParamTypes).toString());
+
+                    throw _Exceptions.unrecoverable(msg, e);
+                }
+            }
+        } catch (final SecurityException | IllegalArgumentException | IllegalAccessException | InstantiationException | InvocationTargetException ex) {
+            throw new IsisException(ex);
+        }
+    }
+
+    public static String getSuperclass(final Class<?> extendee) {
+        final Class<?> superType = extendee.getSuperclass();
+
+        if (superType == null) {
+            return null;
+        }
+        return superType.getName();
+    }
+
+    public static boolean isAbstract(final Class<?> extendee) {
+        return Modifier.isAbstract(extendee.getModifiers());
+    }
+
+    public static boolean isJavaClass(final Class<?> extendee) {
+        final String className = extendee.getName();
+        return className.startsWith(ClassUtil.JAVA_CLASS_PREFIX) ||
+                extendee.getName().startsWith("sun.");
+    }
+
+    static Class<?> implementingClassOrNull(final Class<?> extendee, final Class<?> requiredClass, final Class<?> constructorParamType) {
+        if (extendee == null) {
+            return null;
+        }
+        if (!requiredClass.isAssignableFrom(extendee)) {
+            return null;
+        }
+        try {
+            extendee.getConstructor(new Class[] { constructorParamType });
+        } catch (final NoSuchMethodException ex) {
+            try {
+                extendee.getConstructor(new Class[] {});
+            } catch (final NoSuchMethodException e) {
+                return null;
+            }
+        } catch (final SecurityException e) {
+            return null;
+        }
+        final int modifiers = extendee.getModifiers();
+        if (!Modifier.isPublic(modifiers)) {
+            return null;
+        }
+        return extendee;
+    }
+
+    public static Method getMethod(final Class<?> clazz, final String methodName, final Class<?>... parameterClass) throws NoSuchMethodException {
+        return clazz.getMethod(methodName, parameterClass);
+    }
+
+    public static Method getMethodElseNull(final Class<?> clazz, final String methodName, final Class<?>... parameterClass) {
+        try {
+            return clazz.getMethod(methodName, parameterClass);
+        } catch (final NoSuchMethodException e) {
+            return null;
+        }
+    }
+
+    public static boolean exists(final Class<?> cls, final String resourceName) {
+        final URL url = _Resources.getResourceUrl(cls, resourceName);
+        return url != null;
+    }
+
+    static Class<?> asWrapped(final Class<?> primitiveClassExtendee) {
+        return ClassUtil.wrapperClasses.get(primitiveClassExtendee);
+    }
+
+    public static Class<? extends Object> asWrappedIfNecessary(final Class<?> cls) {
+        return cls.isPrimitive() ? asWrapped(cls) : cls;
+    }
+
+    public static Object toDefault(final Class<?> extendee) {
+        if(!extendee.isPrimitive()) {
+            return null;
+        }
+        return ClassUtil.defaultByPrimitiveClass.get(extendee);
+    }
+
+    /**
+     * Returns the corresponding 'null' value for the primitives, or just
+     * <tt>null</tt> if the class represents a non-primitive type.
+     */
+    public static Object getNullOrDefault(final Class<?> type) {
+        return ClassUtil.defaultByPrimitiveType.get(type);
+    }
+
+    public static boolean isCompatibleAsReturnType(final Class<?> returnTypeExtendee, final CanBeVoid canBeVoid, final Class<?> type) {
+        boolean mayBeVoid = canBeVoid == CanBeVoid.TRUE;
+
+        if (returnTypeExtendee == null) {
+            return true;
+        }
+        if (mayBeVoid && (type == void.class)) {
+            return true;
+        }
+
+        if (type.isPrimitive()) {
+            return returnTypeExtendee.isAssignableFrom(ClassUtil.wrapperClasses.get(type));
+        }
+
+        return (returnTypeExtendee.isAssignableFrom(type));
+    }
+
+}
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/commons/ClassFunctions.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/commons/ClassFunctions.java
new file mode 100644
index 0000000..f9252e0
--- /dev/null
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/commons/ClassFunctions.java
@@ -0,0 +1,46 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ */
+package org.apache.isis.core.metamodel.commons;
+
+import java.util.function.Function;
+
+import javax.annotation.Nullable;
+
+public final class ClassFunctions {
+
+    private ClassFunctions(){}
+
+    public static <T> Function<Object, T> castTo(final Class<T> type) {
+        return new Function<Object, T>() {
+            @SuppressWarnings("unchecked")
+            @Override
+            public T apply(final Object input) {
+                return (T) input;
+            }
+        };
+    }
+
+    public static Function<Class<?>, String> packageNameOf() {
+        return new Function<Class<?>, String>() {
+            @Nullable @Override public String apply(final Class<?> input) {
+                return input.getPackage().getName();
+            }
+        };
+    }
+}
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/commons/ClassPredicates.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/commons/ClassPredicates.java
new file mode 100644
index 0000000..88c3c03
--- /dev/null
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/commons/ClassPredicates.java
@@ -0,0 +1,37 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ */
+package org.apache.isis.core.metamodel.commons;
+
+import java.util.function.Predicate;
+
+public final class ClassPredicates {
+
+    private ClassPredicates(){}
+
+    public static final <T> Predicate<Object> isOfType(final Class<T> type) {
+        return new Predicate<Object>() {
+            @Override
+            public boolean test(Object input) {
+                return type.isAssignableFrom(input.getClass());
+            }
+        };
+    }
+
+
+}
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/commons/ClassUtil.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/commons/ClassUtil.java
new file mode 100644
index 0000000..a6a7183
--- /dev/null
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/commons/ClassUtil.java
@@ -0,0 +1,192 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ */
+
+package org.apache.isis.core.metamodel.commons;
+
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import org.apache.isis.core.commons.internal.base._Strings;
+import org.apache.isis.core.commons.internal.collections._Maps;
+import org.apache.isis.core.commons.internal.context._Context;
+import org.apache.isis.core.commons.internal.exceptions._Exceptions;
+
+import static org.apache.isis.core.commons.internal.base._With.requires;
+import static org.apache.isis.core.commons.internal.base._With.requiresNotEmpty;
+
+import lombok.val;
+
+public final class ClassUtil {
+
+    static final String JAVA_CLASS_PREFIX = "java.";
+
+    private static Map<String, Class<?>> builtInClasses = new HashMap<String, Class<?>>();
+
+    static {
+        put(void.class);
+        put(boolean.class);
+        put(char.class);
+        put(byte.class);
+        put(short.class);
+        put(int.class);
+        put(long.class);
+        put(float.class);
+        put(double.class);
+    }
+
+    private static void put(final Class<?> cls) {
+        builtInClasses.put(cls.getName(), cls);
+    }
+
+    static final Map<Class<?>, Object> defaultByPrimitiveClass =
+            MapUtil.asMap(
+                    boolean.class, false,
+                    byte.class, (byte)0,
+                    short.class, (short)0,
+                    int.class, 0,
+                    long.class, 0L,
+                    float.class, 0.0f,
+                    double.class, 0.0,
+                    char.class, (char)0
+                    );
+    static Map<Class<?>, Class<?>> wrapperClasses =
+            MapUtil.asMap(
+                    // TODO: there is a better way of doing this in 1.6 using TypeMirror
+                    boolean.class, Boolean.class,
+                    byte.class, Byte.class,
+                    char.class, Character.class,
+                    short.class, Short.class,
+                    int.class, Integer.class,
+                    long.class, Long.class,
+                    float.class, Float.class,
+                    double.class, Double.class,
+                    void.class, Void.class
+                    );
+
+    static Map<Class<?>, Object> defaultByPrimitiveType = new HashMap<Class<?>, Object>();
+
+    static {
+        defaultByPrimitiveType.put(byte.class, (byte) 0);
+        defaultByPrimitiveType.put(short.class, (short) 0);
+        defaultByPrimitiveType.put(int.class, 0);
+        defaultByPrimitiveType.put(long.class, 0L);
+        defaultByPrimitiveType.put(char.class, 0);
+        defaultByPrimitiveType.put(float.class, 0.0F);
+        defaultByPrimitiveType.put(double.class, 0.0);
+        defaultByPrimitiveType.put(boolean.class, false);
+    }
+
+    public static Map<String, Class<?>> primitives = _Maps.newHashMap();
+
+    static {
+        @SuppressWarnings({ "rawtypes" })
+        final List<Class> primitiveClasses = Arrays.<Class> asList(
+                boolean.class,
+                byte.class,
+                short.class,
+                int.class,
+                long.class,
+                float.class,
+                double.class,
+                char.class);
+        for (final Class<?> cls : primitiveClasses) {
+            primitives.put(cls.getName(), cls);
+        }
+    }
+
+
+    // //////////////////////////////////////
+
+    private ClassUtil() {
+    }
+
+    public static Class<?> getBuiltIn(final String name) {
+        return builtInClasses.get(name);
+    }
+
+    /**
+     * Returns the supplied Class so long as it implements (or is a subclass of)
+     * the required class, and also has either a constructor accepting the
+     * specified param type, or has a no-arg constructor.
+     */
+    public static Class<?> implementingClassOrNull(final String classCandidateName, final Class<?> requiredClass, final Class<?> constructorParamType) {
+        if (classCandidateName == null) {
+            return null;
+        }
+        Class<?> classCandidate = null;
+        try {
+            classCandidate = _Context.loadClass(classCandidateName);
+            return ClassExtensions.implementingClassOrNull(classCandidate, requiredClass, constructorParamType);
+        } catch (final ClassNotFoundException e) {
+            return null;
+        }
+    }
+
+    public static boolean directlyImplements(final Class<?> cls, final Class<?> interfaceType) {
+        for (final Class<?> directlyImplementedInterface : cls.getInterfaces()) {
+            if (directlyImplementedInterface == interfaceType) {
+                return true;
+            }
+        }
+        return false;
+    }
+
+    public static Class<?> forNameElseFail(final String fullName) {
+        requiresNotEmpty(fullName, "fullName");
+        final Class<?> builtIn = ClassUtil.getBuiltIn(fullName);
+        if (builtIn != null) {
+            return builtIn;
+        }
+        try {
+            return _Context.loadClass(fullName);
+        } catch (final ClassNotFoundException e) {
+            throw _Exceptions.unrecoverable(e);
+        }
+    }
+
+    public static Class<?> forNameElseNull(final String fullName) {
+        if (_Strings.isNullOrEmpty(fullName)) {
+            return null;
+        }
+        try {
+            return _Context.loadClass(fullName);
+        } catch (final ClassNotFoundException e) {
+            return null;
+        }
+    }
+
+    /**
+     * Returns {@code cls.getCanonicalName()} if present. 
+     * Otherwise resorts to fully qualified class-name, with any '$' replaced by '.$'.
+     * @param cls
+     * @return non-null
+     */
+    public static String getCanonicalName_friendlyToInnerClasses(Class<?> cls) {
+        requires(cls, "cls");
+
+        val name = cls.getCanonicalName();
+        if(name==null) {
+            return cls.getName().replace("$", ".$").replace("..", ".");
+        }
+        return name;
+    }
+
+}
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/commons/CloseableExtensions.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/commons/CloseableExtensions.java
new file mode 100644
index 0000000..d3d420c
--- /dev/null
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/commons/CloseableExtensions.java
@@ -0,0 +1,40 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ */
+
+package org.apache.isis.core.metamodel.commons;
+
+import java.io.Closeable;
+
+public final class CloseableExtensions {
+
+    private CloseableExtensions() {
+    }
+
+    public static void closeSafely(final Closeable extendee) {
+        if (extendee != null) {
+            try {
+                extendee.close();
+            } catch (final Exception ignore) {
+                // ignore
+            }
+        }
+    }
+
+
+}
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/commons/DateExtensions.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/commons/DateExtensions.java
new file mode 100644
index 0000000..dc759f4
--- /dev/null
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/commons/DateExtensions.java
@@ -0,0 +1,35 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ */
+
+package org.apache.isis.core.metamodel.commons;
+
+import java.text.SimpleDateFormat;
+import java.util.Date;
+
+
+public final class DateExtensions {
+
+    private DateExtensions(){}
+
+    public static String asTimestamp(final Date date) {
+        final SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyyMMdd-hhmmssSSS");
+        return date == null ? "" : simpleDateFormat.format(date);
+    }
+
+}
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/commons/InputStreamExtensions.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/commons/InputStreamExtensions.java
new file mode 100644
index 0000000..75431ee
--- /dev/null
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/commons/InputStreamExtensions.java
@@ -0,0 +1,69 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ */
+
+package org.apache.isis.core.metamodel.commons;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+
+public final class InputStreamExtensions {
+
+    private static final int DEFAULT_BUFFER_SIZE = 1024;
+
+    private InputStreamExtensions() {
+    }
+
+    /**
+     * Copy bytes from an <code>InputStream</code> to an
+     * <code>OutputStream</code>.
+     * <p>
+     * This method buffers the input internally, so there is no need to use a
+     * <code>BufferedInputStream</code>.
+     *
+     * @param extendee
+     *            the <code>InputStream</code> to read from
+     * @param output
+     *            the <code>OutputStream</code> to write to
+     * @return the number of bytes copied
+     * @throws IllegalArgumentException
+     *             if the input or output is null
+     * @throws IOException
+     *             if an I/O error occurs
+     * @since Commons IO 1.1
+     */
+    public static int copyTo(final InputStream extendee, final OutputStream output) throws IOException {
+        if (extendee == null) {
+            throw new IllegalArgumentException("InputStream cannot be null");
+        }
+        if (output == null) {
+            throw new IllegalArgumentException("OutputStream cannot be null");
+        }
+        final byte[] buffer = new byte[DEFAULT_BUFFER_SIZE];
+        int count = 0;
+        int n = 0;
+        while (-1 != (n = extendee.read(buffer))) {
+            output.write(buffer, 0, n);
+            count += n;
+        }
+        return count;
+    }
+
+
+}
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/commons/ListExtensions.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/commons/ListExtensions.java
new file mode 100644
index 0000000..68761af
--- /dev/null
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/commons/ListExtensions.java
@@ -0,0 +1,115 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ */
+
+package org.apache.isis.core.metamodel.commons;
+
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.List;
+import java.util.stream.Collectors;
+
+import org.apache.isis.core.commons.internal.base._NullSafe;
+import org.apache.isis.core.commons.internal.collections._Lists;
+
+import static org.apache.isis.core.commons.internal.base._NullSafe.stream;
+
+public final class ListExtensions {
+    private static final String DEFAULT_DELIMITER = ",";
+
+    private ListExtensions() {
+    }
+
+    public static <T> List<T> combineWith(final List<T> extendee, final List<T> list2) {
+        final List<T> combinedList = _Lists.newArrayList();
+        combinedList.addAll(extendee);
+        combinedList.addAll(list2);
+        return combinedList;
+    }
+
+    /**
+     * Returns list1 with everything in list2, ignoring duplicates.
+     */
+    public static <T> List<T> mergeWith(final List<T> extendee, final List<T> list2) {
+        for (final T obj : list2) {
+            if (!(extendee.contains(obj))) {
+                extendee.add(obj);
+            }
+        }
+        return extendee;
+    }
+
+
+
+    /**
+     * @see #appendDelimitedStringToList(String, String, List)
+     */
+    public static List<String> appendDelimitedStringToList(final String commaSeparated, final List<String> list) {
+        return appendDelimitedStringToList(commaSeparated, DEFAULT_DELIMITER, list);
+    }
+
+    public static List<String> appendDelimitedStringToList(final String delimited, final String delimiter, final List<String> list) {
+        if (delimited == null) {
+            return list;
+        }
+        final String[] optionValues = delimited.split(delimiter);
+        list.addAll(Arrays.asList(optionValues));
+        return list;
+    }
+
+    // //////////////////////////////////////
+
+    public static <T> List<T> mutableCopy(final List<T> input) {
+        return stream(input)
+                .collect(Collectors.toList());
+    }
+
+    public static <T> List<T> mutableCopy(T[] arr) {
+        return stream(arr)
+                .collect(Collectors.toList());
+    }
+
+    public static <T> void insert(final List<T> list, final int insertionPoint, final T elementToInsert) {
+        extend(list, insertionPoint);
+        list.add(insertionPoint, elementToInsert);
+    }
+
+    public static <T> void adjust(final List<T> list, final int requiredLength) {
+        extend(list, requiredLength);
+        if(list.size() > requiredLength) {
+            list.subList(requiredLength, list.size()).clear();
+        }
+    }
+
+    private static <T> void extend(final List<T> list, final int requiredLength) {
+        for(int i=list.size(); i<requiredLength; i++) {
+            list.add(null);
+        }
+    }
+
+    public static <T> Collection<T> filtered(final List<Object> extendee, final Class<T> type) {
+        return _NullSafe.stream(extendee)
+                .filter(ClassPredicates.isOfType(type))
+                .map(ClassFunctions.castTo(type))
+                .collect(Collectors.toList());
+    }
+
+
+
+
+}
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/commons/LocaleUtil.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/commons/LocaleUtil.java
new file mode 100644
index 0000000..4915960
--- /dev/null
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/commons/LocaleUtil.java
@@ -0,0 +1,40 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ */
+
+package org.apache.isis.core.metamodel.commons;
+
+import java.util.Locale;
+
+import org.apache.isis.core.commons.internal.base._Strings;
+
+public class LocaleUtil {
+
+    public static Locale findLocale(final String localeStr) {
+        if (_Strings.isNotEmpty(localeStr)) {
+            final Locale[] availableLocales = Locale.getAvailableLocales();
+            for (final Locale locale : availableLocales) {
+                if (locale.toString().equals(localeStr)) {
+                    return locale;
+                }
+            }
+        }
+        return null;
+    }
+
+}
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/commons/MapUtil.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/commons/MapUtil.java
new file mode 100644
index 0000000..77b5f63
--- /dev/null
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/commons/MapUtil.java
@@ -0,0 +1,48 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ */
+
+package org.apache.isis.core.metamodel.commons;
+
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.Map;
+
+public final class MapUtil {
+
+    private MapUtil() {
+    }
+
+    /**
+     * Converts a list of objects [a, 1, b, 2] into a map {a -> 1; b -> 2}
+     */
+    @SuppressWarnings("unchecked")
+    public static <K,V> Map<K,V> asMap(Object... keyValPair){
+        Map<K,V> map = new HashMap<K,V>();
+
+        if(keyValPair.length % 2 != 0){
+            throw new IllegalArgumentException("Keys and values must be pairs.");
+        }
+
+        for(int i = 0; i < keyValPair.length; i += 2){
+            map.put((K) keyValPair[i], (V) keyValPair[i+1]);
+        }
+
+        return Collections.unmodifiableMap(map);
+    }
+}
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/commons/MethodExtensions.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/commons/MethodExtensions.java
new file mode 100644
index 0000000..e97a1f0
--- /dev/null
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/commons/MethodExtensions.java
@@ -0,0 +1,92 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ */
+
+package org.apache.isis.core.metamodel.commons;
+
+import java.lang.reflect.Method;
+import java.lang.reflect.Modifier;
+
+public class MethodExtensions {
+
+    private MethodExtensions() {
+    }
+
+    public static boolean isStatic(final Method method) {
+        return Modifier.isStatic(method.getModifiers());
+    }
+
+    // //////////////////////////////////////
+
+    public static Object invoke(final Method method, final Object object) {
+        final Object[] parameters = MethodExtensions.getNullOrDefaultArgs(method);
+        return MethodExtensions.invoke(method, object, parameters);
+    }
+
+    public static Object invoke(final Method method, final Object object, final Object[] arguments) {
+        try {
+            Object[] defaultAnyPrimitive = defaultAnyPrimitive(method.getParameterTypes(), arguments);
+            return MethodInvocationPreprocessor.invoke(method, object, defaultAnyPrimitive);
+        } catch (Exception e) {
+            return ThrowableExtensions.handleInvocationException(e, method.getName());
+        }
+    }
+
+    private static Object[] defaultAnyPrimitive(Class<?>[] parameterTypes, Object[] arguments) {
+        if(parameterTypes == null || arguments == null || parameterTypes.length != arguments.length) {
+            return arguments;
+        }
+        final Object[] argumentsWithPrimitivesDefaulted = new Object[arguments.length];
+        for(int i=0; i<argumentsWithPrimitivesDefaulted.length; i++) {
+            argumentsWithPrimitivesDefaulted[i] = valueIfPrimitiveThenDefaulted(parameterTypes[i], arguments[i]);
+        }
+        return argumentsWithPrimitivesDefaulted;
+    }
+
+    private static Object valueIfPrimitiveThenDefaulted(Class<?> cls, Object argument) {
+        if(argument != null) {
+            return argument;
+        }
+        if(!cls.isPrimitive()) {
+            return argument;
+        }
+        return ClassUtil.defaultByPrimitiveClass.get(cls);
+    }
+
+    public static Object invokeStatic(final Method method, final Object[] parameters) {
+        return invoke(method, null, parameters);
+    }
+
+    public static Object invokeStatic(final Method method) {
+        return invoke(method, null, MethodExtensions.getNullOrDefaultArgs(method));
+    }
+
+    // //////////////////////////////////////
+
+
+    public static Object[] getNullOrDefaultArgs(final Method method) {
+        final Class<?>[] paramTypes = method.getParameterTypes();
+        final Object[] parameters = new Object[paramTypes.length];
+        for (int i = 0; i < parameters.length; i++) {
+            parameters[i] = ClassExtensions.getNullOrDefault(paramTypes[i]);
+        }
+        return parameters;
+    }
+
+
+}
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/commons/MethodInvocationPreprocessor.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/commons/MethodInvocationPreprocessor.java
new file mode 100644
index 0000000..8c2d2b0
--- /dev/null
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/commons/MethodInvocationPreprocessor.java
@@ -0,0 +1,154 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ */
+
+package org.apache.isis.core.metamodel.commons;
+
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
+import java.util.Collection;
+import java.util.List;
+import java.util.Set;
+import java.util.SortedSet;
+
+import org.apache.isis.core.commons.internal.base._Casts;
+import org.apache.isis.core.commons.internal.base._NullSafe;
+import org.apache.isis.core.commons.internal.collections._Arrays;
+import org.apache.isis.core.commons.internal.collections._Collections;
+
+import static org.apache.isis.core.commons.internal.base._NullSafe.isEmpty;
+
+import lombok.val;
+
+/**
+ * Utility for method invocation pre-processing.
+ * <p>
+ * For a given array of parameters, we intercept and adapt those,
+ * that are not compatible with the expected target parameter type.
+ * </p>
+ * <p>
+ * By now we do this for collection parameter types List, Set, SortedSet, Collection and Arrays.
+ * </p>
+ */
+public class MethodInvocationPreprocessor {
+
+    public static Object invoke(Method method, Object targetPojo, Object[] executionParameters)
+            throws IllegalAccessException, InvocationTargetException {
+
+        if (isEmpty(executionParameters)) {
+            return method.invoke(targetPojo, executionParameters);
+        }
+
+        val parameterTypes = method.getParameterTypes();
+        val paramCount = parameterTypes.length;
+        val adaptedExecutionParameters = new Object[paramCount];
+
+        for(int i=0; i<paramCount; ++i) {
+            val origParam = _Arrays.get(executionParameters, i).orElse(null);
+            adaptedExecutionParameters[i] = adapt(origParam, parameterTypes[i]);
+        }
+
+        try {
+            return method.invoke(targetPojo, adaptedExecutionParameters);
+        } catch (IllegalArgumentException e) {
+            throw verboseArgumentException(parameterTypes, adaptedExecutionParameters, e);
+        }
+    }
+
+    // -- OBJECT ADAPTER
+
+
+    /**
+     * Replaces obj (if required) to be conform with the parameterType
+     * @param obj
+     * @param parameterType
+     * @return
+     */
+
+    private static Object adapt(Object obj, Class<?> parameterType) {
+
+        if(obj==null) {
+            return null;
+        }
+
+        if(_Arrays.isArrayType(parameterType)) {
+            final Class<?> componentType = _Arrays.inferComponentTypeIfAny(parameterType);
+            if(componentType==null) {
+                return obj;
+            }
+            @SuppressWarnings("rawtypes") final List list = (List)obj;
+            return _Arrays.toArray(_Casts.uncheckedCast(list), componentType);
+        }
+
+        // allow no side effects on Collection arguments
+        if(Collection.class.equals(parameterType)) {
+            return _Collections.asUnmodifiableCollection((List<?>)obj);
+        }
+
+        // allow no side effects on List arguments
+        if(List.class.equals(parameterType)) {
+            return _Collections.asUnmodifiableList((List<?>)obj);
+        }
+
+        // adapt as Set (unmodifiable)
+        if(Set.class.equals(parameterType)) {
+            return _Collections.asUnmodifiableSet((List<?>)obj);
+        }
+
+        // adapt as SortedSet (unmodifiable)
+        if(SortedSet.class.equals(parameterType)) {
+            return _Collections.asUnmodifiableSortedSet((List<?>)obj);
+        }
+
+        return obj;
+    }
+
+    private static IllegalArgumentException verboseArgumentException(
+            Class<?>[] parameterTypes, 
+            Object[] adaptedExecutionParameters,
+            IllegalArgumentException e) {
+
+        val sb = new StringBuilder();
+        
+        val expectedParamCount = _NullSafe.size(parameterTypes);
+        val actualParamCount = _NullSafe.size(adaptedExecutionParameters);
+        if(expectedParamCount!=actualParamCount) {
+            sb.append(String.format("param-count mismatch: expected %d, got %d\n", 
+                    expectedParamCount, actualParamCount));
+        } else {
+            sb.append("expected param type mismatch\n");
+        }
+        
+        for(int j=0;j<parameterTypes.length;++j) {
+            final Class<?> parameterType = parameterTypes[j];
+            final String parameterValueTypeLiteral = _Arrays.get(adaptedExecutionParameters, j)
+                    .map(Object::getClass)
+                    .map(Class::getName)
+                    .orElse("missing or null");
+
+            sb.append(String.format("param-type[%d]: '%s', got '%s'\n", 
+                    j, parameterType.getName(), parameterValueTypeLiteral));
+        }
+        
+
+        // re-throw more verbose
+        return new IllegalArgumentException(sb.toString(), e);
+    }
+
+
+}
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/commons/MethodUtil.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/commons/MethodUtil.java
new file mode 100644
index 0000000..fba381d
--- /dev/null
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/commons/MethodUtil.java
@@ -0,0 +1,202 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ */
+
+package org.apache.isis.core.metamodel.commons;
+
+import java.lang.reflect.Member;
+import java.lang.reflect.Method;
+import java.lang.reflect.Modifier;
+import java.util.Collection;
+import java.util.Set;
+import java.util.function.Consumer;
+
+import lombok.val;
+
+public class MethodUtil {
+
+    private MethodUtil(){}
+
+    public static void invoke(final Collection<Method> methods, final Object object) {
+        methods.forEach(method->MethodExtensions.invoke(method, object));
+    }
+
+    /**
+     * Searches the supplied array of methods for specific method and returns
+     * it, also removing it from supplied array if found (by setting to
+     * <tt>null</tt>).
+     *
+     * <p>
+     * Any methods that do not meet the search criteria are left in the array of
+     * methods.
+     */
+    public static Method removeMethod(
+            final Set<Method> methods,
+            final String name,
+            final Class<?> returnType,
+            final Class<?>[] paramTypes) {
+        
+        val methodIterator = methods.iterator();
+        while(methodIterator.hasNext()) {
+            val method = methodIterator.next();
+            if(matches(method, name, returnType, paramTypes)){
+                methodIterator.remove();
+                return method;
+            }
+        }
+        
+        return null;
+    }
+
+    /**
+     * Searches the supplied array of methods for specific method and returns
+     * its index, otherwise returns <tt>-1</tt>.
+     *
+     * <p>
+     * The search algorithm is:
+     * <ul>
+     * <li>has the specified prefix</li>
+     * <li>has the specified return type, or <tt>void</tt> if canBeVoid is
+     * <tt>true</tt> (but see below)</li>
+     * <li>has the specified number of parameters</li>
+     * </ul>
+     * If the returnType is specified as null then the return type is ignored.
+     */
+    private static boolean matches(
+            final Method method,
+            final String name,
+            final Class<?> returnType,
+            final Class<?>[] paramTypes) {
+        
+        if (!isPublic(method)) {
+            return false;
+        }
+
+        if (isStatic(method)) {
+            return false;
+        }
+
+        // check for name
+        if (!method.getName().equals(name)) {
+            return false;
+        }
+
+        // check for return type
+        if (returnType != null && returnType != method.getReturnType()) {
+            return false;
+        }
+
+        // check params (if required)
+        if (paramTypes != null) {
+            final Class<?>[] parameterTypes = method.getParameterTypes();
+            if (paramTypes.length != parameterTypes.length) {
+                return false;
+            }
+
+            for (int c = 0; c < paramTypes.length; c++) {
+                if ((paramTypes[c] != null) && (paramTypes[c] != parameterTypes[c])) {
+                    return false;
+                }
+            }
+        }
+        
+        return true;
+    }
+
+
+    /**
+     * Searches the supplied array of methods for all specific methods and
+     * returns them, also removing them from supplied array if found.
+     *
+     * <p>
+     * Any methods that do not meet the search criteria are left in the array of
+     * methods.
+     *
+     * <p>
+     * The search algorithm is:
+     * <ul>
+     * <li>has the specified prefix</li>
+     * <li>has the specified return type, or <tt>void</tt> if canBeVoid is
+     * <tt>true</tt> (but see below)</li>
+     * <li>has the specified number of parameters</li>
+     * </ul>
+     * If the returnType is specified as null then the return type is ignored.
+     *
+     * @param name
+     * @param onRemoval
+     * @param paramTypes
+     *            the set of parameters the method should have, if null then is
+     *            ignored
+     * @param returnType
+     * @param canBeVoid
+     * @return Method
+     */
+    public static void removeMethods(
+            Set<Method> methods,
+            String prefix,
+            Class<?> returnType,
+            CanBeVoid canBeVoid,
+            int paramCount,
+            Consumer<Method> onMatch) {
+
+        methods.removeIf(method -> 
+            matches(method, prefix, returnType, canBeVoid, paramCount, onMatch));
+        
+    }
+
+    private static boolean matches(
+            Method method,
+            String prefix,
+            Class<?> returnType,
+            CanBeVoid canBeVoid,
+            int paramCount,
+            Consumer<Method> onMatch) {
+
+        if (isStatic(method)) {
+            return false;
+        }
+
+        val goodPrefix = method.getName().startsWith(prefix);
+        val goodCount = method.getParameterTypes().length == paramCount;
+        val type = method.getReturnType();
+        val goodReturn = ClassExtensions.isCompatibleAsReturnType(returnType, canBeVoid, type);
+
+        if (goodPrefix && goodCount && goodReturn) {
+            onMatch.accept(method);
+            return true;
+        }
+        
+        return false;
+        
+    }
+
+
+    public static boolean isNotStatic(final Method method) {
+        return !isStatic(method);
+    }
+
+    public static boolean isStatic(final Method method) {
+        final int modifiers = method.getModifiers();
+        return Modifier.isStatic(modifiers);
+    }
+
+    public static boolean isPublic(Member method) {
+        final int modifiers = method.getModifiers();
+        return Modifier.isPublic(modifiers);
+    }
+}
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/commons/ObjectExtensions.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/commons/ObjectExtensions.java
new file mode 100644
index 0000000..c999563
--- /dev/null
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/commons/ObjectExtensions.java
@@ -0,0 +1,82 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ */
+
+package org.apache.isis.core.metamodel.commons;
+
+import java.io.IOException;
+import java.lang.reflect.Method;
+import java.util.List;
+
+import org.apache.isis.core.commons.internal._Constants;
+
+/**
+ * Helpers to co-erce non-generic values into type-safe generics without
+ * having to suppress compiler warnings all over the place.
+ */
+public final class ObjectExtensions {
+
+    private ObjectExtensions() {
+    }
+
+    @SuppressWarnings("unchecked")
+    public static <T> T asT(final Object extendee) {
+        return (T) extendee;
+    }
+
+    @SuppressWarnings("unchecked")
+    public static <T> List<T> asListT(final Object extendee, final Class<T> castTo) {
+        return (List<T>) extendee;
+    }
+
+    public static Object[] asArray(final Object extendee) {
+        final Class<?> arrayType = extendee.getClass().getComponentType();
+        if (!arrayType.isPrimitive()) {
+            return (Object[]) extendee;
+        }
+        if (arrayType == char.class) {
+            return ArrayExtensions.asCharToCharacterArray(extendee);
+        } else {
+            return ArrayExtensions.convertPrimitiveToObjectArray(extendee, arrayType);
+        }
+    }
+
+    public static Method getMethod(final Object object, final String methodName, final Class<?>... parameterClass) throws NoSuchMethodException {
+        return ClassExtensions.getMethod(object.getClass(), methodName, parameterClass);
+    }
+
+    public static Method getMethod(final Object object, final String methodName) throws NoSuchMethodException {
+        return ClassExtensions.getMethod(object.getClass(), methodName, _Constants.emptyClasses);
+    }
+
+    public static String classBaseName(final Object forObject) {
+        final String name = forObject.getClass().getName();
+        return name.substring(name.lastIndexOf('.') + 1);
+    }
+
+    public static void appendToString(final Object extendee, final Appendable buf) {
+        try {
+            buf.append(classBaseName(extendee));
+            buf.append('@');
+            buf.append(Integer.toHexString(extendee.hashCode()));
+        } catch (IOException iox) {
+            throw new RuntimeException("A problem occurred while appending an object to an appendable", iox);
+        }
+    }
+
+}
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/commons/ResourceUtil.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/commons/ResourceUtil.java
new file mode 100644
index 0000000..5033ae8
--- /dev/null
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/commons/ResourceUtil.java
@@ -0,0 +1,83 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ */
+
+package org.apache.isis.core.metamodel.commons;
+
+import java.io.FileInputStream;
+import java.io.FileNotFoundException;
+import java.io.InputStream;
+
+import javax.servlet.http.HttpServletRequest;
+
+import org.apache.isis.core.commons.internal.context._Context;
+
+public class ResourceUtil {
+
+    private ResourceUtil(){}
+
+    public static InputStream getResourceAsStream(final String resource) {
+
+        // try Isis's classloader
+        ClassLoader classLoader = _Context.getDefaultClassLoader();
+        InputStream is = classLoader.getResourceAsStream(resource);
+        if (is != null) {
+            return is;
+        }
+
+        // try thread's classloader
+        classLoader = Thread.currentThread().getContextClassLoader();
+        is = classLoader.getResourceAsStream(resource);
+        if (is != null) {
+            return is;
+        }
+
+        // try this class' classloader
+        classLoader = ResourceUtil.class.getClassLoader();
+        is = classLoader.getResourceAsStream(resource);
+        if (is != null) {
+            return is;
+        }
+
+        // try system class loader (could return null)
+        // have wrapped in a try...catch because for same reason as
+        // getResourceURL
+        try {
+            return ClassLoader.getSystemResourceAsStream(resource);
+        } catch (final NullPointerException ignore) {
+            return null;
+        }
+    }
+
+    /**
+     * @param request
+     * @return real-path resource from file-system, if any
+     */
+    public static InputStream getResourceAsStream(final HttpServletRequest request) {
+        final String realPath = request.getSession().getServletContext().getRealPath(request.getServletPath());
+        if (realPath == null) {
+            return null;
+        }
+        try {
+            return new FileInputStream(realPath);
+        } catch (final FileNotFoundException e) {
+            return null;
+        }
+    }
+
+}
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/commons/StringExtensions.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/commons/StringExtensions.java
new file mode 100644
index 0000000..1b56106
--- /dev/null
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/commons/StringExtensions.java
@@ -0,0 +1,393 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ */
+
+package org.apache.isis.core.metamodel.commons;
+
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.List;
+import java.util.StringTokenizer;
+
+import org.apache.isis.applib.util.Enums;
+import org.apache.isis.core.commons.internal.base._Strings;
+import org.apache.isis.core.commons.internal.resources._Resources;
+
+public final class StringExtensions {
+
+    private StringExtensions() {}
+
+    // ////////////////////////////////////////////////////////////
+    // naturalName, naturalize, simpleName, camel, memberIdFor
+    // ////////////////////////////////////////////////////////////
+
+    /**
+     * Returns a word spaced version of the specified name, so there are spaces
+     * between the words, where each word starts with a capital letter. E.g.,
+     * "NextAvailableDate" is returned as "Next Available Date".
+     */
+    public static String asNaturalName2(String name) {
+        return _Strings.asNaturalName2.apply(name);
+    }
+
+    public static String asNaturalName(final String extendee) {
+
+        int pos = 0;
+
+        // find first upper case character
+        while ((pos < extendee.length()) && Character.isLowerCase(extendee.charAt(pos))) {
+            pos++;
+        }
+
+        if (pos == extendee.length()) {
+            return "invalid name";
+        }
+        return naturalized(extendee, pos);
+    }
+
+    public static String asNaturalized(final String extendee) {
+        return naturalized(extendee, 0);
+    }
+
+    private static String naturalized(final String name, final int startingPosition) {
+        if (name.length() <= startingPosition) {
+            throw new IllegalArgumentException("string shorter than starting position provided");
+        }
+        final StringBuffer s = new StringBuffer(name.length() - startingPosition);
+        for (int j = startingPosition; j < name.length(); j++) { // process
+            // english name
+            // - add spaces
+            if ((j > startingPosition) && isStartOfNewWord(name.charAt(j), name.charAt(j - 1))) {
+                s.append(' ');
+            }
+            if (j == startingPosition) {
+                s.append(Character.toUpperCase(name.charAt(j)));
+            } else {
+                s.append(name.charAt(j));
+            }
+        }
+        final String str = s.toString();
+        return str;
+    }
+
+    private static boolean isStartOfNewWord(final char c, final char previousChar) {
+        return Character.isUpperCase(c) || Character.isDigit(c) && !Character.isDigit(previousChar);
+    }
+
+    public static String asCamel(final String extendee) {
+        final StringBuffer b = new StringBuffer(extendee.length());
+        final StringTokenizer t = new StringTokenizer(extendee);
+        b.append(t.nextToken());
+        while (t.hasMoreTokens()) {
+            final String token = t.nextToken();
+            b.append(token.substring(0, 1).toUpperCase()); // replace spaces
+            // with
+            // camelCase
+            b.append(token.substring(1));
+        }
+        return b.toString();
+    }
+
+    // TODO: combine with camel
+    public static String asCamelLowerFirst(final String extendee) {
+        final StringBuffer b = new StringBuffer(extendee.length());
+        final StringTokenizer t = new StringTokenizer(extendee);
+        b.append(asLowerFirst(t.nextToken()));
+        while (t.hasMoreTokens()) {
+            final String token = t.nextToken();
+            b.append(token.substring(0, 1).toUpperCase()); // replace spaces
+            // with camelCase
+            b.append(token.substring(1).toLowerCase());
+        }
+        return b.toString();
+    }
+
+    public static String asLowerDashed(String extendee) {
+        return _Strings.asLowerDashed.apply(extendee);
+    }
+
+    public static String asPascal(final String extendee) {
+        return capitalize(asCamel(extendee));
+    }
+
+    // ////////////////////////////////////////////////////////////
+    // capitalize, lowerFirst, firstWord
+    // ////////////////////////////////////////////////////////////
+
+    public static String capitalize(final String extendee) {
+        return _Strings.capitalize(extendee);
+    }
+
+    /**
+     * Simply forces first char to be lower case.
+     */
+    public static String asLowerFirst(final String extendee) {
+        if (_Strings.isNullOrEmpty(extendee)) {
+            return extendee;
+        }
+        if (extendee.length() == 1) {
+            return extendee.toLowerCase();
+        }
+        return extendee.substring(0, 1).toLowerCase() + extendee.substring(1);
+    }
+
+    // ////////////////////////////////////////////////////////////
+    // in, combinePaths, splitOnCommas
+    // ////////////////////////////////////////////////////////////
+
+    public static boolean in(final String extendee, final String[] strings) {
+        for (final String strCandidate : strings) {
+            if (strCandidate.equals(extendee)) {
+                return true;
+            }
+        }
+        return false;
+    }
+
+    public static List<String> splitOnCommas(final String commaSeparatedExtendee) {
+        if (commaSeparatedExtendee == null) {
+            return null;
+        }
+        final String removeLeadingWhiteSpace = removeLeadingWhiteSpace(commaSeparatedExtendee);
+        // special handling
+        if (removeLeadingWhiteSpace.length() == 0) {
+            return Collections.emptyList();
+        }
+        final String[] splitAsArray = removeLeadingWhiteSpace.split("\\W*,\\W*");
+        return Arrays.asList(splitAsArray);
+    }
+
+
+    private static final char CARRIAGE_RETURN = '\n';
+    private static final char LINE_FEED = '\r';
+
+    /**
+     * Converts any <tt>\n</tt> to <tt>line.separator</tt>
+     *
+     * @param extendee
+     * @return
+     */
+    public static String lineSeparated(final String extendee) {
+        final StringBuilder buf = new StringBuilder();
+        final String lineSeparator = System.getProperty("line.separator");
+        boolean lastWasLineFeed = false;
+        for (final char c : extendee.toCharArray()) {
+            final boolean isLineFeed = c == LINE_FEED;
+            final boolean isCarriageReturn = c == CARRIAGE_RETURN;
+            if (isCarriageReturn) {
+                buf.append(lineSeparator);
+                lastWasLineFeed = false;
+            } else {
+                if (lastWasLineFeed) {
+                    buf.append(LINE_FEED);
+                }
+                if (isLineFeed) {
+                    lastWasLineFeed = true;
+                } else {
+                    buf.append(c);
+                    lastWasLineFeed = false;
+                }
+            }
+        }
+        if (lastWasLineFeed) {
+            buf.append(LINE_FEED);
+        }
+        return buf.toString();
+    }
+
+    // ////////////////////////////////////////////////////////////
+    // removeTabs, removeLeadingWhiteSpace, stripLeadingSlash, stripNewLines,
+    // normalize
+    // ////////////////////////////////////////////////////////////
+
+    public static String removeLeadingWhiteSpace(final String extendee) {
+        if (extendee == null) {
+            return null;
+        }
+        return extendee.replaceAll("^\\W*", "");
+    }
+
+    public static String stripNewLines(final String extendee) {
+        return extendee.replaceAll("[\r\n]", "");
+    }
+
+    public static String stripLeadingSlash(final String extendee) {
+        if (!extendee.startsWith("/")) {
+            return extendee;
+        }
+        if (extendee.length() < 2) {
+            return "";
+        }
+        return extendee.substring(1);
+    }
+
+    /**
+     * Condenses any whitespace to a single character
+     *
+     * @param extendee
+     * @return
+     */
+    public static String normalized(@javax.annotation.Nullable final String extendee) {
+        return _Strings.asNormalized.apply(extendee);
+    }
+
+    public static String removePrefix(final String extendee, final String prefix) {
+        return extendee.startsWith(prefix)
+                ? extendee.substring(prefix.length())
+                        : extendee;
+    }
+
+    public static String enumTitle(String enumName) {
+        return Enums.getFriendlyNameOf(enumName);
+    }
+
+    public static String enumDeTitle(String enumFriendlyName) {
+        return Enums.getEnumNameFromFriendly(enumFriendlyName);
+    }
+
+    /*
+     * eg converts <tt>HiddenFacetForMemberAnnotation</tt> to <tt>HFFMA</tt>.
+     */
+    public static String toAbbreviation(final String extendee) {
+        final StringBuilder buf = new StringBuilder();
+        for(char c: extendee.toCharArray()) {
+            if(Character.isUpperCase(c)) {
+                buf.append(c);
+            }
+        }
+        return buf.toString();
+    }
+
+
+    // //////////////////////////////////////
+    // copied in from Apache Commons
+    // //////////////////////////////////////
+
+
+
+    public static boolean startsWith(final String extendee, final String prefix) {
+        final int length = prefix.length();
+        if (length >= extendee.length()) {
+            return false;
+        } else {
+            final char startingCharacter = extendee.charAt(length);
+            return extendee.startsWith(prefix) && Character.isUpperCase(startingCharacter);
+        }
+    }
+
+    public static String combinePath(final String extendee, final String suffix) {
+        return _Resources.combinePath(extendee, suffix);
+    }
+
+    /**
+     * Returns the name of a Java entity without any prefix. A prefix is defined
+     * as the first set of lowercase letters and the name is characters from,
+     * and including, the first upper case letter. If no upper case letter is
+     * found then an empty string is returned.
+     *
+     * <p>
+     * Calling this method with the following Java names will produce these
+     * results:
+     *
+     * <pre>
+     *                     getCarRegistration        -&gt; CarRegistration
+     *                     CityMayor -&gt; CityMayor
+     *                     isReady -&gt; Ready
+     * </pre>
+     *
+     */
+    public static String asJavaBaseName(final String javaName) {
+        int pos = 0;
+
+        // find first upper case character
+        final int len = javaName.length();
+
+        while ((pos < len) && (javaName.charAt(pos) != '_') && Character.isLowerCase(javaName.charAt(pos))) {
+            pos++;
+        }
+
+        if (pos >= len) {
+            return "";
+        }
+
+        if (javaName.charAt(pos) == '_') {
+            pos++;
+        }
+
+        if (pos >= len) {
+            return "";
+        }
+
+        final String baseName = javaName.substring(pos);
+        final char firstChar = baseName.charAt(0);
+
+        if (Character.isLowerCase(firstChar)) {
+            return Character.toUpperCase(firstChar) + baseName.substring(1);
+        } else {
+            return baseName;
+        }
+    }
+
+    public static String asJavaBaseNameStripAccessorPrefixIfRequired(final String javaNameExtendee) {
+        if (javaNameExtendee.startsWith("is") || javaNameExtendee.startsWith("get")) {
+            return asJavaBaseName(javaNameExtendee);
+        } else {
+            return StringExtensions.asCapitalizedName(javaNameExtendee);
+        }
+    }
+
+    public static String asCapitalizedName(final String extendee) {
+
+        return Character.toUpperCase(extendee.charAt(0)) +
+                extendee.substring(1);
+    }
+
+
+    public static String asPluralName(final String extendee) {
+        String pluralName;
+        if (extendee.endsWith("y")) {
+            pluralName = extendee.substring(0, extendee.length() - 1) + "ies";
+        } else if (extendee.endsWith("s") || extendee.endsWith("x")) {
+            pluralName = extendee + "es";
+        } else {
+            pluralName = extendee + 's';
+        }
+        return pluralName;
+    }
+
+    public static String toCamelCase(final String extendee) {
+        final String nameLower = extendee.toLowerCase();
+        final StringBuilder buf = new StringBuilder();
+        boolean capitalizeNext = false;
+        for (int i = 0; i < nameLower.length(); i++) {
+            final char ch = nameLower.charAt(i);
+            if (ch == '_') {
+                capitalizeNext = true;
+            } else {
+                if (capitalizeNext) {
+                    buf.append(Character.toUpperCase(ch));
+                } else {
+                    buf.append(ch);
+                }
+                capitalizeNext = false;
+            }
+        }
+        return buf.toString();
+    }
+
+}
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/commons/ThrowableExtensions.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/commons/ThrowableExtensions.java
new file mode 100644
index 0000000..0610af5
--- /dev/null
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/commons/ThrowableExtensions.java
@@ -0,0 +1,82 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ */
+
+package org.apache.isis.core.metamodel.commons;
+
+import java.lang.invoke.WrongMethodTypeException;
+import java.lang.reflect.InvocationTargetException;
+import java.util.function.Consumer;
+
+import org.apache.isis.applib.RecoverableException;
+import org.apache.isis.core.commons.exceptions.IsisApplicationException;
+import org.apache.isis.core.metamodel.exceptions.MetaModelException;
+import org.apache.isis.core.metamodel.specloader.ReflectiveActionException;
+
+public final class ThrowableExtensions {
+
+    public static Object handleInvocationException(
+            final Throwable e,
+            final String memberName) {
+        return handleInvocationException(e, memberName, null);
+    }
+
+    public static Object handleInvocationException(
+            final Throwable e,
+            final String memberName,
+            final Consumer<RecoverableException> recovery) {
+
+        if(e instanceof InvocationTargetException) {
+            return handleInvocationException(((InvocationTargetException) e).getTargetException(), memberName, recovery);
+        }
+        if(e instanceof WrongMethodTypeException) {
+            throw new MetaModelException("Wrong method type access of " + memberName, e);
+        }
+        if(e instanceof IllegalAccessException) {
+            throw new ReflectiveActionException("Illegal access of " + memberName, e);
+        }
+        if(e instanceof IllegalStateException) {
+            throw new ReflectiveActionException( String.format(
+                    "IllegalStateException thrown while invoking %s %s",
+                    memberName, e.getMessage()), e);
+        }
+        if(e instanceof RecoverableException) {
+            return handleRecoverableException((RecoverableException)e, memberName, recovery);
+        }
+        if (e instanceof RuntimeException) {
+            throw (RuntimeException) e;
+        }
+        throw new MetaModelException("Exception invoking " + memberName, e);
+    }
+
+
+    private static Object handleRecoverableException(
+            final RecoverableException e,
+            final String memberName,
+            final Consumer<RecoverableException> recovery) {
+
+        if(recovery!=null)
+            recovery.accept(e);
+
+        // an application exception from the domain code is re-thrown as an
+        // IsisException with same semantics
+        // TODO: should probably be using ApplicationException here
+        throw new IsisApplicationException("Exception invoking " + memberName, e);
+    }
+
+}
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/commons/ToString.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/commons/ToString.java
new file mode 100644
index 0000000..683938c
--- /dev/null
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/commons/ToString.java
@@ -0,0 +1,165 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ */
+
+package org.apache.isis.core.metamodel.commons;
+
+import java.util.Date;
+
+public final class ToString {
+
+    public static ToString createAnonymous(final Object object) {
+        final ToString string = new ToString();
+        string.append(ObjectExtensions.classBaseName(object));
+        string.append('[');
+        return string;
+    }
+
+    // //////////////////////////////////////
+
+    private boolean addComma = false;
+    private final StringBuilder buf;
+    private boolean useLineBreaks;
+
+    private ToString() {
+        buf = new StringBuilder();
+    }
+
+    public ToString(final Object forObject) {
+        buf = new StringBuilder();
+        ObjectExtensions.appendToString(forObject, buf);
+        buf.append('[');
+    }
+
+    public ToString(final Object forObject, final int id) {
+        buf = new StringBuilder();
+        buf.append(ObjectExtensions.classBaseName(forObject));
+        buf.append('#');
+        buf.append(id);
+        buf.append('[');
+    }
+
+    public ToString(final Object forObject, final String text) {
+        this(forObject);
+        buf.append(text);
+        addComma = text.length() > 0;
+    }
+
+    // //////////////////////////////////////
+
+    public ToString append(final char c) {
+        buf.append(c);
+        return this;
+    }
+
+    public ToString append(final String text) {
+        buf.append(text);
+        return this;
+    }
+
+    public ToString append(final String name, final boolean flag) {
+        append(name, flag ? "true" : "false");
+        return this;
+    }
+
+    public ToString append(final String name, final byte number) {
+        append(name, Byte.toString(number));
+        return this;
+    }
+
+    public ToString append(final String name, final double number) {
+        append(name, Double.toString(number));
+        return this;
+    }
+
+    public ToString append(final String name, final float number) {
+        append(name, Float.toString(number));
+        return this;
+    }
+
+    public ToString append(final String name, final int number) {
+        append(name, Integer.toString(number));
+        return this;
+    }
+
+    public ToString append(final String name, final long number) {
+        append(name, Long.toString(number));
+        return this;
+    }
+
+    public ToString append(final String name, final Object object) {
+        append(name, object == null ? "null" : object.toString());
+        return this;
+    }
+
+    public ToString append(final String name, final short number) {
+        append(name, Short.toString(number));
+        return this;
+    }
+
+    public ToString append(final String name, final String string) {
+        if (addComma) {
+            this.buf.append(',');
+            if (useLineBreaks) {
+                this.buf.append("\n\t");
+            }
+        } else {
+            addComma = true;
+        }
+        this.buf.append(name);
+        this.buf.append('=');
+        this.buf.append(string);
+
+        return this;
+    }
+
+    public ToString appendAsHex(final String name, final long number) {
+        append(name, "#" + Long.toHexString(number));
+        return this;
+    }
+
+    public void appendAsTimestamp(final String name, final Date date) {
+        final String dateString = DateExtensions.asTimestamp(date);
+        append(name, dateString);
+    }
+
+    public void appendTruncated(final String name, final String string, final int maxLength) {
+        if (string.length() > maxLength) {
+            append(name, string.substring(0, maxLength));
+            append("...");
+        } else {
+            append(name, string);
+        }
+    }
+
+    public void setAddComma() {
+        this.addComma = true;
+    }
+
+    public void setUseLineBreaks(final boolean useLineBreaks) {
+        this.useLineBreaks = useLineBreaks;
+    }
+
+    // //////////////////////////////////////
+
+    @Override
+    public String toString() {
+        buf.append(']');
+        return buf.toString();
+    }
+}
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/commons/Wormhole.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/commons/Wormhole.java
new file mode 100644
index 0000000..77937bb
--- /dev/null
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/commons/Wormhole.java
@@ -0,0 +1,50 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ */
+package org.apache.isis.core.metamodel.commons;
+
+/**
+ * Provides a mechanism to avoid infinite loops whereby method A -&gt; method B -&gt; method C -&gt; method A and so on.
+ */
+public final class Wormhole {
+
+    private Wormhole(){}
+
+    private ThreadLocal<Boolean> inWormhole = new ThreadLocal<Boolean>() {
+        @Override
+        protected Boolean initialValue() {
+            return false;
+        }
+    };
+
+    public void run(final Runnable runnable) {
+        try {
+            if(inWormhole.get()) {
+                return;
+            }
+            inWormhole.set(true);
+            runnable.run();
+        } finally {
+            inWormhole.set(false);
+        }
+    }
+
+    public static void invoke(final Runnable runnable) {
+        new Wormhole().run(runnable);
+    }
+}
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/commons/package-info.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/commons/package-info.java
new file mode 100644
index 0000000..2fd7191
--- /dev/null
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/commons/package-info.java
@@ -0,0 +1,27 @@
+/*
+ *  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.
+ */
+
+/**
+ * This package holds a small number of classes to extend the JDK.
+ *
+ * <p>
+ * These classes should be thought of as being in the same spirit as
+ * the google <i>guava</i> library helper classes (and some may be replaced by guava in the future).
+ */
+package org.apache.isis.core.metamodel.commons;
\ No newline at end of file
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/consent/Allow.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/consent/Allow.java
new file mode 100644
index 0000000..e48ffb0
--- /dev/null
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/consent/Allow.java
@@ -0,0 +1,56 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ */
+
+package org.apache.isis.core.metamodel.consent;
+
+import org.apache.isis.core.metamodel.facetapi.Facet;
+
+/**
+ * An instance of this type is used to allow something.
+ */
+public class Allow extends ConsentAbstract {
+
+    private static final long serialVersionUID = 1L;
+
+    public static Allow DEFAULT = new Allow();
+
+    private Allow() {
+        this((String) null);
+    }
+
+    /**
+     * Called by DnD viewer; we should instead find a way to put the calling
+     * logic into {@link Facet}s so that it is available for use by other
+     * viewers.
+     *
+     * @see Veto
+     * @deprecated
+     * @param reasonVeteod
+     * @param advisorClass
+     */
+    @Deprecated
+    public Allow(final String description) {
+        super(description, null);
+    }
+
+    public Allow(final InteractionResult interactionResult) {
+        super(interactionResult);
+    }
+
+}
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/consent/Consent.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/consent/Consent.java
new file mode 100644
index 0000000..cce26e4
--- /dev/null
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/consent/Consent.java
@@ -0,0 +1,73 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ */
+
+package org.apache.isis.core.metamodel.consent;
+
+public interface Consent {
+
+    /**
+     * Returns true if this object is giving permission.
+     */
+    boolean isAllowed();
+
+    /**
+     * Returns true if this object is NOT giving permission.
+     */
+    boolean isVetoed();
+
+    /**
+     * Why consent is being vetoed.
+     *
+     * <p>
+     * Will be non-<tt>null</tt> and non-empty if vetoed. Will be <tt>null</tt>
+     * (<i>not</i> the empty string) if this is consent is is allowed.
+     *
+     * <p>
+     * Will correspond to the {@link InteractionResult#getReason() reason} in
+     * the contained {@link #getInteractionResult() InteractionResult} (if one
+     * was specified).
+     */
+    String getReason();
+
+    /**
+     * Description of the interaction that this consent represents.
+     *
+     * <p>
+     * May be <tt>null</tt>.
+     */
+    String getDescription();
+
+    /**
+     * Allows the description of the interaction to which this consent relates
+     * to be specified or refined.
+     *
+     * @param description
+     * @return this consent
+     */
+    Consent setDescription(String description);
+
+    /**
+     * The {@link InteractionResult} that created this {@link Consent}.
+     *
+     * @return - may be <tt>null</tt> if created as a legacy {@link Consent}.
+     *
+     */
+    public InteractionResult getInteractionResult();
+
+}
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/consent/ConsentAbstract.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/consent/ConsentAbstract.java
new file mode 100644
index 0000000..995356c
--- /dev/null
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/consent/ConsentAbstract.java
@@ -0,0 +1,159 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ */
+
+package org.apache.isis.core.metamodel.consent;
+
+import java.io.Serializable;
+
+public abstract class ConsentAbstract implements Serializable, Consent {
+
+    /**
+     *
+     */
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * Factory method.
+     *
+     * <p>
+     * Used extensively by the DnD viewer.
+     */
+    public static Consent allowIf(final boolean allowed) {
+        return allowed ? Allow.DEFAULT : Veto.DEFAULT;
+    }
+
+    private final InteractionResult interactionResult;
+    private final String reason;
+
+    /**
+     * Can be subsequently {@link #setDescription(String) modified}, but is only
+     * a description of the event to which this consent applies and does not
+     * change whether the Consent represents an allow or a veto.
+     */
+    private String description;
+
+    private static String determineReason(final InteractionResult interactionResult) {
+        if (interactionResult == null) {
+            return null;
+        }
+        return interactionResult.getReason();
+    }
+
+    /**
+     *
+     * @param interactionResult
+     *            - if <tt>null</tt> then defaults to an {@link #isAllowed()
+     *            allowing} {@link Consent}.
+     */
+    protected ConsentAbstract(final InteractionResult interactionResult) {
+        this(interactionResult, null, determineReason(interactionResult));
+    }
+
+    /**
+     * Enable legacy {@link Consent}s (not created using an
+     * {@link InteractionResult}) to create an {@link Consent}, specifying a
+     * {@link #getDescription() description} of the event and the
+     * {@link #getReason() reason} (if any) that the consent is vetoed.
+     *
+     * @param description
+     *            - a description of the event to which this consent relates
+     * @param reason
+     *            - if not <tt>null</tt> and not empty, is the reason this
+     *            consent is vetoed.
+     */
+    protected ConsentAbstract(final String description, final String reason) {
+        this(null, description, reason);
+    }
+
+    private ConsentAbstract(
+            final InteractionResult interactionResult,
+            final String description,
+            final String reason) {
+        this.interactionResult = interactionResult;
+        this.description = description;
+        this.reason = reason;
+    }
+
+    /**
+     * The reason why this has been vetoed.
+     */
+    @Override
+    public String getReason() {
+        return isVetoed() ? this.reason : null;
+    }
+
+    @Override
+    public Consent setDescription(final String description) {
+        this.description = description;
+        return this;
+    }
+
+    /**
+     * Returns <tt>true</tt> if this object is giving permission (if the
+     * {@link #getReason() reason} is <tt>null</tt> or empty.
+     *
+     * @see #getReason()
+     */
+    @Override
+    public boolean isAllowed() {
+        return this.reason == null || this.reason.equals("");
+    }
+
+    /**
+     * Returns true if this object is NOT giving permission.
+     *
+     * @see #isAllowed()
+     */
+    @Override
+    public boolean isVetoed() {
+        return !isAllowed();
+    }
+
+    /**
+     * Underlying {@link InteractionResult} that created this {@link Consent}
+     * (may be <tt>null</tt>).
+     *
+     */
+    @Override
+    public InteractionResult getInteractionResult() {
+        return interactionResult;
+    }
+
+    /**
+     * Description of the action allowed by this event.
+     *
+     * <p>
+     * (Previously, {@link Allow} consents overloaded the {@link #getReason()
+     * reason} property with a description of the event. This has now been
+     * changed so that a non-<tt>null</tt> reason always implies a {@link Veto}.
+     * This property captures the description.
+     *
+     * @return
+     */
+    @Override
+    public String getDescription() {
+        return description;
+    }
+
+    @Override
+    public String toString() {
+        return (isVetoed() ? "VETOED" : "ALLOWED") + ", reason=" + reason;
+    }
+
+}
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/consent/InteractionAdvisor.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/consent/InteractionAdvisor.java
new file mode 100644
index 0000000..28d8a5f
--- /dev/null
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/consent/InteractionAdvisor.java
@@ -0,0 +1,103 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ */
+
+package org.apache.isis.core.metamodel.consent;
+
+import java.util.Map;
+import java.util.function.Consumer;
+
+import org.apache.isis.core.commons.internal.exceptions._Exceptions;
+import org.apache.isis.core.metamodel.facetapi.Facet;
+import org.apache.isis.core.metamodel.facetapi.FacetHolder;
+import org.apache.isis.core.metamodel.interactions.InteractionAdvisorFacet;
+
+/**
+ * Marker interface for implementations (specifically, {@link Facet}s) that can
+ * advise as to whether a member should be disabled.
+ *
+ * Used within {@link Allow} and {@link Veto}.
+ */
+public interface InteractionAdvisor {
+
+    /**
+     * For testing purposes only.
+     */
+    public static InteractionAdvisor NOOP = new InteractionAdvisorFacet() {
+        @Override
+        public void appendAttributesTo(final Map<String, Object> attributeMap) {
+        }
+
+        @Override
+        public boolean alwaysReplace() {
+            return false;
+        }
+
+        @Override
+        public Class<? extends Facet> facetType() {
+            return null;
+        }
+
+        @Override
+        public FacetHolder getFacetHolder() {
+            return null;
+        }
+
+        @Override
+        public boolean isFallback() {
+            return true;
+        }
+
+        @Override
+        public void setFacetHolder(final FacetHolder facetHolder) {
+        }
+
+        @Override
+        public Facet getUnderlyingFacet() {
+            return null;
+        }
+
+        @Override
+        public void setUnderlyingFacet(final Facet underlyingFacet) {
+            throw new UnsupportedOperationException();
+        }
+
+        @Override
+        public boolean isDerived() {
+            return false;
+        }
+
+        @Override
+        public void addContributedFacet(Facet contributedFacet) {
+            throw _Exceptions.unsupportedOperation();
+        }
+
+        @Override
+        public void forEachContributedFacet(Consumer<Facet> onContributedFacet) {
+            throw _Exceptions.unsupportedOperation();
+        }
+
+        @Override
+        public Class<? extends Facet> facetAliasType() {
+            return null;
+        }
+
+
+    };
+
+}
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/consent/InteractionContextType.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/consent/InteractionContextType.java
new file mode 100644
index 0000000..2c79d82
--- /dev/null
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/consent/InteractionContextType.java
@@ -0,0 +1,135 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ */
+
+package org.apache.isis.core.metamodel.consent;
+
+import org.apache.isis.core.metamodel.interactions.InteractionContext;
+
+/**
+ * Powertype for the {@link InteractionContext} hierarchy.
+ *
+ */
+public enum InteractionContextType {
+
+    /**
+     * Persisting the object.
+     */
+    OBJECT_VALIDATE("Saving or updating object"),
+    /**
+     * Viewing the object.
+     */
+    OBJECT_VISIBILITY("Viewing the object"),
+    /**
+     * Accessing the object's title.
+     */
+    OBJECT_TITLE("Reading object's title"),
+    /**
+     * Determining whether the property of the object is visible (or has been
+     * hidden).
+     */
+    PROPERTY_VISIBLE("View property"),
+    /**
+     * Determining whether the property of the object is either readable or
+     * modifiable (or has been disabled).
+     */
+    PROPERTY_USABLE("Use property"),
+    /**
+     * Reading the current value of the property of the object.
+     */
+    PROPERTY_READ("Read property"),
+    /**
+     * Modifying (or attempting to modify) the value of a property.
+     */
+    PROPERTY_MODIFY("Modify property"),
+    /**
+     * Determining whether the collection of the object is visible (or has been
+     * hidden).
+     */
+    COLLECTION_VISIBLE("View collection"),
+    /**
+     * Determining whether the collection of the object is either readable or
+     * modifiable (or has been disabled).
+     */
+    COLLECTION_USABLE("Use collection"),
+    /**
+     * Reading the contents of the collection.
+     */
+    COLLECTION_READ("Read contents of collection"),
+    /**
+     * Adding to (or attempting to add to) a collection.
+     */
+    COLLECTION_ADD_TO("Add to collection"),
+    /**
+     * Removing from (or attempting to remove from) a collection.
+     */
+    COLLECTION_REMOVE_FROM("Remove from collection"),
+    /**
+     * Whether the action of the object is visible (or has been hidden).
+     */
+    ACTION_VISIBLE("View action"),
+    /**
+     * Whether the action of the object is usable (or has been disabled).
+     */
+    ACTION_USABLE("Use action"),
+    /**
+     * Whether this particular action parameter argument is visible
+     * (given other parameter arguments that may already have been entered).
+     */
+    ACTION_PARAMETER_VISIBLE("Parameter visible"),
+    /**
+     * Whether this particular action parameter argument is usable
+     * (given other parameter arguments that may already have been entered).
+     */
+    ACTION_PARAMETER_USABLE("Parameter usable"),
+    /**
+     * Whether this particular proposed argument for an action invocation is
+     * valid (or if it is in fact invalid).
+     *
+     * <p>
+     * For example, ensuring that a regular expression match or number range is
+     * correct.
+     */
+    ACTION_PROPOSED_ARGUMENT("Proposed argument"),
+    /**
+     * Invoking (or attempting to invoke) an action.
+     *
+     * <p>
+     * Even if each of the {@link #ACTION_PROPOSED_ARGUMENT proposed arguments}
+     * are valid, it may not be possible to invoke the action if there the
+     * arguments together are invalid (for example,
+     * <tt>startDate &gt; endDate</tt>).
+     */
+    ACTION_INVOKE("Invoke action"),
+
+    /**
+     * Parsing a value (could be an property or an action argument).
+     */
+    PARSE_VALUE("Parsing value");
+
+    private final String description;
+
+    private InteractionContextType(final String description) {
+        this.description = description;
+    }
+
+    public String getDescription() {
+        return description;
+    }
+
+}
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/consent/InteractionInitiatedBy.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/consent/InteractionInitiatedBy.java
new file mode 100644
index 0000000..d734a30
--- /dev/null
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/consent/InteractionInitiatedBy.java
@@ -0,0 +1,33 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ */
+
+package org.apache.isis.core.metamodel.consent;
+
+import org.apache.isis.core.metamodel.interactions.InteractionContext;
+
+/**
+ * Whether an {@link InteractionContext} was invoked by the user, or is
+ * by the framework/programmatic.
+ */
+public enum InteractionInitiatedBy {
+
+    USER,
+    FRAMEWORK;
+
+}
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/consent/InteractionResult.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/consent/InteractionResult.java
new file mode 100644
index 0000000..a72c0dc
--- /dev/null
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/consent/InteractionResult.java
@@ -0,0 +1,155 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ */
+
+package org.apache.isis.core.metamodel.consent;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+
+import org.apache.isis.applib.services.wrapper.events.InteractionEvent;
+
+public class InteractionResult {
+
+    /**
+     * Initially {@link #ADVISING}; when call
+     * {@link InteractionResult#getInteractionEvent()}, flips over into
+     * {@link #ADVISED}.
+     *
+     * <p>
+     * Subsequent attempts to
+     * {@link InteractionResult#advise(String, InteractionAdvisor)} will then be
+     * disallowed.
+     */
+    enum State {
+        ADVISING, ADVISED
+    }
+
+    private final InteractionEvent interactionEvent;
+    private final StringBuilder reasonBuf = new StringBuilder();
+    private final List<InteractionAdvisor> advisors = new ArrayList<InteractionAdvisor>();
+
+    private State state = State.ADVISING;
+
+    public InteractionResult(final InteractionEvent interactionEvent) {
+        this.interactionEvent = interactionEvent;
+    }
+
+    /**
+     * Returns the contained {@link InteractionEvent}, if necessary updated with
+     * the {@link #advise(String, InteractionAdvisor) advice} of the
+     * interactions.
+     *
+     * <p>
+     * That is, if still {@link State#ADVISING advising}, then copies over the
+     * details from this result into the contained {@link InteractionEvent}, and
+     * flips into {@link State#ADVISED advised (done)}.
+     *
+     * @return
+     */
+    public InteractionEvent getInteractionEvent() {
+        if (state == State.ADVISING) {
+            interactionEvent.advised(getReason(), getAdvisorClass());
+            state = State.ADVISED;
+        }
+        return interactionEvent;
+    }
+
+    private Class<?> getAdvisorClass() {
+        final InteractionAdvisor advisor = getAdvisor();
+        return advisor != null ? advisor.getClass() : null;
+    }
+
+    public void advise(final String reason, final InteractionAdvisor facet) {
+        if (state == State.ADVISED) {
+            throw new IllegalStateException("Cannot append since have called getInteractionEvent");
+        }
+        if (reason == null) {
+            return;
+        }
+        if (isVetoing()) {
+            reasonBuf.append("; ");
+        }
+        advisors.add(facet);
+        reasonBuf.append(reason);
+    }
+
+    public boolean isVetoing() {
+        return !isNotVetoing();
+    }
+
+    public boolean isNotVetoing() {
+        return reasonBuf.length() == 0;
+    }
+
+    /**
+     * Returns the first of the {@link #getAdvisors()} that has been
+     * {@link #advise(String, InteractionAdvisor) advised} , or <tt>null</tt> if
+     * none yet.
+     *
+     * @see #getAdvisorFacets()
+     */
+    public InteractionAdvisor getAdvisor() {
+        return advisors.size() >= 1 ? advisors.get(0) : null;
+    }
+
+    /**
+     * Returns all {@link InteractionAdvisor advisor} (facet)s that have
+     * {@link #advise(String, InteractionAdvisor) append}ed reasons to the
+     * buffer.
+     *
+     * @see #getAdvisor()
+     */
+    public List<InteractionAdvisor> getAdvisorFacets() {
+        return Collections.unmodifiableList(advisors);
+    }
+
+    public Consent createConsent() {
+        if (isNotVetoing()) {
+            return new Allow(this);
+        } else {
+            return new Veto(this);
+        }
+    }
+
+    /**
+     * Gets the reason as currently known, but does not change the state.
+     *
+     * <p>
+     * If {@link #isNotVetoing()}, then returns <tt>null</tt>. Otherwise will be
+     * a non-empty string.
+     */
+    public String getReason() {
+        return isNotVetoing() ? null : reasonBuf.toString();
+    }
+
+    @Override
+    public String toString() {
+        return String.format("%s: %s: %s (%d facets advised)", interactionEvent, state, toStringInterpret(reasonBuf), advisors.size());
+    }
+
+    private String toStringInterpret(final StringBuilder reasonBuf) {
+        if (getReason().length() == 0) {
+            return "allowed";
+        } else {
+            return "vetoed";
+        }
+    }
+
+}
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/consent/InteractionResultSet.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/consent/InteractionResultSet.java
new file mode 100644
index 0000000..0355f57
--- /dev/null
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/consent/InteractionResultSet.java
@@ -0,0 +1,104 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ */
+
+package org.apache.isis.core.metamodel.consent;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public class InteractionResultSet {
+
+    private final List<InteractionResult> results = new ArrayList<InteractionResult>();
+    private InteractionResult firstResult = null;
+
+    public InteractionResultSet() {
+    }
+
+    public InteractionResultSet add(final InteractionResult result) {
+        if (firstResult == null) {
+            firstResult = result;
+        }
+        this.results.add(result);
+        return this;
+    }
+
+    /**
+     * Empty only if all the {@link #add(InteractionResult) contained}
+     * {@link InteractionResult}s are also
+     * {@link InteractionResult#isNotVetoing() empty}.
+     */
+    public boolean isAllowed() {
+        return !isVetoed();
+    }
+
+    /**
+     * Vetoed if any of the {@link #add(InteractionResult) contained}
+     * {@link InteractionResult}s are also {@link InteractionResult#isVetoing()
+     * not empty}.
+     *
+     * @return
+     */
+    public boolean isVetoed() {
+        for (final InteractionResult result : results) {
+            if (result.isVetoing()) {
+                return true;
+            }
+        }
+        return false;
+    }
+
+    /**
+     * Returns the {@link Consent} corresponding to
+     * {@link #getInteractionResult()}, or an {@link Allow} if there have been
+     * no {@link InteractionResult}s {@link #add(InteractionResult) added}.
+     *
+     * @return
+     */
+    public Consent createConsent() {
+        final InteractionResult interactionResult = getInteractionResult();
+        if (interactionResult == null) {
+            return Allow.DEFAULT;
+        }
+        return interactionResult.createConsent();
+    }
+
+    /**
+     * Returns the &quot;best&quot; contained {@link InteractionResult}.
+     *
+     * <p>
+     * This will be the first {@link InteractionResult} that has vetoed the
+     * interaction, or the first {@link InteractionResult}
+     * {@link #add(InteractionResult) added} if none have vetoed.
+     *
+     * @return
+     */
+    public InteractionResult getInteractionResult() {
+        for (final InteractionResult result : results) {
+            if (!result.isNotVetoing()) {
+                return result;
+            }
+        }
+        return firstResult != null ? firstResult : null;
+    }
+
+    @Override
+    public String toString() {
+        return super.toString();
+    }
+}
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/consent/Veto.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/consent/Veto.java
new file mode 100644
index 0000000..f6272c6
--- /dev/null
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/consent/Veto.java
@@ -0,0 +1,48 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ */
+
+package org.apache.isis.core.metamodel.consent;
+
+import org.apache.isis.core.metamodel.facetapi.Facet;
+
+import static org.apache.isis.core.commons.internal.base._With.requiresNotEmpty;
+
+public class Veto extends ConsentAbstract {
+
+    private static final long serialVersionUID = 1L;
+
+    public static Veto DEFAULT = new Veto("Vetoed by default");
+
+    /**
+     * Called by DnD viewer; we should instead find a way to put the calling
+     * logic into {@link Facet}s so that it is available for use by other
+     * viewers.
+     *
+     * @param reasonVeteod
+     *            - must not be empty or <tt>null</tt>
+     */
+    public Veto(final String reasonVetoed) {
+        super(null, requiresNotEmpty(reasonVetoed, "reasonVetoed")); 
+    }
+
+    public Veto(final InteractionResult interactionResult) {
+        super(interactionResult);
+    }
+
+}
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/context/MetaModelContext.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/context/MetaModelContext.java
new file mode 100644
index 0000000..756a480
--- /dev/null
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/context/MetaModelContext.java
@@ -0,0 +1,212 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ */
+package org.apache.isis.core.metamodel.context;
+
+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.core.commons.internal.environment.IsisSystemEnvironment;
+import org.apache.isis.core.config.IsisConfiguration;
+import org.apache.isis.core.metamodel.objectmanager.ObjectManager;
+import org.apache.isis.core.metamodel.specloader.SpecificationLoader;
+import org.apache.isis.core.metamodel.services.homepage.HomePageAction;
+import org.apache.isis.core.metamodel.spec.ManagedObject;
+import org.apache.isis.core.metamodel.spec.ObjectSpecification;
+import org.apache.isis.security.api.authentication.AuthenticationSession;
+import org.apache.isis.security.api.authentication.AuthenticationSessionProvider;
+import org.apache.isis.security.api.authentication.manager.AuthenticationManager;
+import org.apache.isis.security.api.authorization.manager.AuthorizationManager;
+
+/**
+ * 
+ * @since 2.0
+ *
+ */
+public interface MetaModelContext {
+
+    IsisSystemEnvironment getSystemEnvironment();
+    
+    /**
+     * 
+     * Configuration 'beans' with meta-data (IDE-support).
+     * 
+     * @see <a href="https://docs.spring.io/spring-boot/docs/current/reference/html/configuration-metadata.html">spring.io</a>
+     *
+     */
+    IsisConfiguration getConfiguration();
+
+    ObjectManager getObjectManager();
+    
+    ServiceInjector getServiceInjector();
+
+    ServiceRegistry getServiceRegistry();
+
+    SpecificationLoader getSpecificationLoader();
+    
+    public default ObjectSpecification getSpecification(final Class<?> type) {
+        return type != null ? getSpecificationLoader().loadSpecification(type) : null;
+    }
+
+    AuthenticationSessionProvider getAuthenticationSessionProvider();
+
+    TranslationService getTranslationService();
+
+    AuthorizationManager getAuthorizationManager();
+
+    AuthenticationManager getAuthenticationManager();
+
+    TitleService getTitleService();
+
+    RepositoryService getRepositoryService();
+
+    TransactionService getTransactionService();
+
+    TransactionState getTransactionState();
+
+    HomePageAction getHomePageAction();
+
+    Stream<ManagedObject> streamServiceAdapters();
+
+    ManagedObject lookupServiceAdapterById(String serviceId);
+    
+    <T> T getSingletonElseFail(Class<T> type);
+    
+    // -- EXTRACTORS
+    
+    public static MetaModelContext from(ManagedObject adapter) {
+        return adapter.getSpecification().getMetaModelContext();
+    }
+
+    // -- DELEGATION - FOR THOSE THAT IMPLEMENT THROUGH DELEGATION
+
+    public static interface Delegating extends MetaModelContext {
+
+        public MetaModelContext getMetaModelContext();
+
+        @Override
+        default IsisSystemEnvironment getSystemEnvironment() {
+            return getMetaModelContext().getSystemEnvironment();
+        }
+        
+        @Override
+        public default IsisConfiguration getConfiguration() {
+            return getMetaModelContext().getConfiguration();
+        }
+
+        @Override
+        public default ServiceInjector getServiceInjector() {
+            return getMetaModelContext().getServiceInjector();
+        }
+
+        @Override
+        public default ServiceRegistry getServiceRegistry() {
+            return getMetaModelContext().getServiceRegistry();
+        }
+
+        @Override
+        public default SpecificationLoader getSpecificationLoader() {
+            return getMetaModelContext().getSpecificationLoader();
+        }
+
+        @Override
+        public default AuthenticationSessionProvider getAuthenticationSessionProvider() {
+            return getMetaModelContext().getAuthenticationSessionProvider();
+        }
+
+        @Override
+        public default TranslationService getTranslationService() {
+            return getMetaModelContext().getTranslationService();
+        }
+
+        default AuthenticationSession getAuthenticationSession() {
+            return getAuthenticationSessionProvider().getAuthenticationSession();
+        }
+
+        @Override
+        public default AuthorizationManager getAuthorizationManager() {
+            return getMetaModelContext().getAuthorizationManager();
+        }
+
+        @Override
+        public default AuthenticationManager getAuthenticationManager() {
+            return getMetaModelContext().getAuthenticationManager();
+        }
+
+        @Override
+        public default TitleService getTitleService() {
+            return getMetaModelContext().getTitleService();
+        }
+
+        @Override
+        public default ObjectSpecification getSpecification(Class<?> type) {
+            return getMetaModelContext().getSpecification(type);
+        }
+
+        @Override
+        public default RepositoryService getRepositoryService() {
+            return getMetaModelContext().getRepositoryService();
+        }
+
+        @Override
+        public default TransactionState getTransactionState() {
+            return getMetaModelContext().getTransactionState();
+        }
+
+        @Override
+        public default HomePageAction getHomePageAction() {
+            return getMetaModelContext().getHomePageAction();
+        }
+
+        @Override
+        public default TransactionService getTransactionService() {
+            return getMetaModelContext().getTransactionService();
+        }
+
+        @Override
+        public default Stream<ManagedObject> streamServiceAdapters() {
+            return getMetaModelContext().streamServiceAdapters();
+        }
+
+        @Override
+        default ManagedObject lookupServiceAdapterById(String serviceId) {
+            return getMetaModelContext().lookupServiceAdapterById(serviceId);
+        }
+        
+        @Override
+        default <T> T getSingletonElseFail(Class<T> type) {
+            return getMetaModelContext().getSingletonElseFail(type);
+        }
+        
+        @Override
+        default ObjectManager getObjectManager() {
+            return getMetaModelContext().getObjectManager();
+        }
+
+    }
+
+    
+    
+
+}
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/context/MetaModelContextAware.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/context/MetaModelContextAware.java
new file mode 100644
index 0000000..6a8676e
--- /dev/null
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/context/MetaModelContextAware.java
@@ -0,0 +1,29 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ */
+package org.apache.isis.core.metamodel.context;
+
+/**
+ * 
+ * @since 2.0
+ *
+ */
+public interface MetaModelContextAware {
+
+    void setMetaModelContext(MetaModelContext metaModelContext);
+}
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/context/MetaModelContext_usingIoc.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/context/MetaModelContext_usingIoc.java
new file mode 100644
index 0000000..81a5e90
--- /dev/null
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/context/MetaModelContext_usingIoc.java
@@ -0,0 +1,172 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ */
+package org.apache.isis.core.metamodel.context;
+
+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.core.commons.internal.base._Lazy;
+import org.apache.isis.core.commons.internal.environment.IsisSystemEnvironment;
+import org.apache.isis.core.commons.internal.exceptions._Exceptions;
+import org.apache.isis.core.commons.internal.ioc.IocContainer;
+import org.apache.isis.core.commons.internal.ioc.ManagedBeanAdapter;
+import org.apache.isis.core.config.IsisConfiguration;
+import org.apache.isis.core.metamodel.objectmanager.ObjectManager;
+import org.apache.isis.core.metamodel.specloader.SpecificationLoader;
+import org.apache.isis.core.metamodel.services.ServiceUtil;
+import org.apache.isis.core.metamodel.services.homepage.HomePageAction;
+import org.apache.isis.core.metamodel.services.homepage.HomePageResolverService;
+import org.apache.isis.core.metamodel.spec.ManagedObject;
+import org.apache.isis.security.api.authentication.AuthenticationSessionProvider;
+import org.apache.isis.security.api.authentication.manager.AuthenticationManager;
+import org.apache.isis.security.api.authorization.manager.AuthorizationManager;
+
+import lombok.Getter;
+import lombok.val;
+
+
+class MetaModelContext_usingIoc implements MetaModelContext {
+
+    private final IocContainer iocContainer;
+    public MetaModelContext_usingIoc(IocContainer iocContainer) {
+        this.iocContainer = iocContainer;
+    }
+
+    @Getter(lazy=true) 
+    private final IsisSystemEnvironment systemEnvironment = 
+    getSingletonElseFail(IsisSystemEnvironment.class);
+    
+    @Getter(lazy=true) 
+    private final IsisConfiguration configuration = 
+    getSingletonElseFail(IsisConfiguration.class);
+
+    @Getter(lazy=true) 
+    private final ServiceInjector serviceInjector =
+    getSingletonElseFail(ServiceInjector.class);
+
+    @Getter(lazy=true) 
+    private final ServiceRegistry serviceRegistry =
+    getSingletonElseFail(ServiceRegistry.class);
+
+    @Getter(lazy=true) 
+    private final SpecificationLoader specificationLoader =
+    getSingletonElseFail(SpecificationLoader.class);
+
+    @Getter(lazy=true)
+    private final AuthenticationSessionProvider authenticationSessionProvider =
+    getSingletonElseFail(AuthenticationSessionProvider.class);
+
+    @Getter(lazy=true) 
+    private final TranslationService translationService =
+    getSingletonElseFail(TranslationService.class);
+
+    @Getter(lazy=true) 
+    private final AuthorizationManager authorizationManager =
+    getSingletonElseFail(AuthorizationManager.class); 
+
+    @Getter(lazy=true) 
+    private final AuthenticationManager authenticationManager =
+    getSingletonElseFail(AuthenticationManager.class);
+
+    @Getter(lazy=true) 
+    private final TitleService titleService =
+    getSingletonElseFail(TitleService.class);
+
+    @Getter(lazy=true) 
+    private final RepositoryService repositoryService =
+    getSingletonElseFail(RepositoryService.class);
+
+    @Getter(lazy=true) 
+    private final TransactionService transactionService =
+    getSingletonElseFail(TransactionService.class);
+
+    @Getter(lazy=true) 
+    private final HomePageResolverService homePageResolverService =
+    getSingletonElseFail(HomePageResolverService.class);
+
+    @Getter(lazy=true) 
+    private final ObjectManager objectManager =
+    getSingletonElseFail(ObjectManager.class);
+    
+    
+    @Override
+    public final TransactionState getTransactionState() {
+        return getTransactionService().currentTransactionState();
+    }
+
+    @Override
+    public final HomePageAction getHomePageAction() {
+        return getHomePageResolverService().getHomePageAction();
+    }
+
+    // -- SERVICE SUPPORT
+
+    @Override
+    public Stream<ManagedObject> streamServiceAdapters() {
+        return objectAdaptersForBeansOfKnownSort.get().values().stream();
+    }
+
+    @Override
+    public ManagedObject lookupServiceAdapterById(final String serviceId) {
+        return objectAdaptersForBeansOfKnownSort.get().get(serviceId);
+    }
+
+    // -- LOOKUP
+
+    @Override
+    public <T> T getSingletonElseFail(Class<T> type) {
+        return iocContainer.getSingletonElseFail(type);
+    }
+
+    
+    // -- HELPER
+
+    private final _Lazy<Map<String, ManagedObject>> objectAdaptersForBeansOfKnownSort = 
+            _Lazy.threadSafe(this::collectBeansOfKnownSort);
+
+    private Map<String, ManagedObject> collectBeansOfKnownSort() {
+
+        return getServiceRegistry()
+                .streamRegisteredBeans()
+                .map(this::toManagedObject) 
+                .collect(Collectors.toMap(ServiceUtil::idOfAdapter, v->v, (o,n)->n, LinkedHashMap::new));
+    }
+    
+    private ManagedObject toManagedObject(ManagedBeanAdapter managedBeanAdapter) {
+        
+        val servicePojo = managedBeanAdapter.getInstance().getFirst()
+                .orElseThrow(()->_Exceptions.unrecoverableFormatted(
+                        "Cannot get service instance of type '%s'", 
+                        managedBeanAdapter.getBeanClass()));
+        
+        return ManagedObject.of(getSpecificationLoader()::loadSpecification, servicePojo);
+        
+    }
+
+
+}
\ No newline at end of file
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/context/MetaModelContexts.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/context/MetaModelContexts.java
new file mode 100644
index 0000000..8438cfb
--- /dev/null
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/context/MetaModelContexts.java
@@ -0,0 +1,44 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ */
+package org.apache.isis.core.metamodel.context;
+
+import javax.inject.Named;
+import javax.inject.Singleton;
+
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.context.annotation.Primary;
+
+import org.apache.isis.core.commons.internal.environment.IsisSystemEnvironment;
+
+/**
+ * 
+ * @since 2.0
+ *
+ */
+@Configuration
+@Named("isisMetaModel.MetaModelContexts")
+public class MetaModelContexts {
+
+    @Bean @Singleton @Primary
+    public MetaModelContext metaModelContext(final IsisSystemEnvironment systemEnvironment) {
+        return new MetaModelContext_usingIoc(systemEnvironment.getIocContainer());
+    }
+
+}
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/exceptions/MetaModelException.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/exceptions/MetaModelException.java
new file mode 100644
index 0000000..437ec37
--- /dev/null
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/exceptions/MetaModelException.java
@@ -0,0 +1,43 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ */
+
+package org.apache.isis.core.metamodel.exceptions;
+
+import org.apache.isis.core.commons.exceptions.IsisException;
+
+public class MetaModelException extends IsisException {
+    private static final long serialVersionUID = 1L;
+
+    public MetaModelException() {
+        super();
+    }
+
+    public MetaModelException(final String message) {
+        super(message);
+    }
+
+    public MetaModelException(final Throwable cause) {
+        super(cause);
+    }
+
+    public MetaModelException(final String message, final Throwable cause) {
+        super(message, cause);
+    }
+
+}
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/exceptions/persistence/ObjectNotFoundException.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/exceptions/persistence/ObjectNotFoundException.java
new file mode 100644
index 0000000..f41384f
--- /dev/null
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/exceptions/persistence/ObjectNotFoundException.java
@@ -0,0 +1,38 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ */
+
+package org.apache.isis.core.metamodel.exceptions.persistence;
+
+import org.apache.isis.core.metamodel.adapter.oid.Oid;
+
+/**
+ * Indicates that the <tt>PojoRecreator</tt> was unable to instantiate a new pojo for the specified
+ * {@link Oid}.
+ */
+public class ObjectNotFoundException extends ObjectPersistenceException {
+    private static final long serialVersionUID = 1L;
+
+    public ObjectNotFoundException(final Oid oid) {
+        super("Object not found in store with oid " + oid);
+    }
+
+    public ObjectNotFoundException(final Oid oid, final Throwable cause) {
+        super("Object not found in store with oid " + oid, cause);
+    }
+}
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/exceptions/persistence/ObjectPersistenceException.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/exceptions/persistence/ObjectPersistenceException.java
new file mode 100644
index 0000000..f1a9dd2
--- /dev/null
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/exceptions/persistence/ObjectPersistenceException.java
@@ -0,0 +1,42 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ */
+
+package org.apache.isis.core.metamodel.exceptions.persistence;
+
+import org.apache.isis.core.commons.exceptions.IsisException;
+
+public class ObjectPersistenceException extends IsisException {
+    private static final long serialVersionUID = 1L;
+
+    public ObjectPersistenceException() {
+        super();
+    }
+
+    public ObjectPersistenceException(final String message) {
+        super(message);
+    }
+
+    public ObjectPersistenceException(final String message, final Throwable cause) {
+        super(message, cause);
+    }
+
+    public ObjectPersistenceException(final Throwable cause) {
+        super(cause);
+    }
+}
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/exceptions/persistence/PojoRecreationException.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/exceptions/persistence/PojoRecreationException.java
new file mode 100644
index 0000000..fe11f34
--- /dev/null
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/exceptions/persistence/PojoRecreationException.java
@@ -0,0 +1,31 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ */
+
+package org.apache.isis.core.metamodel.exceptions.persistence;
+
+import org.apache.isis.core.metamodel.adapter.oid.Oid;
+
+public class PojoRecreationException extends ObjectPersistenceException {
+    private static final long serialVersionUID = 1L;
+
+    public PojoRecreationException(Oid oid, Throwable cause) {
+        super(String.format("Could not recreate pojo for oid '%s'.", oid), cause);
+
+    }
+}
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/exceptions/persistence/PojoRefreshException.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/exceptions/persistence/PojoRefreshException.java
new file mode 100644
index 0000000..bbac79b
--- /dev/null
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/exceptions/persistence/PojoRefreshException.java
@@ -0,0 +1,34 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ */
+
+package org.apache.isis.core.metamodel.exceptions.persistence;
+
+import org.apache.isis.core.metamodel.adapter.oid.Oid;
+
+public class PojoRefreshException extends ObjectNotFoundException {
+    private static final long serialVersionUID = 1L;
+
+    public PojoRefreshException(Oid oid) {
+        super(oid);
+    }
+
+    public PojoRefreshException(Oid oid, Throwable cause) {
+        super(oid, cause);
+    }
+}
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facetapi/Facet.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facetapi/Facet.java
new file mode 100644
index 0000000..34cd243
--- /dev/null
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facetapi/Facet.java
@@ -0,0 +1,123 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ */
+
+package org.apache.isis.core.metamodel.facetapi;
+
+import java.util.function.Consumer;
+
+import org.apache.isis.core.metamodel.facets.actions.action.invocation.ActionInvocationFacet;
+
+public interface Facet extends FacetWithAttributes {
+
+    /**
+     * The {@link FacetHolder holder} of this facet.
+     *
+     * @return
+     */
+    FacetHolder getFacetHolder();
+
+    /**
+     * Allows reparenting of Facet.
+     *
+     * <p>
+     * Used by Facet decorators.
+     *
+     * @param facetHolder
+     */
+    public void setFacetHolder(FacetHolder facetHolder);
+
+    /**
+     * Underlying {@link Facet} of the same {@link #facetType() type}, if any.
+     */
+    public Facet getUnderlyingFacet();
+
+    /**
+     * Sets underlying {@link Facet}, that is, creating a chain.
+     *
+     * <p>
+     * Must be of the same {@link #facetType() type}.
+     */
+    public void setUnderlyingFacet(Facet underlyingFacet);
+
+    /**
+     * Determines the type of this facet to be stored under.
+     *
+     * <p>
+     * The framework looks for {@link Facet}s of certain well-known facet types.
+     * Each facet implementation must specify which type of facet it corresponds
+     * to. This therefore allows the (rules of the) programming model to be
+     * varied without impacting the rest of the framework.
+     *
+     * <p>
+     * For example, the <tt>ActionInvocationFacet</tt> specifies the facet to
+     * invoke an action. The typical implementation of this wraps a
+     * <tt>public</tt> method. However, a different facet factory could be
+     * installed that creates facet also of type {@link ActionInvocationFacet}
+     * but that have some other rule, such as requiring an <i>action</i> prefix,
+     * or that decorate the interaction by logging it, for example.
+     */
+    Class<? extends Facet> facetType();
+
+    /**
+     * Whether this facet implementation is derived (as opposed to explicit);
+     * used to determine precedence.
+     *
+     * <p>
+     * For example, we might derive the typical length of a property based on
+     * its type; but if the typical length has been explicitly specified using
+     * an annotation then that should take precedence.
+     */
+    public boolean isDerived();
+
+    /**
+     * Whether this facet implementation is a fallback. Meaning it is treated 
+     * with lowest priority, always overruled by any other facet of same type.  
+     */
+    public boolean isFallback();
+
+    /**
+     * Whether this facet implementation should replace existing (none-fallback)
+     * implementations.
+     */
+    public boolean alwaysReplace();
+
+    // -- FACET ALIAS SUPPORT
+    
+    /**
+     * Adds a facet this facet contributes.
+     * @since 2.0
+     */
+    void addContributedFacet(Facet contributedFacet);
+
+    /**
+     * Traverses all contributed facets (if any).
+     * @since 2.0
+     */
+    void forEachContributedFacet(Consumer<Facet> onContributedFacet);
+
+    /**
+     * An alternative type this Facet can be looked up via {@link FacetHolder#getFacet(Class)}.
+     * @apiNote like {@link #facetType()} the alias must be unique within any facet-holder's 
+     * registered facet-types, otherwise an {@link IllegalArgumentException} is thrown during
+     * facet-processing; this is to ensure unambiguous lookup of facets by their alias type 
+     * @since 2.0
+     */
+    Class<? extends Facet> facetAliasType();
+
+}
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facetapi/FacetAbstract.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facetapi/FacetAbstract.java
new file mode 100644
index 0000000..eba96cc
--- /dev/null
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facetapi/FacetAbstract.java
@@ -0,0 +1,287 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ */
+
+package org.apache.isis.core.metamodel.facetapi;
+
+import java.util.Map;
+import java.util.Objects;
+import java.util.Set;
+import java.util.function.Consumer;
+
+import org.apache.isis.core.commons.internal.collections._Sets;
+import org.apache.isis.core.commons.internal.exceptions._Exceptions;
+import org.apache.isis.core.metamodel.context.MetaModelContext;
+
+import static org.apache.isis.core.commons.internal.base._With.requires;
+
+import lombok.Setter;
+import lombok.val;
+
+
+public abstract class FacetAbstract implements Facet, MetaModelContext.Delegating {
+
+    public enum Derivation {
+        DERIVED,
+        NOT_DERIVED
+    }
+
+    private Facet underlyingFacet;
+
+    private final Class<? extends Facet> facetType;
+    @Setter private Class<? extends Facet> facetAliasType;
+    private Set<Facet> contributedFacets; // lazy init
+    
+    private final boolean derived;
+    private FacetHolder holder;
+
+    /**
+     * Populated in {@link #setFacetHolder(FacetHolder)} if the provided holder
+     * implements {@link IdentifiedHolder}.
+     *
+     * <p>
+     * Otherwise is <tt>null</tt>.
+     */
+    private IdentifiedHolder identifiedHolder;
+
+    public FacetAbstract(
+            Class<? extends Facet> facetType,
+            FacetHolder holder,
+            Derivation derivation) {
+        
+        this.facetType = requires(facetType, "facetType"); 
+        setFacetHolder(holder);
+        this.derived = (derivation == Derivation.DERIVED);
+    }
+    
+    protected FacetAbstract(
+            Class<? extends Facet> facetType,
+            FacetHolder holder) {
+        
+        this(facetType, holder, Derivation.NOT_DERIVED);
+    }
+
+    @Override
+    public final Class<? extends Facet> facetType() {
+        return facetType;
+    }
+    
+    @Override
+    public Class<? extends Facet> facetAliasType() {
+        return facetAliasType!=facetType ? facetAliasType : null; // avoids facetAliasType equals facetType 
+    }
+    
+    @Override
+    public FacetHolder getFacetHolder() {
+        return holder;
+    }
+    
+    @Override
+    public MetaModelContext getMetaModelContext() {
+        return holder.getMetaModelContext();
+    }
+
+    @Override
+    public boolean isDerived() {
+        return derived;
+    }
+
+    /**
+     * Convenience method that returns {@link #getFacetHolder()} downcast to
+     * {@link IdentifiedHolder} if the implementation does indeed inherit from
+     * {@link IdentifiedHolder}, otherwise <tt>null</tt>.
+     */
+    public IdentifiedHolder getIdentified() {
+        return identifiedHolder;
+    }
+
+    @Override
+    public Facet getUnderlyingFacet() {
+        return underlyingFacet;
+    }
+
+    @Override
+    public void setUnderlyingFacet(final Facet underlyingFacet) {
+        if(underlyingFacet != null) {
+//            if(underlyingFacet instanceof MultiTypedFacet) {
+//                val multiTypedFacet = (MultiTypedFacet) underlyingFacet;
+//                val matches = compatible(multiTypedFacet);
+//                if(!matches) {
+//                    throw new IllegalArgumentException("illegal argument, expected underlying facet (a multi-valued facet) to have equivalent to the facet type (or facet types) of this facet");
+//                }
+//            } else {
+                
+                val underlyingFacetType = underlyingFacet.facetType();
+                if(!Objects.equals(underlyingFacetType, facetType)) {
+                    val msg = String.format(
+                            "type-missmatch: underlying facet's type '%s' "
+                            + "must match this facet's type '%s'", 
+                            underlyingFacetType, facetType);
+                    throw _Exceptions.unrecoverable(msg);
+                }
+ 
+ //           }
+        }
+        this.underlyingFacet = underlyingFacet;
+    }
+
+//    private boolean compatible(final MultiTypedFacet multiTypedFacet) {
+//
+//        if (!(this instanceof MultiTypedFacet)) {
+//            return multiTypedFacet.containsFacetTypeOf(this.facetType);
+//        }
+//
+//        val thisAsMultiTyped = (MultiTypedFacet) this;
+//        
+//        return thisAsMultiTyped.facetTypes()
+//                .anyMatch(multiTypedFacet::containsFacetTypeOf);
+//    }
+
+    /**
+     * Assume implementation is <i>not</i> a no-op.
+     *
+     * <p>
+     * No-op implementations should override and return <tt>true</tt>.
+     */
+    @Override
+    public boolean isFallback() {
+        return false;
+    }
+
+    /**
+     * Default implementation of this method that returns <tt>true</tt>, ie
+     * should replace (none {@link #isFallback() no-op} implementations.
+     *
+     * <p>
+     * Implementations that don't wish to replace none no-op implementations
+     * should override and return <tt>false</tt>.
+     */
+    @Override
+    public boolean alwaysReplace() {
+        return true;
+    }
+
+    @Override
+    public void setFacetHolder(final FacetHolder facetHolder) {
+        this.holder = facetHolder;
+        this.identifiedHolder = (holder!=null && holder instanceof IdentifiedHolder) 
+                ? (IdentifiedHolder) holder 
+                        : null;
+    }
+
+    protected String toStringValues() {
+        return "";
+    }
+
+    @Override
+    public String toString() {
+        String details = "";
+        if (isValidating()) {
+            details += "Validating";
+        }
+        if (isDisabling()) {
+            details += (details.length() > 0 ? ";" : "") + "Disabling";
+        }
+        if (isHiding()) {
+            details += (details.length() > 0 ? ";" : "") + "Hiding";
+        }
+        if (!"".equals(details)) {
+            details = "interaction=" + details + ",";
+        }
+
+        final String className = getClass().getName();
+        final String stringValues = toStringValues();
+        if (getClass() != facetType()) {
+            final String facetType = facetType().getName();
+            details += "type=" + facetType.substring(facetType.lastIndexOf('.') + 1);
+        }
+        if (!"".equals(stringValues)) {
+            details += ",";
+        }
+        return className.substring(className.lastIndexOf('.') + 1) + "[" + details + stringValues + "]";
+    }
+
+    private boolean isHiding() {
+        return Hiding.class.isAssignableFrom(getClass());
+    }
+
+    private boolean isDisabling() {
+        return Disabling.class.isAssignableFrom(getClass());
+    }
+
+    private boolean isValidating() {
+        return Validating.class.isAssignableFrom(getClass());
+    }
+
+    @Override
+    public void appendAttributesTo(final Map<String, Object> attributeMap) {
+        if(derived) {
+            attributeMap.put("derived", derived);
+        }
+        attributeMap.put("underlyingFacet", underlyingFacet);
+        if(isFallback()) {
+            attributeMap.put("noop", isFallback());
+        }
+        if(isHiding()) {
+            attributeMap.put("hiding", isHiding());
+        }
+        if(isDisabling()) {
+            attributeMap.put("disabling", isDisabling());
+        }
+        if(isValidating()) {
+            attributeMap.put("validating", isValidating());
+        }
+    }
+
+    /**
+     * Marker interface used within {@link #toString()}.
+     */
+    public static interface Hiding {
+    }
+
+    /**
+     * Marker interface used within {@link #toString()}.
+     */
+    public static interface Disabling {
+    }
+
+    /**
+     * Marker interface used within {@link #toString()}.
+     */
+    public static interface Validating {
+    }
+
+    // -- CONTRIBUTED FACET SUPPORT
+    
+    @Override
+    public void addContributedFacet(Facet contributedFacet) {
+        if(contributedFacets==null) {
+            contributedFacets = _Sets.newHashSet();
+        }
+        contributedFacets.add(contributedFacet);
+    }
+    
+    @Override
+    public void forEachContributedFacet(Consumer<Facet> onContributedFacet) {
+        if(contributedFacets!=null) {
+            contributedFacets.forEach(onContributedFacet);
+        }
+    }
+
+
+}
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facetapi/FacetHolder.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facetapi/FacetHolder.java
new file mode 100644
index 0000000..075e1b9
--- /dev/null
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facetapi/FacetHolder.java
@@ -0,0 +1,150 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ */
+
+package org.apache.isis.core.metamodel.facetapi;
+
+import java.util.stream.Stream;
+
+import org.apache.isis.core.metamodel.context.MetaModelContext;
+
+import lombok.val;
+
+/**
+ * Anything in the metamodel (which also includes peers in the reflector) that
+ * can be extended.
+ */
+public interface FacetHolder {
+
+    int getFacetCount();
+
+    /**
+     * Get the facet of the specified type (as per the type it reports from
+     * {@link Facet#facetType()}).
+     */
+    <T extends Facet> T getFacet(Class<T> cls);
+
+    /**
+     * Whether there is a facet registered of the specified type.
+     */
+    boolean containsFacet(Class<? extends Facet> facetType);
+
+    /**
+     * Whether there is a facet registered of the specified type that is not a
+     * {@link Facet#isFallback() fallback} .
+     * <p>
+     * Convenience; saves having to {@link #getFacet(Class)} and then check if
+     * <tt>null</tt> and not a fallback.
+     */
+    default boolean containsNonFallbackFacet(Class<? extends Facet> facetType) {
+        val facet = getFacet(facetType);
+        return facet != null && !facet.isFallback();
+    }
+
+    /**
+     * As {@link #containsNonFallbackFacet(Class)}, with additional requirement, that the
+     * facet is <i>explicit</i>, not {@link Facet#isDerived() derived}.
+     */
+    default boolean containsExplicitNonFallbackFacet(Class<? extends Facet> facetType) {
+        val facet = getFacet(facetType);
+        return facet != null && !facet.isFallback() && !facet.isDerived();
+    }
+
+    Stream<Facet> streamFacets();
+    
+    default <F extends Facet> Stream<F> streamFacets(Class<F> requiredType) {
+        return streamFacets()
+                .filter(facet->requiredType.isAssignableFrom(facet.getClass()))
+                .map(requiredType::cast);
+    }
+
+    /**
+     * Adds the facet, extracting its {@link Facet#facetType() type} as the key.
+     *
+     * <p>
+     * If there are any facet of the same type, they will be overwritten
+     * <i>provided</i> that either the {@link Facet} specifies to
+     * {@link Facet#alwaysReplace() always replace} or if the existing
+     * {@link Facet} is a {@link Facet#isFallback() no-op}.
+     */
+    void addFacet(Facet facet);
+
+    /**
+     * Replaces any existing facet with the given one, while copying any underlying 
+     * facet from the existing to the given one.
+     * 
+     * @param facet
+     * @since 2.0
+     */
+    void addOrReplaceFacet(Facet facet);
+    
+    /**
+     * 
+     * @since 2.0
+     */
+    MetaModelContext getMetaModelContext();
+
+    /**
+     * For those that implement through delegation.
+     * @since 2.0
+     *
+     */
+    public static interface Delegating extends FacetHolder {
+        
+        FacetHolder getFacetHolder();
+
+        @Override
+        default public int getFacetCount() {
+            return getFacetHolder().getFacetCount();
+        }
+
+        @Override
+        default public <T extends Facet> T getFacet(Class<T> cls) {
+            return getFacetHolder().getFacet(cls);
+        }
+
+        @Override
+        default public boolean containsFacet(Class<? extends Facet> facetType) {
+            return getFacetHolder().containsFacet(facetType);
+        }
+
+        @Override
+        default public Stream<Facet> streamFacets() {
+            return getFacetHolder().streamFacets();
+        }
+
+        @Override
+        default public void addFacet(Facet facet) {
+            getFacetHolder().addFacet(facet);
+        }
+
+        @Override
+        default public void addOrReplaceFacet(Facet facet) {
+            getFacetHolder().addOrReplaceFacet(facet);
+        }
+
+        @Override
+        default public MetaModelContext getMetaModelContext() {
+            return getFacetHolder().getMetaModelContext();
+        }
+        
+        
+    }
+    
+
+}
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facetapi/FacetHolderImpl.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facetapi/FacetHolderImpl.java
new file mode 100644
index 0000000..bb07a90
--- /dev/null
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facetapi/FacetHolderImpl.java
@@ -0,0 +1,168 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ */
+
+package org.apache.isis.core.metamodel.facetapi;
+
+import java.util.HashMap;
+import java.util.Map;
+import java.util.stream.Stream;
+
+import org.apache.isis.core.commons.collections.Can;
+import org.apache.isis.core.commons.internal.base._Lazy;
+import org.apache.isis.core.commons.internal.collections._Maps;
+import org.apache.isis.core.commons.internal.collections._Maps.AliasMap;
+import org.apache.isis.core.metamodel.context.MetaModelContext;
+import org.apache.isis.core.metamodel.context.MetaModelContextAware;
+
+import static org.apache.isis.core.commons.internal.base._Casts.uncheckedCast;
+
+import lombok.Getter;
+import lombok.Setter;
+import lombok.val;
+
+/**
+ * For base subclasses or, more likely, to help write tests.
+ */
+public class FacetHolderImpl implements FacetHolder, MetaModelContextAware {
+
+    @Getter(onMethod = @__(@Override)) @Setter(onMethod = @__(@Override))
+    private MetaModelContext metaModelContext;
+    
+    private final Map<Class<? extends Facet>, Facet> facetsByType = _Maps.newHashMap();
+    private final Object $lock = new Object();
+    
+    @Override
+    public boolean containsFacet(Class<? extends Facet> facetType) {
+        synchronized($lock) {
+            return snapshot.get().containsKey(facetType);
+        }
+    }
+
+    @Override
+    public void addFacet(Facet facet) {
+        synchronized($lock) {
+            val changed = addFacetOrKeepExisting(facetsByType, facet);
+            if(changed) {
+                snapshot.clear(); //invalidate
+            }
+        }
+    }
+
+    @Override
+    public <T extends Facet> T getFacet(Class<T> facetType) {
+        synchronized($lock) {
+            return uncheckedCast(snapshot.get().get(facetType));
+        }
+    }
+
+    @Override
+    public Stream<Facet> streamFacets() {
+        synchronized($lock) {
+            return snapshot.get().values().stream(); // consumers should play nice and don't take too long  
+        }
+    }
+
+    @Override
+    public int getFacetCount() {
+        synchronized($lock) {
+            return snapshot.get().size();    
+        }
+    }
+    
+    @Override
+    public void addOrReplaceFacet(Facet facet) {
+        synchronized($lock) {
+            val facetType = facet.facetType();
+            val existingFacet = getFacet(facetType);
+            if (existingFacet != null) {
+                remove(existingFacet);
+                val underlyingFacet = existingFacet.getUnderlyingFacet();
+                facet.setUnderlyingFacet(underlyingFacet);
+            }
+            
+            addFacet(facet);
+        }
+    }
+
+    // -- HELPER
+    
+    private final _Lazy<Map<Class<? extends Facet>, Facet>> snapshot = _Lazy.threadSafe(this::snapshot);
+
+    // collect all facet information provided with the top-level facets (contributed facets and aliases)
+    private Map<Class<? extends Facet>, Facet> snapshot() {
+        val snapshot = _Maps.<Class<? extends Facet>, Facet>newAliasMap(HashMap::new);
+        facetsByType.values().forEach(topLevelFacet->{
+             
+            snapshot.remap(
+                    topLevelFacet.facetType(), 
+                    Can.ofNullable(topLevelFacet.facetAliasType()), 
+                    topLevelFacet);
+
+            // honor contributed facets via recursive lookup
+            collectChildren(snapshot, topLevelFacet);
+
+
+        });
+        return snapshot;
+    }
+
+    private void collectChildren(AliasMap<Class<? extends Facet>, Facet> target, Facet parentFacet) {
+        parentFacet.forEachContributedFacet(child->{
+            val added = addFacetOrKeepExisting(target, child);
+            if(added) {
+                collectChildren(target, child); 
+            }
+        });        
+    }
+
+    private boolean addFacetOrKeepExisting(
+            Map<Class<? extends Facet>, Facet> facetsByType,
+            Facet facet) {
+        
+        val existingFacet = facetsByType.get(facet.facetType());
+        
+        val addOrKeep = whichPrecedesTheOther(existingFacet, facet);
+        if(addOrKeep==facet) {
+            facetsByType.put(facet.facetType(), facet);
+            return true;
+        }
+        return false;
+    }
+    
+    private void remove(Facet topLevelFacet) {
+        snapshot.clear(); //invalidate
+        facetsByType.remove(topLevelFacet.facetType());
+    }
+    
+    // also has side-effects (not really suggested by the naming)
+    private Facet whichPrecedesTheOther(Facet existingFacet, Facet facet) {
+        if (existingFacet == null || existingFacet.isFallback()) {
+            return facet;
+        }
+        if (!facet.alwaysReplace()) {
+            return existingFacet; //eg. ValueSemanticsProviderAndFacetAbstract is alwaysReplace=false
+        }
+        if (facet.isDerived() && !existingFacet.isDerived()) {
+            return existingFacet;
+        }
+        facet.setUnderlyingFacet(existingFacet);
+        return facet;
+    }
+
+}
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facetapi/FacetUtil.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facetapi/FacetUtil.java
new file mode 100644
index 0000000..3a1bd13
--- /dev/null
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facetapi/FacetUtil.java
@@ -0,0 +1,96 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ */
+
+package org.apache.isis.core.metamodel.facetapi;
+
+import java.util.List;
+import java.util.function.BiConsumer;
+
+import org.apache.isis.core.metamodel.util.snapshot.XmlSchema;
+
+import lombok.AccessLevel;
+import lombok.NoArgsConstructor;
+import lombok.val;
+
+@NoArgsConstructor(access = AccessLevel.PRIVATE)
+public final class FacetUtil {
+
+
+    public static void addOrReplaceFacet(final Facet facet) {
+        if (facet == null) {
+            return;
+        }
+        val facetHolder = facet.getFacetHolder();
+        facetHolder.addOrReplaceFacet(facet);
+    }
+
+    /**
+     * Attaches the {@link Facet} to its {@link Facet#getFacetHolder() facet
+     * holder}.
+     *
+     * @return <tt>true</tt> if a non-<tt>null</tt> facet was added,
+     *         <tt>false</tt> otherwise.
+     */
+    public static boolean addFacet(final Facet facet) {
+        if (facet == null) {
+            return false;
+        }
+        facet.getFacetHolder().addFacet(facet);
+        return true;
+    }
+
+    /**
+     * Attaches each {@link Facet} to its {@link Facet#getFacetHolder() facet
+     * holder}.
+     *
+     * @return <tt>true</tt> if any facets were added, <tt>false</tt> otherwise.
+     */
+    public static boolean addFacets(final List<Facet> facetList) {
+        boolean addedFacets = false;
+        for (val facet : facetList) {
+            addedFacets = addFacet(facet) | addedFacets;
+        }
+        return addedFacets;
+    }
+
+    public static <T extends Facet> XmlSchema.ExtensionData<T> getFacetsByType(final FacetHolder facetHolder) {
+
+        return new XmlSchema.ExtensionData<T>() {
+
+            @Override
+            public int size() {
+                return facetHolder.getFacetCount();
+            }
+
+            @SuppressWarnings("unchecked")
+            @Override
+            public void visit(BiConsumer<Class<T>, T> elementConsumer) {
+                facetHolder.streamFacets()
+                .forEach(facet->elementConsumer.accept((Class<T>)facet.facetType(), (T)facet));
+            }
+
+        };
+    }
+
+    public static void copyFacets(final FacetHolder source, final FacetHolder target) {
+        source.streamFacets()
+        .forEach(target::addFacet);
+    }
+
+}
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facetapi/FacetWithAttributes.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facetapi/FacetWithAttributes.java
new file mode 100644
index 0000000..72d31a8
--- /dev/null
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facetapi/FacetWithAttributes.java
@@ -0,0 +1,32 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ */
+
+package org.apache.isis.core.metamodel.facetapi;
+
+import java.util.Map;
+
+import org.apache.isis.applib.services.metamodel.MetaModelService;
+
+/**
+ * For serialization of metamodel into XML, see {@link org.apache.isis.applib.services.metamodel.MetaModelService#exportMetaModel(MetaModelService.Config)}.
+ */
+public interface FacetWithAttributes {
+
+    void appendAttributesTo(Map<String,Object> attributeMap);
+}
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facetapi/FeatureType.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facetapi/FeatureType.java
new file mode 100644
index 0000000..742e222
--- /dev/null
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facetapi/FeatureType.java
@@ -0,0 +1,159 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ */
+
+package org.apache.isis.core.metamodel.facetapi;
+
+import java.beans.Introspector;
+import java.lang.reflect.Method;
+import java.util.EnumSet;
+
+import org.apache.isis.applib.Identifier;
+import org.apache.isis.core.metamodel.facets.FacetFactory;
+import org.apache.isis.core.metamodel.commons.StringExtensions;
+
+/**
+ * Enumerates the features that a particular Facet can be applied to.
+ *
+ * <p>
+ * The class-level feature processing is typically performed by {@link FacetFactory}s
+ * pertaining to {@link #OBJECT}, performed before the processing of class members.
+ *
+ */
+public enum FeatureType {
+
+    OBJECT("Object") {
+        /**
+         * The supplied method can be null; at any rate it will be ignored.
+         */
+        @Override
+        public Identifier identifierFor(final Class<?> type, final Method method) {
+            return Identifier.classIdentifier(type);
+        }
+    },
+    PROPERTY("Property") {
+        @Override
+        public Identifier identifierFor(final Class<?> type, final Method method) {
+            return propertyOrCollectionIdentifierFor(type, method);
+        }
+    },
+    COLLECTION("Collection") {
+        @Override
+        public Identifier identifierFor(final Class<?> type, final Method method) {
+            return propertyOrCollectionIdentifierFor(type, method);
+        }
+    },
+    ACTION("Action") {
+        @Override
+        public Identifier identifierFor(final Class<?> type, final Method method) {
+            final String fullMethodName = method.getName();
+            final Class<?>[] parameterTypes = method.getParameterTypes();
+            return Identifier.actionIdentifier(type.getName(), fullMethodName, parameterTypes);
+        }
+    },
+    ACTION_PARAMETER_SCALAR("Scalar Parameter") {
+        /**
+         * Always returns <tt>null</tt>.
+         */
+        @Override
+        public Identifier identifierFor(final Class<?> type, final Method method) {
+            return null;
+        }
+    },
+    ACTION_PARAMETER_COLLECTION("Collection Parameter") {
+        /**
+         * Always returns <tt>null</tt>.
+         */
+        @Override
+        public Identifier identifierFor(final Class<?> type, final Method method) {
+            return null;
+        }
+    };
+
+    public final static EnumSet<FeatureType> COLLECTIONS_ONLY = EnumSet.of(COLLECTION);
+    public final static EnumSet<FeatureType> COLLECTIONS_AND_ACTIONS = EnumSet.of(COLLECTION, ACTION);
+    public final static EnumSet<FeatureType> ACTIONS_ONLY = EnumSet.of(ACTION);
+    public final static EnumSet<FeatureType> PARAMETERS_ONLY = EnumSet.of(ACTION_PARAMETER_SCALAR, ACTION_PARAMETER_COLLECTION);
+    public final static EnumSet<FeatureType> PROPERTIES_ONLY = EnumSet.of(PROPERTY);
+    public final static EnumSet<FeatureType> PROPERTIES_AND_ACTIONS = EnumSet.of(PROPERTY, ACTION);
+    public final static EnumSet<FeatureType> OBJECTS_ONLY = EnumSet.of(OBJECT);
+    public final static EnumSet<FeatureType> MEMBERS = EnumSet.of(PROPERTY, COLLECTION, ACTION);
+    public final static EnumSet<FeatureType> OBJECTS_AND_PROPERTIES = EnumSet.of(OBJECT, PROPERTY);
+    public final static EnumSet<FeatureType> PROPERTIES_AND_COLLECTIONS = EnumSet.of(PROPERTY, COLLECTION);
+    public final static EnumSet<FeatureType> OBJECTS_AND_COLLECTIONS = EnumSet.of(OBJECT, COLLECTION);
+    public final static EnumSet<FeatureType> OBJECTS_AND_ACTIONS = EnumSet.of(OBJECT, ACTION);
+    public final static EnumSet<FeatureType> OBJECTS_PROPERTIES_AND_COLLECTIONS = EnumSet.of(OBJECT, PROPERTY, COLLECTION);
+    public static final EnumSet<FeatureType> ACTIONS_AND_PARAMETERS =
+            EnumSet.of(ACTION, ACTION_PARAMETER_SCALAR, ACTION_PARAMETER_COLLECTION);
+
+    /**
+     * Use of this is discouraged; instead use multiple {@link FacetFactory}s
+     * for different features.
+     */
+    public final static EnumSet<FeatureType> EVERYTHING_BUT_PARAMETERS = 
+            EnumSet.complementOf(
+                    EnumSet.of(ACTION_PARAMETER_SCALAR, ACTION_PARAMETER_COLLECTION));
+    /**
+     * Use of this is discouraged; instead use multiple {@link FacetFactory}s
+     * for different features.
+     */
+    public final static EnumSet<FeatureType> EVERYTHING = EnumSet.allOf(FeatureType.class); 
+
+    private final String name;
+
+    private FeatureType(final String name) {
+        this.name = name;
+    }
+
+    private static Identifier propertyOrCollectionIdentifierFor(final Class<?> type, final Method method) {
+        final String capitalizedName = StringExtensions.asJavaBaseName(method.getName());
+        final String beanName = Introspector.decapitalize(capitalizedName);
+        return Identifier.propertyOrCollectionIdentifier(type.getName(), beanName);
+    }
+
+    public boolean isProperty() {
+        return this == PROPERTY;
+    }
+
+    public boolean isCollection() {
+        return this == COLLECTION;
+    }
+
+    public boolean isAction() {
+        return this == ACTION;
+    }
+
+    public boolean isActionParameter() {
+        return this == ACTION_PARAMETER_SCALAR || this == ACTION_PARAMETER_COLLECTION;
+    }
+
+    /**
+     * Convenience.
+     */
+    public boolean isPropertyOrCollection() {
+        return isProperty() || isCollection();
+    }
+
+    public abstract Identifier identifierFor(Class<?> type, Method method);
+
+    @Override
+    public String toString() {
+        return name;
+    }
+
+}
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facetapi/IdentifiedHolder.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facetapi/IdentifiedHolder.java
new file mode 100644
index 0000000..a89b429
--- /dev/null
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facetapi/IdentifiedHolder.java
@@ -0,0 +1,31 @@
+/*
+ *  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
... 255674 lines suppressed ...