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

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


The following commit(s) were added to refs/heads/master by this push:
     new 6b8d3bc363 ISIS-3049: no longer have both the Member and its Peer 
maintain their own list of Facets
6b8d3bc363 is described below

commit 6b8d3bc3630e97b59eff55e62fc41b5a829deda1
Author: Andi Huber <ahu...@apache.org>
AuthorDate: Tue Jun 28 14:51:22 2022 +0200

    ISIS-3049: no longer have both the Member and
    its Peer maintain their own list of Facets
    
    - as these may run out of sync eg. with metamodel post-processing
    
    - also removes superfluous TypeOfFacetFromActionReturn
    
    - also its simpler to have translation contexts for mixins separately,
    so don't duplicate translation contexts for mixed-in members;
    
    - this commit potentially breaks mixed-in facets that originate from
    layout.xml files
---
 .../java/org/apache/isis/applib/Identifier.java    |   2 +-
 .../applib/exceptions/RecoverableException.java    |   2 +-
 .../applib/exceptions/UnrecoverableException.java  |   2 +-
 .../applib/services/i18n/TranslationContext.java   |  21 ++---
 .../services/i18n/TranslatableStringTest.java      |   6 +-
 .../isis/core/metamodel/facetapi/FacetHolder.java  |  12 ++-
 .../metamodel/facetapi/FacetHolderAbstract.java    |   4 +-
 .../metamodel/facetapi/FacetHolderDelegated.java   | 102 +++++++++++++++++++++
 .../metamodel/facetapi/FacetHolderLayered.java     | 101 --------------------
 .../typeof/TypeOfFacetFromActionReturn.java        |  30 ------
 .../invocation/ActionDomainEventFacetAbstract.java |   4 +-
 .../method/ActionValidationFacetViaMethod.java     |   3 +-
 ...erDescribedFacetWithImperativeTextAbstract.java |   3 +-
 ...MemberDescribedFacetWithStaticTextAbstract.java |   3 +-
 .../described/ObjectDescribedFacetAbstract.java    |   3 +-
 .../all/described/ParamDescribedFacetAbstract.java |   3 +-
 ...MemberNamedFacetWithImperativeTextAbstract.java |   3 +-
 .../MemberNamedFacetWithStaticTextAbstract.java    |   3 +-
 .../facets/all/named/ObjectNamedFacetAbstract.java |   3 +-
 .../facets/all/named/ParamNamedFacetAbstract.java  |   3 +-
 .../method/DisableForContextFacetViaMethod.java    |   3 +-
 ...ainObjectLayoutAnnotationUsingTitleUiEvent.java |   3 +-
 .../MustSatisfySpecificationFacetAbstract.java     |   4 +-
 .../ActionParameterChoicesFacetAbstract.java       |   4 +-
 ...ctionParameterChoicesFacetFromChoicesFacet.java |  25 +++--
 ...rameterChoicesFacetFromChoicesFacetFactory.java |  11 ++-
 .../ActionParameterDisabledFacetViaMethod.java     |   3 +-
 .../ActionParameterValidationFacetViaMethod.java   |   3 +-
 .../choices/PropertyChoicesFacetAbstract.java      |   6 +-
 .../PropertyChoicesFacetFromChoicesFacet.java      |  30 +++---
 ...ropertyChoicesFacetFromChoicesFacetFactory.java |  13 ++-
 .../modify/PropertyDomainEventFacetAbstract.java   |  10 +-
 .../method/PropertyValidateFacetViaMethod.java     |   3 +-
 .../param/ChoicesAndDefaultsPostProcessor.java     |  26 ++++--
 .../specloader/specimpl/ObjectActionMixedIn.java   |   2 +-
 .../specimpl/OneToManyAssociationMixedIn.java      |   6 +-
 .../specimpl/OneToOneAssociationMixedIn.java       |   2 +-
 .../memberorder/DeweyOrderComparatorTest.java      |   2 +-
 .../ordering/memberorder/DeweyOrderSetTest.java    |   2 +-
 .../core/runtimeservices/i18n/po/PoReaderTest.java |  14 +--
 .../domainmodel/MetaModelRegressionTest.java       |   3 +-
 .../ui/app/registry/ComponentFactoryRegistry.java  |   4 +-
 .../value/fallback/ValueFallbackPanelFactory.java  |   7 +-
 .../ValueChoicesSelect2PanelFactory.java           |   2 +-
 44 files changed, 241 insertions(+), 260 deletions(-)

diff --git a/api/applib/src/main/java/org/apache/isis/applib/Identifier.java 
b/api/applib/src/main/java/org/apache/isis/applib/Identifier.java
index dea20e8406..da49b4afaf 100644
--- a/api/applib/src/main/java/org/apache/isis/applib/Identifier.java
+++ b/api/applib/src/main/java/org/apache/isis/applib/Identifier.java
@@ -192,7 +192,7 @@ implements
                         ? "(" + 
memberParameterClassNames.stream().collect(Collectors.joining(",")) + ")"
                         : "");
 
-        this.translationContext = TranslationContext.ofName(
+        this.translationContext = TranslationContext.named(
                 className + "#" + memberLogicalName + (type.isAction() ? "()" 
: ""));
 
         this.fullIdentityString = _Strings.isEmpty(memberLogicalName)
diff --git 
a/api/applib/src/main/java/org/apache/isis/applib/exceptions/RecoverableException.java
 
b/api/applib/src/main/java/org/apache/isis/applib/exceptions/RecoverableException.java
index 13ef109a4c..5b00cc1b47 100644
--- 
a/api/applib/src/main/java/org/apache/isis/applib/exceptions/RecoverableException.java
+++ 
b/api/applib/src/main/java/org/apache/isis/applib/exceptions/RecoverableException.java
@@ -89,7 +89,7 @@ implements TranslatableException {
         super(message, cause);
         this.translatableMessage = translatableMessage;
         this.translationContext = translationContextClass != null
-                ? TranslationContext.ofName(
+                ? TranslationContext.named(
                         translationContextClass.getName() 
                         + (_Strings.isNotEmpty(translationContextMethod)
                                 ? "#" + translationContextMethod
diff --git 
a/api/applib/src/main/java/org/apache/isis/applib/exceptions/UnrecoverableException.java
 
b/api/applib/src/main/java/org/apache/isis/applib/exceptions/UnrecoverableException.java
index d206fbc0e2..d7d321c0da 100644
--- 
a/api/applib/src/main/java/org/apache/isis/applib/exceptions/UnrecoverableException.java
+++ 
b/api/applib/src/main/java/org/apache/isis/applib/exceptions/UnrecoverableException.java
@@ -82,7 +82,7 @@ implements TranslatableException {
         super(message, cause);
         this.translatableMessage = translatableMessage;
         this.translationContext = translationContextClass != null
-                ? TranslationContext.ofName(
+                ? TranslationContext.named(
                         translationContextClass.getName() 
                         + (_Strings.isNotEmpty(translationContextMethod)
                                 ? "#" + translationContextMethod
diff --git 
a/api/applib/src/main/java/org/apache/isis/applib/services/i18n/TranslationContext.java
 
b/api/applib/src/main/java/org/apache/isis/applib/services/i18n/TranslationContext.java
index 1e85ec7606..a45074045b 100644
--- 
a/api/applib/src/main/java/org/apache/isis/applib/services/i18n/TranslationContext.java
+++ 
b/api/applib/src/main/java/org/apache/isis/applib/services/i18n/TranslationContext.java
@@ -32,7 +32,7 @@ import lombok.val;
 /**
  * @since 2.x {@index}
  */
-@Value(staticConstructor = "ofName")
+@Value(staticConstructor = "named")
 public final class TranslationContext
 implements Serializable {
 
@@ -40,21 +40,12 @@ implements Serializable {
 
     @Getter private final String name;
 
-    //XXX this guard could be removed if non-null is guaranteed
-    public static TranslationContext forTranslationContextHolder(
-            final @Nullable HasTranslationContext hasTranslationContext) {
-
-        return hasTranslationContext!=null
-                ? hasTranslationContext.getTranslationContext()
-                : EMPTY;
-    }
-
     //XXX no logical type name supported
     public static TranslationContext forClassName(
             final @Nullable Class<?> contextClass) {
 
         return contextClass!=null
-                ? ofName(contextClass.getName())
+                ? named(contextClass.getName())
                 : EMPTY;
     }
 
@@ -66,7 +57,7 @@ implements Serializable {
         val classContext = forClassName(contextClass);
         return _Strings.isNullOrEmpty(contextMethodName)
                 ? classContext
-                : ofName(classContext.getName() + "#" + contextMethodName + 
"()");
+                : named(classContext.getName() + "#" + contextMethodName + 
"()");
     }
 
     //XXX no logical type name supported
@@ -74,7 +65,7 @@ implements Serializable {
             final @Nullable Method method) {
 
         return method!=null
-                ? ofName(method.getDeclaringClass().getName() + "#" + 
method.getName() + "()")
+                ? named(method.getDeclaringClass().getName() + "#" + 
method.getName() + "()")
                 : EMPTY;
     }
 
@@ -83,13 +74,13 @@ implements Serializable {
             final @Nullable Enum<?> objectAsEnum) {
 
         return objectAsEnum!=null
-                ? ofName(objectAsEnum.getClass().getName() + "#" + 
objectAsEnum.name())
+                ? named(objectAsEnum.getClass().getName() + "#" + 
objectAsEnum.name())
                 : EMPTY;
     }
 
        // -- EMPTY
 
-       private final static TranslationContext EMPTY = 
TranslationContext.ofName("default");
+       private final static TranslationContext EMPTY = 
TranslationContext.named("default");
 
     public static TranslationContext empty() {
         return EMPTY;
diff --git 
a/api/applib/src/test/java/org/apache/isis/applib/services/i18n/TranslatableStringTest.java
 
b/api/applib/src/test/java/org/apache/isis/applib/services/i18n/TranslatableStringTest.java
index 09100ee341..30455602f6 100644
--- 
a/api/applib/src/test/java/org/apache/isis/applib/services/i18n/TranslatableStringTest.java
+++ 
b/api/applib/src/test/java/org/apache/isis/applib/services/i18n/TranslatableStringTest.java
@@ -88,7 +88,7 @@ public class TranslatableStringTest {
         public void singularForm() throws Exception {
             // given
             final String simpleText = "text to translate";
-            final TranslationContext someContext = 
TranslationContext.ofName("someContext");
+            final TranslationContext someContext = 
TranslationContext.named("someContext");
             final String translation = "the translation";
 
             final TranslatableString ts = TranslatableString.tr(simpleText);
@@ -109,7 +109,7 @@ public class TranslatableStringTest {
             // given
             final String singularText = "singular text to translate";
             final String pluralText = "plural text to translate";
-            final TranslationContext someContext = 
TranslationContext.ofName("someContext");
+            final TranslationContext someContext = 
TranslationContext.named("someContext");
             final String translation = "the translation";
 
             final TranslatableString ts = TranslatableString.trn(singularText, 
pluralText, 1);
@@ -130,7 +130,7 @@ public class TranslatableStringTest {
             // given
             final String singularText = "singular text to translate";
             final String pluralText = "plural text to translate";
-            final TranslationContext someContext = 
TranslationContext.ofName("someContext");
+            final TranslationContext someContext = 
TranslationContext.named("someContext");
             final String translation = "the translation";
             final int number = 2; // != 1
 
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
index fdf625b0ef..140045789c 100644
--- 
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
@@ -23,6 +23,8 @@ import java.util.function.Predicate;
 import java.util.stream.Stream;
 
 import org.apache.isis.applib.Identifier;
+import org.apache.isis.applib.services.i18n.HasTranslationContext;
+import org.apache.isis.applib.services.i18n.TranslationContext;
 import org.apache.isis.core.metamodel.context.HasMetaModelContext;
 
 import lombok.NonNull;
@@ -32,7 +34,8 @@ import lombok.val;
  * Anything in the metamodel (which also includes peers in the reflector) that
  * can be extended.
  */
-public interface FacetHolder extends HasMetaModelContext {
+public interface FacetHolder
+extends HasMetaModelContext, HasTranslationContext {
 
     /**
      * Identifier of the feature this holder represents or is associated with.
@@ -119,4 +122,11 @@ public interface FacetHolder extends HasMetaModelContext {
     Stream<FacetRanking> streamFacetRankings();
     Optional<FacetRanking> getFacetRanking(Class<? extends Facet> facetType);
 
+    // -- TRANSLATION CONTEXT
+
+    @Override
+    default TranslationContext getTranslationContext() {
+        return getFeatureIdentifier().getTranslationContext();
+    }
+
 }
diff --git 
a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facetapi/FacetHolderAbstract.java
 
b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facetapi/FacetHolderAbstract.java
index 2307c37b65..da26748440 100644
--- 
a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facetapi/FacetHolderAbstract.java
+++ 
b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facetapi/FacetHolderAbstract.java
@@ -53,10 +53,10 @@ implements FacetHolder {
         return new FacetHolderAbstract(mmc, featureIdentifier) {};
     }
 
-    public static FacetHolderAbstract layered(
+    public static FacetHolder delegated(
             final Identifier featureIdentifier,
             final FacetHolder parentLayer) {
-        return new FacetHolderLayered(featureIdentifier, parentLayer);
+        return new FacetHolderDelegated(featureIdentifier, parentLayer);
     }
 
     // -- FIELDS
diff --git 
a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facetapi/FacetHolderDelegated.java
 
b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facetapi/FacetHolderDelegated.java
new file mode 100644
index 0000000000..0c8ce03a58
--- /dev/null
+++ 
b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facetapi/FacetHolderDelegated.java
@@ -0,0 +1,102 @@
+/*
+ *  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.Optional;
+import java.util.stream.Stream;
+
+import org.apache.isis.applib.Identifier;
+import org.apache.isis.applib.services.i18n.TranslationContext;
+import org.apache.isis.core.metamodel.context.MetaModelContext;
+import org.apache.isis.core.metamodel.facets.FacetedMethod;
+
+import lombok.Getter;
+import lombok.NonNull;
+
+/**
+ * Acts as a facade to the underlying delegate, but provides its own 
<i>Member</i>-{@link Identifier}.
+ * <p>
+ * Any mixed in <i>Member</i> has a {@link FacetedMethod} that acts as the 
{@link FacetHolder},
+ * which is shared among all types that this particular mixed in <i>Member</i> 
is contributed to.
+ * @apiNote
+ *      was introduced in response to a couple of bugs originating from having 
both the <i>Member</i> and
+ *      its <i>Peer</i> maintaining their own list of {@link Facet}(s), that 
may run out of sync
+ *      eg. with metamodel post-processing;
+ */
+class FacetHolderDelegated
+implements FacetHolder {
+
+    @Getter(onMethod_ = {@Override})
+    private final @NonNull Identifier featureIdentifier;
+    private final @NonNull FacetHolder delegate;
+
+    public FacetHolderDelegated(
+            final @NonNull Identifier featureIdentifier,
+            final @NonNull FacetHolder delegate) {
+        this.featureIdentifier = featureIdentifier;
+        this.delegate = delegate;
+    }
+
+    @Override
+    public TranslationContext getTranslationContext() {
+        return delegate.getTranslationContext();
+    }
+
+    @Override
+    public void addFacet(@NonNull final Facet facet) {
+        //FIXME[ISIS-3049] if a Facet originates from layout.xml 
introspection, don't install it on the delegate
+        delegate.addFacet(facet);
+    }
+
+    @Override
+    public MetaModelContext getMetaModelContext() {
+        return delegate.getMetaModelContext();
+    }
+
+    @Override
+    public int getFacetCount() {
+        return delegate.getFacetCount();
+    }
+
+    @Override
+    public <T extends Facet> T getFacet(final Class<T> facetType) {
+        return delegate.getFacet(facetType);
+    }
+
+    @Override
+    public boolean containsFacet(final Class<? extends Facet> facetType) {
+        return delegate.containsFacet(facetType);
+    }
+
+    @Override
+    public Stream<Facet> streamFacets() {
+        return delegate.streamFacets();
+    }
+
+    @Override
+    public Stream<FacetRanking> streamFacetRankings() {
+        return delegate.streamFacetRankings();
+    }
+
+    @Override
+    public Optional<FacetRanking> getFacetRanking(final Class<? extends Facet> 
facetType) {
+        return delegate.getFacetRanking(facetType);
+    }
+
+}
diff --git 
a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facetapi/FacetHolderLayered.java
 
b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facetapi/FacetHolderLayered.java
deleted file mode 100644
index 717610504d..0000000000
--- 
a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facetapi/FacetHolderLayered.java
+++ /dev/null
@@ -1,101 +0,0 @@
-/*
- *  Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you under the Apache License, Version 2.0 (the
- *  "License"); you may not use this file except in compliance
- *  with the License.  You may obtain a copy of the License at
- *
- *        http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing,
- *  software distributed under the License is distributed on an
- *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- *  KIND, either express or implied.  See the License for the
- *  specific language governing permissions and limitations
- *  under the License.
- */
-package org.apache.isis.core.metamodel.facetapi;
-
-import org.apache.isis.applib.Identifier;
-
-import lombok.NonNull;
-
-/**
- * Supposed to provide a merged view of the local and the parent-layer,
- * where the parent is used as read-only fallback.
- *
- * @apiNote It is still not clear to me why we do need this at all,
- * why not just simply delegate/wrap?
- */
-class FacetHolderLayered
-extends FacetHolderAbstract {
-
-    private final @NonNull FacetHolder parentLayer;
-
-    public FacetHolderLayered(
-            final @NonNull Identifier featureIdentifier,
-            final @NonNull FacetHolder parentLayer) {
-        super(parentLayer.getMetaModelContext(), featureIdentifier);
-        this.parentLayer = parentLayer;
-
-        // legacy implementation, it will miss any changes that happen to the 
parent-layer after copying
-        copyFacetsTo(parentLayer, this);
-    }
-
-   /* XXX first attempt on an implementation, but does not handle facet 
precedence correctly
-    @Override
-    public int getFacetCount() {
-        // cannot simply add up this and parent
-        return (int)streamFacets().count();
-    }
-
-    @Override
-    public <T extends Facet> T getFacet(final Class<T> facetType) {
-        return Optional.ofNullable(super.getFacet(facetType))
-                .orElse(parentLayer.getFacet(facetType));
-    }
-
-    @Override
-    public boolean containsFacet(final Class<? extends Facet> facetType) {
-        return super.containsFacet(facetType)
-                || parentLayer.containsFacet(facetType);
-    }
-
-    @Override
-    public Stream<Facet> streamFacets() {
-        val localFacetTypes = new HashSet<Class<? extends Facet>>();
-        return Stream.concat(
-                super.streamFacets()
-                .peek(facet->localFacetTypes.add(facet.facetType()))
-                ,
-                parentLayer.streamFacets()
-                .filter(facet->!localFacetTypes.contains(facet.facetType())));
-    }
-
-    @Override
-    public Stream<FacetRanking> streamFacetRankings() {
-        val localFacetTypes = new HashSet<Class<? extends Facet>>();
-        return Stream.concat(
-                super.streamFacetRankings()
-                .peek(ranking->localFacetTypes.add(ranking.facetType()))
-                ,
-                parentLayer.streamFacetRankings()
-                
.filter(ranking->!localFacetTypes.contains(ranking.facetType())));
-    }
-
-    @Override
-    public Optional<FacetRanking> getFacetRanking(final Class<? extends Facet> 
facetType) {
-        return Optional.ofNullable(super.getFacetRanking(facetType))
-                .orElse(parentLayer.getFacetRanking(facetType));
-    }*/
-
-    // -- HELPER
-
-    private static void copyFacetsTo(final FacetHolder source, final 
FacetHolder target) {
-        source.streamFacets()
-        .forEach(target::addFacet);
-    }
-
-}
diff --git 
a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actcoll/typeof/TypeOfFacetFromActionReturn.java
 
b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actcoll/typeof/TypeOfFacetFromActionReturn.java
deleted file mode 100644
index 7b414cbb51..0000000000
--- 
a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actcoll/typeof/TypeOfFacetFromActionReturn.java
+++ /dev/null
@@ -1,30 +0,0 @@
-/*
- *  Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you under the Apache License, Version 2.0 (the
- *  "License"); you may not use this file except in compliance
- *  with the License.  You may obtain a copy of the License at
- *
- *        http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing,
- *  software distributed under the License is distributed on an
- *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- *  KIND, either express or implied.  See the License for the
- *  specific language governing permissions and limitations
- *  under the License.
- */
-package org.apache.isis.core.metamodel.facets.actcoll.typeof;
-
-import org.apache.isis.core.metamodel.facetapi.FacetHolder;
-
-public class TypeOfFacetFromActionReturn
-extends TypeOfFacetAbstract {
-
-    public TypeOfFacetFromActionReturn(final Class<?> type, final FacetHolder 
holder) {
-        super(type, holder);
-    }
-
-}
diff --git 
a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/action/invocation/ActionDomainEventFacetAbstract.java
 
b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/action/invocation/ActionDomainEventFacetAbstract.java
index 93983c0430..9f5ae1912d 100644
--- 
a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/action/invocation/ActionDomainEventFacetAbstract.java
+++ 
b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/action/invocation/ActionDomainEventFacetAbstract.java
@@ -56,9 +56,7 @@ implements ActionDomainEventFacet {
         setEventType(eventType);
 
         this.translationService = getTranslationService();
-        // sadness: same as in TranslationFactory
-        this.translationContext = 
TranslationContext.forTranslationContextHolder(
-                holder.getFeatureIdentifier());
+        this.translationContext = holder.getTranslationContext();
 
         domainEventHelper = 
DomainEventHelper.ofServiceRegistry(getServiceRegistry());
     }
diff --git 
a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/validate/method/ActionValidationFacetViaMethod.java
 
b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/validate/method/ActionValidationFacetViaMethod.java
index ad6e7d46b6..dd1f2f1e8d 100644
--- 
a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/validate/method/ActionValidationFacetViaMethod.java
+++ 
b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/validate/method/ActionValidationFacetViaMethod.java
@@ -51,8 +51,7 @@ implements ImperativeFacet {
 
         super(holder);
         this.methods = ImperativeFacet.singleMethod(method);
-        this.translationContext =
-                
TranslationContext.forTranslationContextHolder(holder.getFeatureIdentifier());
+        this.translationContext = holder.getTranslationContext();
         this.patConstructor = patConstructor;
     }
 
diff --git 
a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/all/described/MemberDescribedFacetWithImperativeTextAbstract.java
 
b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/all/described/MemberDescribedFacetWithImperativeTextAbstract.java
index 926a9efc07..0452e94a39 100644
--- 
a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/all/described/MemberDescribedFacetWithImperativeTextAbstract.java
+++ 
b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/all/described/MemberDescribedFacetWithImperativeTextAbstract.java
@@ -20,7 +20,6 @@ package org.apache.isis.core.metamodel.facets.all.described;
 
 import java.lang.reflect.Method;
 
-import org.apache.isis.applib.services.i18n.TranslationContext;
 import org.apache.isis.commons.functional.Either;
 import org.apache.isis.core.metamodel.facetapi.Facet;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
@@ -51,7 +50,7 @@ implements MemberDescribedFacet {
             final Method method,
             final FacetHolder holder) {
         super(type(),
-                
TranslationContext.forTranslationContextHolder(holder.getFeatureIdentifier()),
+                holder.getTranslationContext(),
                 method,
                 holder);
     }
diff --git 
a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/all/described/MemberDescribedFacetWithStaticTextAbstract.java
 
b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/all/described/MemberDescribedFacetWithStaticTextAbstract.java
index 656b50474f..4431eb32a2 100644
--- 
a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/all/described/MemberDescribedFacetWithStaticTextAbstract.java
+++ 
b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/all/described/MemberDescribedFacetWithStaticTextAbstract.java
@@ -18,7 +18,6 @@
  */
 package org.apache.isis.core.metamodel.facets.all.described;
 
-import org.apache.isis.applib.services.i18n.TranslationContext;
 import org.apache.isis.commons.functional.Either;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
 import 
org.apache.isis.core.metamodel.facets.all.i8n.imperative.HasImperativeText;
@@ -58,7 +57,7 @@ implements MemberDescribedFacet {
             final FacetHolder holder,
             final Precedence precedence) {
         super(type(),
-                
TranslationContext.forTranslationContextHolder(holder.getFeatureIdentifier()),
+                holder.getTranslationContext(),
                 originalText,
                 holder,
                 precedence);
diff --git 
a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/all/described/ObjectDescribedFacetAbstract.java
 
b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/all/described/ObjectDescribedFacetAbstract.java
index a0c23c7272..14e4f1a0f6 100644
--- 
a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/all/described/ObjectDescribedFacetAbstract.java
+++ 
b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/all/described/ObjectDescribedFacetAbstract.java
@@ -18,7 +18,6 @@
  */
 package org.apache.isis.core.metamodel.facets.all.described;
 
-import org.apache.isis.applib.services.i18n.TranslationContext;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
 import 
org.apache.isis.core.metamodel.facets.all.i8n.staatic.HasStaticTextFacetAbstract;
 
@@ -38,7 +37,7 @@ implements ObjectDescribedFacet {
             final String originalText,
             final FacetHolder holder) {
         super(type(),
-                
TranslationContext.forTranslationContextHolder(holder.getFeatureIdentifier()),
+                holder.getTranslationContext(),
                 originalText,
                 holder);
     }
diff --git 
a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/all/described/ParamDescribedFacetAbstract.java
 
b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/all/described/ParamDescribedFacetAbstract.java
index f3e737c759..496c42dead 100644
--- 
a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/all/described/ParamDescribedFacetAbstract.java
+++ 
b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/all/described/ParamDescribedFacetAbstract.java
@@ -18,7 +18,6 @@
  */
 package org.apache.isis.core.metamodel.facets.all.described;
 
-import org.apache.isis.applib.services.i18n.TranslationContext;
 import org.apache.isis.core.metamodel.facetapi.Facet;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
 import 
org.apache.isis.core.metamodel.facets.all.i8n.staatic.HasStaticTextFacetAbstract;
@@ -49,7 +48,7 @@ implements ParamDescribedFacet {
             final FacetHolder holder,
             final Precedence precedence) {
         super(type(),
-                
TranslationContext.forTranslationContextHolder(holder.getFeatureIdentifier()),
+                holder.getTranslationContext(),
                 originalText,
                 holder,
                 precedence);
diff --git 
a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/all/named/MemberNamedFacetWithImperativeTextAbstract.java
 
b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/all/named/MemberNamedFacetWithImperativeTextAbstract.java
index f248ea4594..b7c126b24c 100644
--- 
a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/all/named/MemberNamedFacetWithImperativeTextAbstract.java
+++ 
b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/all/named/MemberNamedFacetWithImperativeTextAbstract.java
@@ -20,7 +20,6 @@ package org.apache.isis.core.metamodel.facets.all.named;
 
 import java.lang.reflect.Method;
 
-import org.apache.isis.applib.services.i18n.TranslationContext;
 import org.apache.isis.commons.functional.Either;
 import org.apache.isis.core.metamodel.facetapi.Facet;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
@@ -51,7 +50,7 @@ implements MemberNamedFacet {
             final Method method,
             final FacetHolder holder) {
         super(type(),
-                
TranslationContext.forTranslationContextHolder(holder.getFeatureIdentifier()),
+                holder.getTranslationContext(),
                 method,
                 holder);
     }
diff --git 
a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/all/named/MemberNamedFacetWithStaticTextAbstract.java
 
b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/all/named/MemberNamedFacetWithStaticTextAbstract.java
index f844f2dec4..0e13219ad0 100644
--- 
a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/all/named/MemberNamedFacetWithStaticTextAbstract.java
+++ 
b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/all/named/MemberNamedFacetWithStaticTextAbstract.java
@@ -18,7 +18,6 @@
  */
 package org.apache.isis.core.metamodel.facets.all.named;
 
-import org.apache.isis.applib.services.i18n.TranslationContext;
 import org.apache.isis.commons.functional.Either;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
 import 
org.apache.isis.core.metamodel.facets.all.i8n.imperative.HasImperativeText;
@@ -58,7 +57,7 @@ implements MemberNamedFacet {
             final FacetHolder holder,
             final Precedence precedence) {
         super(type(),
-                
TranslationContext.forTranslationContextHolder(holder.getFeatureIdentifier()),
+                holder.getTranslationContext(),
                 originalText,
                 holder,
                 precedence);
diff --git 
a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/all/named/ObjectNamedFacetAbstract.java
 
b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/all/named/ObjectNamedFacetAbstract.java
index 3cda3b7f64..5d6a21aa64 100644
--- 
a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/all/named/ObjectNamedFacetAbstract.java
+++ 
b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/all/named/ObjectNamedFacetAbstract.java
@@ -18,7 +18,6 @@
  */
 package org.apache.isis.core.metamodel.facets.all.named;
 
-import org.apache.isis.applib.services.i18n.TranslationContext;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
 import org.apache.isis.core.metamodel.facets.all.i8n.noun.HasNounFacetAbstract;
 import org.apache.isis.core.metamodel.facets.all.i8n.noun.NounForms;
@@ -49,7 +48,7 @@ implements ObjectNamedFacet {
             final FacetHolder holder,
             final Precedence precedence) {
         super(type(),
-                
TranslationContext.forTranslationContextHolder(holder.getFeatureIdentifier()),
+                holder.getTranslationContext(),
                 nounForms,
                 holder,
                 precedence);
diff --git 
a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/all/named/ParamNamedFacetAbstract.java
 
b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/all/named/ParamNamedFacetAbstract.java
index 05956ede76..dd9fe247c5 100644
--- 
a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/all/named/ParamNamedFacetAbstract.java
+++ 
b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/all/named/ParamNamedFacetAbstract.java
@@ -18,7 +18,6 @@
  */
 package org.apache.isis.core.metamodel.facets.all.named;
 
-import org.apache.isis.applib.services.i18n.TranslationContext;
 import org.apache.isis.core.metamodel.facetapi.Facet;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
 import 
org.apache.isis.core.metamodel.facets.all.i8n.staatic.HasStaticTextFacetAbstract;
@@ -46,7 +45,7 @@ implements ParamNamedFacet {
             final FacetHolder holder,
             final Precedence precedence) {
         super(type(),
-                
TranslationContext.forTranslationContextHolder(holder.getFeatureIdentifier()),
+                holder.getTranslationContext(),
                 originalText,
                 holder,
                 precedence);
diff --git 
a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/members/disabled/method/DisableForContextFacetViaMethod.java
 
b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/members/disabled/method/DisableForContextFacetViaMethod.java
index 47b24ee71c..885b72d9ea 100644
--- 
a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/members/disabled/method/DisableForContextFacetViaMethod.java
+++ 
b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/members/disabled/method/DisableForContextFacetViaMethod.java
@@ -46,8 +46,7 @@ implements ImperativeFacet {
             final FacetHolder holder) {
         super(holder);
         this.methods = ImperativeFacet.singleMethod(method);
-        this.translationContext =
-                
TranslationContext.forTranslationContextHolder(holder.getFeatureIdentifier());
+        this.translationContext = holder.getTranslationContext();
     }
 
     @Override
diff --git 
a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainobjectlayout/TitleFacetViaDomainObjectLayoutAnnotationUsingTitleUiEvent.java
 
b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainobjectlayout/TitleFacetViaDomainObjectLayoutAnnotationUsingTitleUiEvent.java
index daa961b528..a29fcc7a22 100644
--- 
a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainobjectlayout/TitleFacetViaDomainObjectLayoutAnnotationUsingTitleUiEvent.java
+++ 
b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainobjectlayout/TitleFacetViaDomainObjectLayoutAnnotationUsingTitleUiEvent.java
@@ -133,8 +133,7 @@ extends TitleFacetAbstract {
 
     private static TranslationContext translationContextFor(final FacetHolder 
facetHolder) {
         if(facetHolder instanceof ObjectSpecification) {
-            val facetHolderAsSpec = (ObjectSpecification) facetHolder;
-            return 
TranslationContext.forTranslationContextHolder(facetHolderAsSpec.getFeatureIdentifier());
+            return facetHolder.getTranslationContext();
         }
         return null;
     }
diff --git 
a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/objectvalue/mustsatisfyspec/MustSatisfySpecificationFacetAbstract.java
 
b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/objectvalue/mustsatisfyspec/MustSatisfySpecificationFacetAbstract.java
index ff0345b870..64ec686802 100644
--- 
a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/objectvalue/mustsatisfyspec/MustSatisfySpecificationFacetAbstract.java
+++ 
b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/objectvalue/mustsatisfyspec/MustSatisfySpecificationFacetAbstract.java
@@ -59,9 +59,7 @@ implements MustSatisfySpecificationFacet {
         this.specifications = specifications;
 
         final TranslationService translationService = getTranslationService();
-        // sadness: same as in TranslationFactory
-        final TranslationContext translationContext = 
TranslationContext.forTranslationContextHolder(
-                holder.getFeatureIdentifier()); // .getTranslationContext();
+        final TranslationContext translationContext = 
holder.getTranslationContext();
 
         specificationEvaluator = new 
SpecificationEvaluator(translationService, translationContext);
     }
diff --git 
a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/param/choices/ActionParameterChoicesFacetAbstract.java
 
b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/param/choices/ActionParameterChoicesFacetAbstract.java
index 50b683aa3f..4aa1a1e5fa 100644
--- 
a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/param/choices/ActionParameterChoicesFacetAbstract.java
+++ 
b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/param/choices/ActionParameterChoicesFacetAbstract.java
@@ -30,11 +30,11 @@ implements ActionParameterChoicesFacet {
         return ActionParameterChoicesFacet.class;
     }
 
-    public ActionParameterChoicesFacetAbstract(FacetHolder holder) {
+    protected ActionParameterChoicesFacetAbstract(final FacetHolder holder) {
         super(type(), holder);
     }
 
-    public ActionParameterChoicesFacetAbstract(final FacetHolder holder, final 
Facet.Precedence precedence) {
+    protected ActionParameterChoicesFacetAbstract(final FacetHolder holder, 
final Facet.Precedence precedence) {
         super(type(), holder, precedence);
     }
 
diff --git 
a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/param/choices/enums/ActionParameterChoicesFacetFromChoicesFacet.java
 
b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/param/choices/enums/ActionParameterChoicesFacetFromChoicesFacet.java
index f8c4b426b7..3a1eda9194 100644
--- 
a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/param/choices/enums/ActionParameterChoicesFacetFromChoicesFacet.java
+++ 
b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/param/choices/enums/ActionParameterChoicesFacetFromChoicesFacet.java
@@ -18,10 +18,11 @@
  */
 package org.apache.isis.core.metamodel.facets.param.choices.enums;
 
+import java.util.Optional;
+
 import org.apache.isis.commons.collections.Can;
 import org.apache.isis.core.metamodel.consent.InteractionInitiatedBy;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
-import org.apache.isis.core.metamodel.facets.TypedHolder;
 import org.apache.isis.core.metamodel.facets.objectvalue.choices.ChoicesFacet;
 import 
org.apache.isis.core.metamodel.facets.param.choices.ActionParameterChoicesFacetAbstract;
 import 
org.apache.isis.core.metamodel.interactions.managed.ActionInteractionHead;
@@ -31,8 +32,20 @@ import 
org.apache.isis.core.metamodel.spec.ObjectSpecification;
 public class ActionParameterChoicesFacetFromChoicesFacet
 extends ActionParameterChoicesFacetAbstract {
 
-    public ActionParameterChoicesFacetFromChoicesFacet(final FacetHolder 
holder) {
+    public static Optional<ActionParameterChoicesFacetAbstract> create(
+            final Optional<ChoicesFacet> choicesFacet,
+            final FacetHolder facetHolder) {
+        return choicesFacet
+        .map(choicesFct->new 
ActionParameterChoicesFacetFromChoicesFacet(choicesFct, facetHolder));
+    }
+
+    private final ChoicesFacet choicesFacet;
+
+    private ActionParameterChoicesFacetFromChoicesFacet(
+            final ChoicesFacet choicesFacet,
+            final FacetHolder holder) {
         super(holder, Precedence.INFERRED);
+        this.choicesFacet = choicesFacet;
     }
 
     @Override
@@ -41,14 +54,6 @@ extends ActionParameterChoicesFacetAbstract {
             final ActionInteractionHead head,
             final Can<ManagedObject> pendingArgs,
             final InteractionInitiatedBy interactionInitiatedBy) {
-
-        final FacetHolder facetHolder = getFacetHolder();
-        final TypedHolder paramPeer = (TypedHolder) facetHolder;
-        final ObjectSpecification noSpec = 
specForTypeElseFail(paramPeer.getType());
-        final ChoicesFacet choicesFacet = noSpec.getFacet(ChoicesFacet.class);
-        if (choicesFacet == null) {
-            return Can.empty();
-        }
         return choicesFacet.getChoices(head.getTarget(), 
interactionInitiatedBy);
     }
 
diff --git 
a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/param/choices/enums/ActionParameterChoicesFacetFromChoicesFacetFactory.java
 
b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/param/choices/enums/ActionParameterChoicesFacetFromChoicesFacetFactory.java
index 267a857ee2..cf45962c0e 100644
--- 
a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/param/choices/enums/ActionParameterChoicesFacetFromChoicesFacetFactory.java
+++ 
b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/param/choices/enums/ActionParameterChoicesFacetFromChoicesFacetFactory.java
@@ -21,6 +21,7 @@ package 
org.apache.isis.core.metamodel.facets.param.choices.enums;
 import javax.inject.Inject;
 
 import org.apache.isis.core.metamodel.context.MetaModelContext;
+import org.apache.isis.core.metamodel.facetapi.FacetUtil;
 import org.apache.isis.core.metamodel.facetapi.FeatureType;
 import org.apache.isis.core.metamodel.facets.FacetFactoryAbstract;
 import org.apache.isis.core.metamodel.facets.objectvalue.choices.ChoicesFacet;
@@ -40,12 +41,12 @@ extends FacetFactoryAbstract {
 
         val paramType = processParameterContext.getParameterType();
 
-        
if(!getSpecificationLoader().loadSpecification(paramType).containsNonFallbackFacet(ChoicesFacet.class))
 {
-            return;
-        }
+        val choicesFacetIfAny = 
getSpecificationLoader().loadSpecification(paramType)
+                .lookupNonFallbackFacet(ChoicesFacet.class);
 
-        val facetHolder = processParameterContext.getFacetHolder();
-        addFacet(new ActionParameterChoicesFacetFromChoicesFacet(facetHolder));
+        FacetUtil.addFacetIfPresent(
+                ActionParameterChoicesFacetFromChoicesFacet
+                .create(choicesFacetIfAny, 
processParameterContext.getFacetHolder()));
     }
 
 
diff --git 
a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/param/disable/method/ActionParameterDisabledFacetViaMethod.java
 
b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/param/disable/method/ActionParameterDisabledFacetViaMethod.java
index 5967825ed8..ff98c131b9 100644
--- 
a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/param/disable/method/ActionParameterDisabledFacetViaMethod.java
+++ 
b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/param/disable/method/ActionParameterDisabledFacetViaMethod.java
@@ -51,8 +51,7 @@ implements ImperativeFacet {
 
         super(holder);
         this.methods = ImperativeFacet.singleMethod(method);
-        this.translationContext =
-                
TranslationContext.forTranslationContextHolder(holder.getFeatureIdentifier());
+        this.translationContext = holder.getTranslationContext();
         this.patConstructor = patConstructor;
     }
 
diff --git 
a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/param/validate/method/ActionParameterValidationFacetViaMethod.java
 
b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/param/validate/method/ActionParameterValidationFacetViaMethod.java
index d4882f0441..4cf18aa50a 100644
--- 
a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/param/validate/method/ActionParameterValidationFacetViaMethod.java
+++ 
b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/param/validate/method/ActionParameterValidationFacetViaMethod.java
@@ -51,8 +51,7 @@ implements ImperativeFacet {
 
         super(holder);
         this.methods = ImperativeFacet.singleMethod(method);
-        this.translationContext =
-                
TranslationContext.forTranslationContextHolder(holder.getFeatureIdentifier());
+        this.translationContext = holder.getTranslationContext();
         this.patConstructor = patConstructor;
     }
 
diff --git 
a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/choices/PropertyChoicesFacetAbstract.java
 
b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/choices/PropertyChoicesFacetAbstract.java
index eab95b124f..d0f11acc2f 100644
--- 
a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/choices/PropertyChoicesFacetAbstract.java
+++ 
b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/choices/PropertyChoicesFacetAbstract.java
@@ -28,8 +28,12 @@ public abstract class PropertyChoicesFacetAbstract extends 
FacetAbstract impleme
         return PropertyChoicesFacet.class;
     }
 
-    public PropertyChoicesFacetAbstract(final FacetHolder holder) {
+    protected PropertyChoicesFacetAbstract(final FacetHolder holder) {
         super(type(), holder);
     }
 
+    protected PropertyChoicesFacetAbstract(final FacetHolder holder, final 
Facet.Precedence precedence) {
+        super(type(), holder, precedence);
+    }
+
 }
diff --git 
a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/choices/enums/PropertyChoicesFacetFromChoicesFacet.java
 
b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/choices/enums/PropertyChoicesFacetFromChoicesFacet.java
index 13f9e04848..8b85cdd4eb 100644
--- 
a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/choices/enums/PropertyChoicesFacetFromChoicesFacet.java
+++ 
b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/choices/enums/PropertyChoicesFacetFromChoicesFacet.java
@@ -18,34 +18,38 @@
  */
 package org.apache.isis.core.metamodel.facets.properties.choices.enums;
 
+import java.util.Optional;
+
 import org.apache.isis.commons.collections.Can;
 import org.apache.isis.core.metamodel.consent.InteractionInitiatedBy;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
-import org.apache.isis.core.metamodel.facets.FacetedMethod;
 import org.apache.isis.core.metamodel.facets.objectvalue.choices.ChoicesFacet;
 import 
org.apache.isis.core.metamodel.facets.properties.choices.PropertyChoicesFacetAbstract;
 import org.apache.isis.core.metamodel.spec.ManagedObject;
 
-import lombok.val;
-
-public class PropertyChoicesFacetFromChoicesFacet 
+public class PropertyChoicesFacetFromChoicesFacet
 extends PropertyChoicesFacetAbstract {
 
-    public PropertyChoicesFacetFromChoicesFacet(final FacetHolder holder) {
-        super(holder);
+    public static Optional<PropertyChoicesFacetAbstract> create(
+            final Optional<ChoicesFacet> choicesFacet,
+            final FacetHolder facetHolder) {
+        return choicesFacet
+        .map(choicesFct->new PropertyChoicesFacetFromChoicesFacet(choicesFct, 
facetHolder));
+    }
+
+    private final ChoicesFacet choicesFacet;
+
+    private PropertyChoicesFacetFromChoicesFacet(
+            final ChoicesFacet choicesFacet,
+            final FacetHolder holder) {
+        super(holder, Precedence.INFERRED);
+        this.choicesFacet = choicesFacet;
     }
 
     @Override
     public Can<ManagedObject> getChoices(
             final ManagedObject adapter,
             final InteractionInitiatedBy interactionInitiatedBy) {
-
-        val facetedMethod = (FacetedMethod) getFacetHolder();
-        val methodSpec = specForTypeElseFail(facetedMethod.getType());
-        val choicesFacet = methodSpec.getFacet(ChoicesFacet.class);
-        if (choicesFacet == null) {
-            return Can.empty();
-        }
         return choicesFacet.getChoices(adapter, interactionInitiatedBy);
     }
 
diff --git 
a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/choices/enums/PropertyChoicesFacetFromChoicesFacetFactory.java
 
b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/choices/enums/PropertyChoicesFacetFromChoicesFacetFactory.java
index 04b822d358..657663e21a 100644
--- 
a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/choices/enums/PropertyChoicesFacetFromChoicesFacetFactory.java
+++ 
b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/choices/enums/PropertyChoicesFacetFromChoicesFacetFactory.java
@@ -21,10 +21,13 @@ package 
org.apache.isis.core.metamodel.facets.properties.choices.enums;
 import javax.inject.Inject;
 
 import org.apache.isis.core.metamodel.context.MetaModelContext;
+import org.apache.isis.core.metamodel.facetapi.FacetUtil;
 import org.apache.isis.core.metamodel.facetapi.FeatureType;
 import org.apache.isis.core.metamodel.facets.FacetFactoryAbstract;
 import org.apache.isis.core.metamodel.facets.objectvalue.choices.ChoicesFacet;
 
+import lombok.val;
+
 public class PropertyChoicesFacetFromChoicesFacetFactory
 extends FacetFactoryAbstract {
 
@@ -38,12 +41,12 @@ extends FacetFactoryAbstract {
 
         final Class<?> returnType = 
processMethodContext.getMethod().getReturnType();
 
-        
if(!getSpecificationLoader().loadSpecification(returnType).containsNonFallbackFacet(ChoicesFacet.class))
 {
-            return;
-        }
+        val choicesFacetIfAny = 
getSpecificationLoader().loadSpecification(returnType)
+                .lookupNonFallbackFacet(ChoicesFacet.class);
 
-        addFacet(
-                new 
PropertyChoicesFacetFromChoicesFacet(processMethodContext.getFacetHolder()));
+        FacetUtil.addFacetIfPresent(
+                PropertyChoicesFacetFromChoicesFacet
+                .create(choicesFacetIfAny, 
processMethodContext.getFacetHolder()));
     }
 
 }
diff --git 
a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/property/modify/PropertyDomainEventFacetAbstract.java
 
b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/property/modify/PropertyDomainEventFacetAbstract.java
index 1fee027ee3..d247d2334c 100644
--- 
a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/property/modify/PropertyDomainEventFacetAbstract.java
+++ 
b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/property/modify/PropertyDomainEventFacetAbstract.java
@@ -60,9 +60,7 @@ extends SingleClassValueFacetAbstract implements 
PropertyDomainEventFacet {
         this.getterFacetIfAny = getterFacetIfAny;
 
         this.translationService = getTranslationService();
-        // sadness: same as in TranslationFactory
-        this.translationContext = 
TranslationContext.forTranslationContextHolder(
-                holder.getFeatureIdentifier());
+        this.translationContext = holder.getTranslationContext();
 
         domainEventHelper = 
DomainEventHelper.ofServiceRegistry(getServiceRegistry());
     }
@@ -87,7 +85,7 @@ extends SingleClassValueFacetAbstract implements 
PropertyDomainEventFacet {
     }
 
     @Override
-    public String hides(VisibilityContext ic) {
+    public String hides(final VisibilityContext ic) {
 
         final PropertyDomainEvent<?, ?> event =
                 domainEventHelper.postEventForProperty(
@@ -102,7 +100,7 @@ extends SingleClassValueFacetAbstract implements 
PropertyDomainEventFacet {
     }
 
     @Override
-    public String disables(UsabilityContext ic) {
+    public String disables(final UsabilityContext ic) {
 
         final PropertyDomainEvent<?, ?> event =
                 domainEventHelper.postEventForProperty(
@@ -121,7 +119,7 @@ extends SingleClassValueFacetAbstract implements 
PropertyDomainEventFacet {
     }
 
     @Override
-    public String invalidates(ValidityContext ic) {
+    public String invalidates(final ValidityContext ic) {
 
         if(getterFacetIfAny == null) {
             return null;
diff --git 
a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/validating/method/PropertyValidateFacetViaMethod.java
 
b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/validating/method/PropertyValidateFacetViaMethod.java
index 68ca9f1ce1..70586b7fdd 100644
--- 
a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/validating/method/PropertyValidateFacetViaMethod.java
+++ 
b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/validating/method/PropertyValidateFacetViaMethod.java
@@ -40,8 +40,7 @@ public class PropertyValidateFacetViaMethod extends 
PropertyValidateFacetAbstrac
                final FacetHolder holder) {
         super(holder);
         this.method = method;
-        this.translationContext =
-                
TranslationContext.forTranslationContextHolder(holder.getFeatureIdentifier());
+        this.translationContext = holder.getTranslationContext();
     }
 
     /**
diff --git 
a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/postprocessors/param/ChoicesAndDefaultsPostProcessor.java
 
b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/postprocessors/param/ChoicesAndDefaultsPostProcessor.java
index 2b865712e4..c97cc98d42 100644
--- 
a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/postprocessors/param/ChoicesAndDefaultsPostProcessor.java
+++ 
b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/postprocessors/param/ChoicesAndDefaultsPostProcessor.java
@@ -69,10 +69,15 @@ extends ObjectSpecificationPostProcessorAbstract {
             final ObjectAction objectAction,
             final ObjectActionParameter param) {
         if(!hasMemberLevelChoices(param)) {
-            param.getElementType()
-            .lookupNonFallbackFacet(ChoicesFacet.class)
-            .ifPresent(choicesFacet -> FacetUtil
-                    .addFacet(new 
ActionParameterChoicesFacetFromChoicesFacet(peerFor(param))));
+
+            //TODO not used: ActionParameterChoicesFacetFromChoicesFacetFactory
+
+            val choicesFacetIfAny = param.getElementType()
+                    .lookupNonFallbackFacet(ChoicesFacet.class);
+
+            FacetUtil.addFacetIfPresent(
+                    ActionParameterChoicesFacetFromChoicesFacet
+                    .create(choicesFacetIfAny, peerFor(param)));
         }
     }
 
@@ -87,10 +92,15 @@ extends ObjectSpecificationPostProcessorAbstract {
                                         specFacet, facetedMethodFor(prop))));
         }
         if(!hasMemberLevelChoices(prop)) {
-            prop.getElementType()
-            .lookupNonFallbackFacet(ChoicesFacet.class)
-            .ifPresent(specFacet -> FacetUtil
-                    .addFacet(new 
PropertyChoicesFacetFromChoicesFacet(facetedMethodFor(prop))));
+
+            //TODO not used: PropertyChoicesFacetFromChoicesFacetFactory
+
+            val choicesFacetIfAny = prop.getElementType()
+                    .lookupNonFallbackFacet(ChoicesFacet.class);
+
+            FacetUtil.addFacetIfPresent(
+                    PropertyChoicesFacetFromChoicesFacet
+                    .create(choicesFacetIfAny, facetedMethodFor(prop)));
         }
     }
 
diff --git 
a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectActionMixedIn.java
 
b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectActionMixedIn.java
index 90c7214dce..9ee63c558e 100644
--- 
a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectActionMixedIn.java
+++ 
b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectActionMixedIn.java
@@ -80,7 +80,7 @@ implements MixedInMember {
                     
mixinAction.getFacetedMethod().getFeatureIdentifier().getMemberParameterClassNames()),
                 mixinAction.getFacetedMethod(), false);
 
-        this.facetHolder = FacetHolderAbstract.layered(
+        this.facetHolder = FacetHolderAbstract.delegated(
                 super.getFeatureIdentifier(),
                 mixinAction.getFacetedMethod());
         this.mixinType = mixinType;
diff --git 
a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/OneToManyAssociationMixedIn.java
 
b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/OneToManyAssociationMixedIn.java
index fae5884b82..11d16d29ee 100644
--- 
a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/OneToManyAssociationMixedIn.java
+++ 
b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/OneToManyAssociationMixedIn.java
@@ -28,7 +28,6 @@ import org.apache.isis.core.metamodel.facetapi.FacetHolder;
 import org.apache.isis.core.metamodel.facetapi.FacetHolderAbstract;
 import org.apache.isis.core.metamodel.facetapi.FacetUtil;
 import org.apache.isis.core.metamodel.facets.actcoll.typeof.TypeOfFacet;
-import 
org.apache.isis.core.metamodel.facets.actcoll.typeof.TypeOfFacetFromActionReturn;
 import org.apache.isis.core.metamodel.facets.all.named.MemberNamedFacet;
 import 
org.apache.isis.core.metamodel.facets.all.named.MemberNamedFacetForStaticMemberName;
 import org.apache.isis.core.metamodel.facets.members.disabled.DisabledFacet;
@@ -97,7 +96,7 @@ implements MixedInMember {
                     _MixedInMemberNamingStrategy.determineIdFrom(mixinAction)),
                 mixinAction.getFacetedMethod(), typeOfSpec(mixinAction));
 
-        this.facetHolder = FacetHolderAbstract.layered(
+        this.facetHolder = FacetHolderAbstract.delegated(
                 super.getFeatureIdentifier(),
                 mixinAction.getFacetedMethod());
 
@@ -106,11 +105,10 @@ implements MixedInMember {
         this.mixeeSpec = mixeeSpec;
 
         //
-        // ensure the mixedIn collection cannot be modified, and derive its 
TypeOfFaccet
+        // ensure the mixedIn collection cannot be modified, and infer its 
TypeOfFaccet
         //
         FacetUtil.addFacet(new SnapshotExcludeFacetFromImmutableMember(this));
         FacetUtil.addFacet(disabledFacet());
-        FacetUtil.addFacet(new 
TypeOfFacetFromActionReturn(getElementType().getCorrespondingClass(), this));
 
         // adjust name if necessary
         val isExplicitlyNamed = lookupNonFallbackFacet(MemberNamedFacet.class)
diff --git 
a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/OneToOneAssociationMixedIn.java
 
b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/OneToOneAssociationMixedIn.java
index e6c3f0aca1..c1f6cfb0b6 100644
--- 
a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/OneToOneAssociationMixedIn.java
+++ 
b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/OneToOneAssociationMixedIn.java
@@ -80,7 +80,7 @@ implements MixedInMember {
                     _MixedInMemberNamingStrategy.determineIdFrom(mixinAction)),
                 mixinAction.getFacetedMethod(), mixinAction.getReturnType());
 
-        this.facetHolder = FacetHolderAbstract.layered(
+        this.facetHolder = FacetHolderAbstract.delegated(
                 super.getFeatureIdentifier(),
                 mixinAction.getFacetedMethod());
 
diff --git 
a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/ordering/memberorder/DeweyOrderComparatorTest.java
 
b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/ordering/memberorder/DeweyOrderComparatorTest.java
index 3e1b586f93..1655700444 100644
--- 
a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/ordering/memberorder/DeweyOrderComparatorTest.java
+++ 
b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/ordering/memberorder/DeweyOrderComparatorTest.java
@@ -64,7 +64,7 @@ public class DeweyOrderComparatorTest extends TestCase {
     @Rule
     public JUnitRuleMockery2 context = 
JUnitRuleMockery2.createFor(JUnitRuleMockery2.Mode.INTERFACES_AND_CLASSES);
 
-       static TranslationContext ctx = TranslationContext.ofName("test");
+       static TranslationContext ctx = TranslationContext.named("test");
 
     @Override
     protected void setUp() {
diff --git 
a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/ordering/memberorder/DeweyOrderSetTest.java
 
b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/ordering/memberorder/DeweyOrderSetTest.java
index 4fa22f236b..6fd973f0a1 100644
--- 
a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/ordering/memberorder/DeweyOrderSetTest.java
+++ 
b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/ordering/memberorder/DeweyOrderSetTest.java
@@ -92,7 +92,7 @@ public class DeweyOrderSetTest extends TestCase {
     @Rule
     public JUnitRuleMockery2 context = 
JUnitRuleMockery2.createFor(JUnitRuleMockery2.Mode.INTERFACES_AND_CLASSES);
 
-       static TranslationContext ctx = TranslationContext.ofName("test");
+       static TranslationContext ctx = TranslationContext.named("test");
 
     @Override
     protected void setUp() {
diff --git 
a/core/runtimeservices/src/test/java/org/apache/isis/core/runtimeservices/i18n/po/PoReaderTest.java
 
b/core/runtimeservices/src/test/java/org/apache/isis/core/runtimeservices/i18n/po/PoReaderTest.java
index 421f47953f..edaed97b08 100644
--- 
a/core/runtimeservices/src/test/java/org/apache/isis/core/runtimeservices/i18n/po/PoReaderTest.java
+++ 
b/core/runtimeservices/src/test/java/org/apache/isis/core/runtimeservices/i18n/po/PoReaderTest.java
@@ -80,7 +80,7 @@ public class PoReaderTest {
     public void singleContext() throws Exception {
 
         // given
-        final TranslationContext context = TranslationContext.ofName(
+        final TranslationContext context = TranslationContext.named(
                 
"org.apache.isis.applib.services.bookmark.BookmarkHolderAssociationContributions#object()");
         final String msgId = "Work of art";
         final String msgStr = "Objet d'art";
@@ -107,9 +107,9 @@ public class PoReaderTest {
     public void multipleContext() throws Exception {
 
         // given
-        final TranslationContext context1 = TranslationContext.ofName(
+        final TranslationContext context1 = TranslationContext.named(
                 
"fixture.simple.SimpleObjectsFixturesService#runFixtureScript(org.apache.isis.applib.fixturescripts.FixtureScript,java.lang.String)");
-        final TranslationContext context2 = TranslationContext.ofName(
+        final TranslationContext context2 = TranslationContext.named(
                 
"org.apache.isis.applib.fixturescripts.FixtureScripts#runFixtureScript(org.apache.isis.applib.fixturescripts.FixtureScript,java.lang.String)");
         final String msgId = "Parameters";
         final String msgStr = "Paramètres";
@@ -142,12 +142,12 @@ public class PoReaderTest {
     public void multipleBlocks() throws Exception {
 
         // given
-        final TranslationContext context1 = TranslationContext.ofName(
+        final TranslationContext context1 = TranslationContext.named(
                 
"org.apache.isis.applib.services.bookmark.BookmarkHolderAssociationContributions#object()");
         final String msgid1 = "Work of art";
         final String msgstr1 = "Objet d'art";
 
-        final TranslationContext context2 = TranslationContext.ofName(
+        final TranslationContext context2 = TranslationContext.named(
                 
"org.apache.isis.applib.services.bookmark.BookmarkHolderAssociationContributions#lookup()");
         final String msgid2 = "Lookup";
         final String msgstr2 = "Look up";
@@ -189,7 +189,7 @@ public class PoReaderTest {
     public void withPlurals() throws Exception {
 
         // given
-        final TranslationContext context = TranslationContext.ofName(
+        final TranslationContext context = TranslationContext.named(
                 
"org.apache.isis.applib.services.bookmark.BookmarkHolderAssociationContributions#object()");
         final String msgid = "Work of art";
         final String msgid_plural = "Works of art";
@@ -236,7 +236,7 @@ public class PoReaderTest {
             }
         };
 
-        TranslationContext context = TranslationContext.ofName("someContext");
+        TranslationContext context = TranslationContext.named("someContext");
 
         // when
         final String translated = poReader.translate(context, "Something to 
translate");
diff --git 
a/regressiontests/stable-domainmodel/src/test/java/org/apache/isis/testdomain/domainmodel/MetaModelRegressionTest.java
 
b/regressiontests/stable-domainmodel/src/test/java/org/apache/isis/testdomain/domainmodel/MetaModelRegressionTest.java
index 8218e15d61..2478a7b0b5 100644
--- 
a/regressiontests/stable-domainmodel/src/test/java/org/apache/isis/testdomain/domainmodel/MetaModelRegressionTest.java
+++ 
b/regressiontests/stable-domainmodel/src/test/java/org/apache/isis/testdomain/domainmodel/MetaModelRegressionTest.java
@@ -29,6 +29,7 @@ import javax.inject.Inject;
 import org.assertj.core.api.Assumptions;
 import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.condition.DisabledIfSystemProperty;
 import org.springframework.boot.test.context.SpringBootTest;
 import org.springframework.test.context.TestPropertySource;
 
@@ -65,7 +66,7 @@ import lombok.val;
     IsisPresets.SilenceProgrammingModel
 })
 //uncomment if intended only for manual verification.
-//@DisabledIfSystemProperty(named = "isRunningWithSurefire", matches = "true")
+@DisabledIfSystemProperty(named = "isRunningWithSurefire", matches = "true")
 class MetaModelRegressionTest {
 
     @Inject MetaModelServiceMenu metaModelServiceMenu;
diff --git 
a/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/app/registry/ComponentFactoryRegistry.java
 
b/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/app/registry/ComponentFactoryRegistry.java
index b5b0fca63c..01b461f9c1 100644
--- 
a/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/app/registry/ComponentFactoryRegistry.java
+++ 
b/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/app/registry/ComponentFactoryRegistry.java
@@ -88,10 +88,10 @@ public interface ComponentFactoryRegistry {
     Component addOrReplaceComponent(MarkupContainer markupContainer, String 
id, ComponentType componentType, IModel<?> model);
 
     /**
-     * As per {@link #createComponent(ComponentType, String, IModel)}, but with
+     * As per {@link #createComponent(String, ComponentType, IModel)}, but with
      * the wicket id derived from the {@link ComponentType}.
      *
-     * @see #createComponent(ComponentType, String, IModel)
+     * @see #createComponent(String, ComponentType, IModel)
      */
     Component createComponent(ComponentType componentType, IModel<?> model);
 
diff --git 
a/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/value/fallback/ValueFallbackPanelFactory.java
 
b/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/value/fallback/ValueFallbackPanelFactory.java
index 338fcbf671..162bad71dd 100644
--- 
a/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/value/fallback/ValueFallbackPanelFactory.java
+++ 
b/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/value/fallback/ValueFallbackPanelFactory.java
@@ -18,6 +18,7 @@
  */
 package org.apache.isis.viewer.wicket.ui.components.scalars.value.fallback;
 
+
 import org.apache.wicket.Component;
 import org.apache.wicket.model.IModel;
 
@@ -36,7 +37,8 @@ extends ComponentFactoryScalarAbstract {
     private static final long serialVersionUID = 1L;
 
     public ValueFallbackPanelFactory() {
-        super(ValueFallbackPanel.class); // not asking the supertype to 
validate types, so no value types need be provided.
+        // not asking the super-type to validate types, so no value types need 
be provided.
+        super(ValueFallbackPanel.class);
     }
 
     @Override
@@ -48,8 +50,9 @@ extends ComponentFactoryScalarAbstract {
         if(!scalarModel.getScalarTypeSpec().isValue()) {
             return ApplicationAdvice.DOES_NOT_APPLY;
         }
+
         final boolean hasChoices = scalarModel.hasChoices();
-        // autoComplete not supported on values, only references
+        // autoComplete not supported for values, only for references
         // final boolean hasAutoComplete = scalarModel.hasAutoComplete();
         return appliesIf( !(hasChoices /*|| hasAutoComplete*/) );
     }
diff --git 
a/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/valuechoices/ValueChoicesSelect2PanelFactory.java
 
b/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/valuechoices/ValueChoicesSelect2PanelFactory.java
index ecdb0f7e87..0ddece17da 100644
--- 
a/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/valuechoices/ValueChoicesSelect2PanelFactory.java
+++ 
b/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/valuechoices/ValueChoicesSelect2PanelFactory.java
@@ -43,7 +43,7 @@ public class ValueChoicesSelect2PanelFactory extends 
ComponentFactoryAbstract {
         }
         val scalarModel = (ScalarModel) model;
 
-        // autoComplete not supported on values, only references
+        // autoComplete not supported for values, only for references
         // this is because there is no easy way in the ChoiceProvider to 
convert the list of Ids (strings)
         // into corresponding ObjectAdapterMemento's.
         // see subclasses of ObjectAdapterMementoProviderAbstract

Reply via email to