You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@isis.apache.org by ah...@apache.org on 2021/06/25 19:22:15 UTC

[isis] branch master updated: ISIS-1720: split existing NamedFacet and DescribedAsFacet up into more specialized variants

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 800d5c5  ISIS-1720: split existing NamedFacet and DescribedAsFacet up into more specialized variants
800d5c5 is described below

commit 800d5c556f1dfa3a9ba8af2a9cf5b2eb88436659
Author: Andi Huber <ah...@apache.org>
AuthorDate: Fri Jun 25 21:22:01 2021 +0200

    ISIS-1720: split existing NamedFacet and DescribedAsFacet up into more
    specialized variants
    
    (1) ObjectNamedFacet, MemberNamedFacet and ParameterNamedFacet
    
    (2) ObjectDescribedFacet, MemberDescribedFacet and
    ParameterDescribedFacet
    
    also deprecate the 'escaped' flag; viewers are required to always escape
---
 .../isis/applib/annotation/CollectionLayout.java   |   5 +-
 .../isis/applib/annotation/ParameterLayout.java    |   1 +
 .../isis/applib/annotation/PropertyLayout.java     |  49 ++++-----
 .../isis/applib/layout/component/HasNamed.java     |   1 +
 .../isis/commons/internal/base/_Optionals.java     |  20 ++--
 .../DescribedAsFacetForActionLayoutAnnotation.java |  16 +--
 .../layout/DescribedAsFacetForActionXml.java       |  12 +--
 .../NamedFacetForActionLayoutAnnotation.java       |  14 +--
 .../actions/layout/NamedFacetForActionXml.java     |  17 ++--
 ...ribedAsFacet.java => MemberDescribedFacet.java} |  10 +-
 ...rDescribedFacetWithImperativeTextAbstract.java} |  52 ++++------
 ...MemberDescribedFacetWithStaticTextAbstract.java |  50 ++++++++++
 ...ribedAsFacet.java => ObjectDescribedFacet.java} |  17 +---
 ...acet.java => ObjectDescribedFacetAbstract.java} |  33 ++++---
 ...cribedAsFacet.java => ParamDescribedFacet.java} |  18 +---
 ...tract.java => ParamDescribedFacetAbstract.java} |  50 ++++------
 .../i8n/HasMemoizableTranslation.java}             |  18 +---
 .../all/i8n/imperative/HasImperativeText.java      |   9 ++
 ...ct.java => HasImperativeTextFacetAbstract.java} |  11 ++-
 .../metamodel/facets/all/i8n/noun/HasNoun.java     |  72 ++++++++++++++
 .../HasNounFacetAbstract.java}                     |  37 +++++--
 .../facets/all/i8n/{staatic => noun}/NounForm.java |  24 +----
 .../all/i8n/{staatic => noun}/NounForms.java       |  28 +-----
 .../facets/all/i8n/staatic/HasStaticText.java      |  59 ++++++-----
 .../HasStaticTextFacetAbstract.java}               |  64 ++++++------
 .../MemberNamedFacet.java}                         |  14 +--
 ...va => MemberNamedFacetForStaticMemberName.java} |  19 ++--
 ...emberNamedFacetWithImperativeTextAbstract.java} |  35 ++++---
 .../MemberNamedFacetWithStaticTextAbstract.java    |  50 ++++++++++
 .../metamodel/facets/all/named/NamedFacet.java     |   5 +-
 .../facets/all/named/NamedFacetAbstract.java       |  88 -----------------
 .../facets/all/named/ObjectNamedFacet.java         |  22 ++---
 ...Abstract.java => ObjectNamedFacetAbstract.java} |  46 ++++-----
 .../facets/all/named/ParamNamedFacet.java          |  23 ++---
 ...amedFacet.java => ParamNamedFacetAbstract.java} |  38 +++----
 ...cribedAsFacetForCollectionLayoutAnnotation.java |  17 ++--
 .../layout/DescribedAsFacetForCollectionXml.java   |  14 +--
 .../NamedFacetForCollectionLayoutAnnotation.java   |  21 ++--
 .../layout/NamedFacetForCollectionXml.java         |  17 ++--
 .../facets/fallback/FallbackFacetFactory.java      |   7 +-
 .../fallback/NamedFacetFallbackFromMemberName.java |   8 +-
 .../metamodel/facets/fallback/NamedFacetNone.java  |  38 -------
 .../annotprop/DescribedAsFacetOnMemberFactory.java |  57 -----------
 .../DescribedAsFacetOnMemberFromProperties.java    |   5 +-
 ... DescribedAsFacetOnMemberInferredFromType.java} |  42 ++++----
 .../method/DescribedAsFacetForMemberViaMethod.java |  24 +----
 .../named/method/NamedFacetForMemberViaMethod.java |  29 +-----
 ...ibedAsFacetForDomainObjectLayoutAnnotation.java |  11 ++-
 .../DescribedAsFacetForDomainObjectXml.java        |  12 +--
 .../NamedFacetForDomainObjectLayoutAnnotation.java |  17 ++--
 .../NamedFacetForDomainObjectXml.java              |  20 ++--
 ...NamedFacetForDomainServiceLayoutAnnotation.java |  12 +--
 .../mandatory/MandatoryFacetAbstract.java          |  43 ++++----
 ...ameterAnnotationElseDerivedFromTypeFactory.java |  62 ------------
 ...scribedAsFacetOnParameterInferredFromType.java} |  41 ++++----
 ...scribedAsFacetForParameterLayoutAnnotation.java |  14 +--
 .../NamedFacetForParameterLayoutAnnotation.java    |  15 ++-
 .../NamedFacetForParameterUsingReflection.java     |  11 ++-
 ...escribedAsFacetForPropertyLayoutAnnotation.java |  14 ++-
 .../DescribedAsFacetForPropertyXml.java            |  14 +--
 .../NamedFacetForPropertyLayoutAnnotation.java     |  14 ++-
 .../propertylayout/NamedFacetForPropertyXml.java   |  26 ++---
 .../core/metamodel/layout/LayoutFacetUtil.java     | 109 +++++++++++++--------
 .../DeriveDescribedAsFromTypePostProcessor.java    |  32 +++---
 .../all/i18n/TranslationPostProcessor.java         |  41 ++++----
 .../dflt/ProgrammingModelFacetsJava8.java          |   3 -
 .../services/grid/GridSystemServiceAbstract.java   |   8 +-
 .../isis/core/metamodel/spec/ManagedObject.java    |   5 -
 .../core/metamodel/spec/ObjectSpecification.java   |  19 ++--
 .../spec/feature/ObjectActionParameter.java        |   8 +-
 .../specloader/specimpl/ObjectActionMixedIn.java   |  10 +-
 .../specimpl/ObjectActionParameterAbstract.java    |  19 ++--
 .../specloader/specimpl/ObjectMemberAbstract.java  |  16 +--
 .../specimpl/ObjectSpecificationAbstract.java      |  29 ++----
 .../specimpl/OneToManyAssociationMixedIn.java      |  10 +-
 .../specimpl/OneToOneAssociationMixedIn.java       |  11 +--
 .../specimpl/dflt/ObjectSpecificationDefault.java  |  16 ++-
 ...etForCollectionLayoutAnnotationFactoryTest.java |  29 +-----
 .../DomainObjectLayoutFactoryTest.java             |  26 ++---
 ...cetForParameterLayoutAnnotationFactoryTest.java |  32 +-----
 .../facets/param/name/ParameterNameFacetTest.java  |  14 ++-
 ...acetForPropertyLayoutAnnotationFactoryTest.java |  36 +------
 .../objects/ObjectActionLayoutXmlDefaultTest.java  |  16 +--
 .../objects/OneToManyAssociationDefaultTest.java   |  18 ++--
 .../SpecificationLoaderTestAbstract.java           |  26 ++++-
 ...ionParameterAbstractTest_getId_and_getName.java |  22 ++---
 .../menubars/bootstrap3/MenuBarsServiceBS3.java    |  18 ++--
 .../ObjectReflectorDefaultTest_object.java         |  15 ++-
 .../SpecificationLoaderTestAbstract.java           |  24 ++++-
 .../testdomain/interact/NewParameterModelTest.java |   7 +-
 .../common/model/action/ActionUiMetaModel.java     |   8 +-
 .../models/EntityCollectionModelStandalone.java    |  10 +-
 .../actionprompt/ActionPromptHeaderPanel.java      |  10 +-
 .../CollectionContentsAsAjaxTablePanel.java        |  12 +--
 .../entity/collection/EntityCollectionPanel.java   |   6 +-
 .../ui/components/property/PropertyEditPanel.java  |   9 +-
 .../PropertyEditPromptHeaderPanel.java             |   9 +-
 .../ui/components/scalars/ScalarPanelAbstract.java |  23 ++---
 98 files changed, 1033 insertions(+), 1305 deletions(-)

diff --git a/api/applib/src/main/java/org/apache/isis/applib/annotation/CollectionLayout.java b/api/applib/src/main/java/org/apache/isis/applib/annotation/CollectionLayout.java
index 32c89f6..f7b611c 100644
--- a/api/applib/src/main/java/org/apache/isis/applib/annotation/CollectionLayout.java
+++ b/api/applib/src/main/java/org/apache/isis/applib/annotation/CollectionLayout.java
@@ -121,6 +121,7 @@ public @interface CollectionLayout {
      *
      * @see CollectionLayout#named()
      */
+    @Deprecated
     boolean namedEscaped()
             default true;
 
@@ -142,7 +143,7 @@ public @interface CollectionLayout {
             default -1;
 
     /**
-     * The order of this member relative to other members in the same (layout) group, 
+     * The order of this member relative to other members in the same (layout) group,
      * given in <i>Dewey-decimal</i> notation.
      * <p>
      *     An alternative is to use the <code>Xxx.layout.xml</code> file,
@@ -153,7 +154,7 @@ public @interface CollectionLayout {
      */
     String sequence()
             default "";
-    
+
     /**
      * Indicates that the elements in a ({@link java.util.SortedSet}) collection should be sorted according to a different order than the
      * natural sort order, as defined by the specified{@link java.util.Comparator}.
diff --git a/api/applib/src/main/java/org/apache/isis/applib/annotation/ParameterLayout.java b/api/applib/src/main/java/org/apache/isis/applib/annotation/ParameterLayout.java
index 92d4921..bb1fa72 100644
--- a/api/applib/src/main/java/org/apache/isis/applib/annotation/ParameterLayout.java
+++ b/api/applib/src/main/java/org/apache/isis/applib/annotation/ParameterLayout.java
@@ -109,6 +109,7 @@ public @interface ParameterLayout {
      * @see CollectionLayout#namedEscaped()
      * @see ParameterLayout#named()
      */
+    @Deprecated
     boolean namedEscaped()
             default true;
 
diff --git a/api/applib/src/main/java/org/apache/isis/applib/annotation/PropertyLayout.java b/api/applib/src/main/java/org/apache/isis/applib/annotation/PropertyLayout.java
index 7e62918..6686aa2 100644
--- a/api/applib/src/main/java/org/apache/isis/applib/annotation/PropertyLayout.java
+++ b/api/applib/src/main/java/org/apache/isis/applib/annotation/PropertyLayout.java
@@ -65,47 +65,47 @@ public @interface PropertyLayout {
     String describedAs()
             default "";
 
-    
+
     /**
      * Specifies the <b>id</b> of associated <i>FieldSet</i>.
-     * 
+     *
      * <p>
      * A <i>FieldSet</i> is a layout component for property grouping, that can either be specified via
-     * a <code>Xxx.layout.xml</code> file (with <code>Xxx</code> the domain object name) or is 
-     * inferred by the framework via annotations (aka the programming model). 
-     * <i>FieldSet</i>s are represented in-memory and requires a framework internal unique id per domain 
+     * a <code>Xxx.layout.xml</code> file (with <code>Xxx</code> the domain object name) or is
+     * inferred by the framework via annotations (aka the programming model).
+     * <i>FieldSet</i>s are represented in-memory and requires a framework internal unique id per domain
      * object type.
      * </p>
      * <p>
      * Following 2 scenarios have slightly different behavior:
      * </p>
-     * 
+     *
      * <h1>XML layout is present</h1>
      * <p>
-     * When a XML layout is present, every <i>FieldSet</i> <b>id</b> is either explicitly specified in 
+     * When a XML layout is present, every <i>FieldSet</i> <b>id</b> is either explicitly specified in
      * the file or may be inferred from a non-empty <b>name</b>.
      * If the <b>name</b> is empty "" or missing, then the <b>id</b> within the file is mandatory.
      * </p><p>
-     * If this <i>Property</i> is not already explicitly listed within the XML layout, we lookup the 
-     * associated <i>FieldSet</i> in the XML layout file first matching by <b>id</b> 
-     * using {@code @PropertyLayout(fieldSetId=...)} if any, then falling back to matching by (friendly) 
+     * If this <i>Property</i> is not already explicitly listed within the XML layout, we lookup the
+     * associated <i>FieldSet</i> in the XML layout file first matching by <b>id</b>
+     * using {@code @PropertyLayout(fieldSetId=...)} if any, then falling back to matching by (friendly)
      * <b>name</b> using @PropertyLayout(fieldSetName=...)} if any.
      * </p>
-     * 
+     *
      * <h1>XML layout is absent</h1>
      * <p>
-     * We reify (in-memory) the associated <i>FieldSet</i> using {@code @PropertyLayout(fieldSetId=...)} 
-     * (if present) as its <b>id</b> and using {@code @PropertyLayout(fieldSetId=...)} as its (friendly) 
-     * <b>name</b>. 
-     * While if no <b>id</b> is provided an <b>id</b> is inferred from the (friendly) <b>name</b>, in which 
+     * We reify (in-memory) the associated <i>FieldSet</i> using {@code @PropertyLayout(fieldSetId=...)}
+     * (if present) as its <b>id</b> and using {@code @PropertyLayout(fieldSetId=...)} as its (friendly)
+     * <b>name</b>.
+     * While if no <b>id</b> is provided an <b>id</b> is inferred from the (friendly) <b>name</b>, in which
      * case the (friendly) <b>name</b> must not be empty.
-     * Whereas if no (friendly) <b>name</b> is provided a (friendly) <b>name</b> is inferred from the 
+     * Whereas if no (friendly) <b>name</b> is provided a (friendly) <b>name</b> is inferred from the
      * <b>id</b>, in which case the <b>id</b> must not be empty.
      * </p><p>
-     * With {@code @PropertyLayout(sequence=...)} the relative position within that <i>FieldSet</i> can be 
+     * With {@code @PropertyLayout(sequence=...)} the relative position within that <i>FieldSet</i> can be
      * specified.
      * </p>
-     *  
+     *
      * @see Action#associateWith()
      * @see ActionLayout#fieldSetId()
      * @see ActionLayout#fieldSetName()
@@ -114,9 +114,9 @@ public @interface PropertyLayout {
      */
     String fieldSetId()
             default "__infer";
-    
+
     /**
-     * Specifies the <b>friendly-name</b> of associated <i>FieldSet</i>. 
+     * Specifies the <b>friendly-name</b> of associated <i>FieldSet</i>.
      * <p>
      * Explicitly specifying an empty "" <b>friendly-name</b> will suppress the <i>FieldSet</i>'s label
      * from being rendered.
@@ -124,7 +124,7 @@ public @interface PropertyLayout {
      * <p>
      * For a more in depth description see {@link PropertyLayout#fieldSetId()}.
      * </p>
-     * 
+     *
      * @see Action#associateWith()
      * @see ActionLayout#fieldSetId()
      * @see ActionLayout#fieldSetName()
@@ -133,7 +133,7 @@ public @interface PropertyLayout {
      */
     String fieldSetName()
             default "__infer";
-    
+
     /**
      * Indicates where in the UI the property
      * should <i>not</i> be visible.
@@ -196,6 +196,7 @@ public @interface PropertyLayout {
      * @see CollectionLayout#namedEscaped()
      * @see PropertyLayout#named()
      */
+    @Deprecated
     boolean namedEscaped()
             default true;
 
@@ -269,10 +270,10 @@ public @interface PropertyLayout {
      */
     Repainting repainting()
             default Repainting.NOT_SPECIFIED;
-    
+
 
     /**
-     * The order of this member relative to other members in the same (layout) group, 
+     * The order of this member relative to other members in the same (layout) group,
      * given in <i>Dewey-decimal</i> notation.
      * <p>
      *     An alternative is to use the <code>Xxx.layout.xml</code> file,
diff --git a/api/applib/src/main/java/org/apache/isis/applib/layout/component/HasNamed.java b/api/applib/src/main/java/org/apache/isis/applib/layout/component/HasNamed.java
index 8567b2f..158ce1b 100644
--- a/api/applib/src/main/java/org/apache/isis/applib/layout/component/HasNamed.java
+++ b/api/applib/src/main/java/org/apache/isis/applib/layout/component/HasNamed.java
@@ -30,6 +30,7 @@ public interface HasNamed {
     String getNamed();
     void setNamed(String named);
 
+    @Deprecated // ignored
     @XmlAttribute(required = false)
     Boolean getNamedEscaped();
     void setNamedEscaped(Boolean namedEscaped);
diff --git a/commons/src/main/java/org/apache/isis/commons/internal/base/_Optionals.java b/commons/src/main/java/org/apache/isis/commons/internal/base/_Optionals.java
index 697f1a2..5240b30 100644
--- a/commons/src/main/java/org/apache/isis/commons/internal/base/_Optionals.java
+++ b/commons/src/main/java/org/apache/isis/commons/internal/base/_Optionals.java
@@ -28,30 +28,32 @@ public class _Optionals {
 
     // can be replaced by Java 9 firstOptional.or(() -> secondOptional);
     public static <T> Optional<T> or(
-            final Optional<T> a,
+            final Optional<? extends T> a,
             final Supplier<Optional<? extends T>> b) {
         return a.isPresent()
-                ? a
+                ? _Casts.uncheckedCast(a)
                 : b.get().map(_Casts::uncheckedCast);
     }
 
     public static <T> Optional<T> or(
-            final Optional<T> a,
+            final Optional<? extends T> a,
             final Supplier<Optional<? extends T>> b,
             final Supplier<Optional<? extends T>> c) {
         return or(or(a, b), c);
     }
 
     public static <T> Optional<T> orNullable(
-            final Optional<T> a,
-            final Supplier<T> b) {
-        return a.isPresent() ? a : Optional.ofNullable(b.get());
+            final Optional<? extends T> a,
+            final Supplier<? extends T> b) {
+        return a.isPresent()
+                ? _Casts.uncheckedCast(a)
+                : Optional.ofNullable(b.get());
     }
 
     public static <T> Optional<T> orNullable(
-            final Optional<T> a,
-            final Supplier<T> b,
-            final Supplier<T> c) {
+            final Optional<? extends T> a,
+            final Supplier<? extends T> b,
+            final Supplier<? extends T> c) {
         return orNullable(orNullable(a, b), c);
     }
 
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/layout/DescribedAsFacetForActionLayoutAnnotation.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/layout/DescribedAsFacetForActionLayoutAnnotation.java
index d5d83a2..79e6d90 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/layout/DescribedAsFacetForActionLayoutAnnotation.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/layout/DescribedAsFacetForActionLayoutAnnotation.java
@@ -24,23 +24,27 @@ import java.util.Optional;
 import org.apache.isis.applib.annotation.ActionLayout;
 import org.apache.isis.commons.internal.base._Strings;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
-import org.apache.isis.core.metamodel.facets.all.described.DescribedAsFacetAbstract;
+import org.apache.isis.core.metamodel.facets.all.described.MemberDescribedFacet;
+import org.apache.isis.core.metamodel.facets.all.described.MemberDescribedFacetWithStaticTextAbstract;
 
 public class DescribedAsFacetForActionLayoutAnnotation
-extends DescribedAsFacetAbstract {
+extends MemberDescribedFacetWithStaticTextAbstract {
 
-    public static Optional<DescribedAsFacetForActionLayoutAnnotation> create(
+    public static Optional<MemberDescribedFacet> create(
             final Optional<ActionLayout> actionLayoutIfAny,
             final FacetHolder holder) {
 
         return actionLayoutIfAny
                 .map(ActionLayout::describedAs)
                 .filter(_Strings::isNotEmpty)
-                .map(describedAs -> new DescribedAsFacetForActionLayoutAnnotation(describedAs, holder));
+                .map(describedAs ->
+                    new DescribedAsFacetForActionLayoutAnnotation(describedAs, holder));
     }
 
-    private DescribedAsFacetForActionLayoutAnnotation(final String value, final FacetHolder holder) {
-        super(value, holder);
+    private DescribedAsFacetForActionLayoutAnnotation(
+            final String described,
+            final FacetHolder holder) {
+        super(described, holder);
     }
 
 }
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/layout/DescribedAsFacetForActionXml.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/layout/DescribedAsFacetForActionXml.java
index 4226f43..c9e2fdf 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/layout/DescribedAsFacetForActionXml.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/layout/DescribedAsFacetForActionXml.java
@@ -24,13 +24,13 @@ import java.util.Optional;
 import org.apache.isis.applib.layout.component.ActionLayoutData;
 import org.apache.isis.commons.internal.base._Strings;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
-import org.apache.isis.core.metamodel.facets.all.described.DescribedAsFacet;
-import org.apache.isis.core.metamodel.facets.all.described.DescribedAsFacetAbstract;
+import org.apache.isis.core.metamodel.facets.all.described.MemberDescribedFacet;
+import org.apache.isis.core.metamodel.facets.all.described.MemberDescribedFacetWithStaticTextAbstract;
 
 public class DescribedAsFacetForActionXml
-extends DescribedAsFacetAbstract {
+extends MemberDescribedFacetWithStaticTextAbstract {
 
-    public static Optional<DescribedAsFacet> create(
+    public static Optional<MemberDescribedFacet> create(
             final ActionLayoutData actionLayout,
             final FacetHolder holder) {
         if(actionLayout == null) {
@@ -42,8 +42,8 @@ extends DescribedAsFacetAbstract {
                 : Optional.empty();
     }
 
-    private DescribedAsFacetForActionXml(final String value, final FacetHolder holder) {
-        super(value, holder);
+    private DescribedAsFacetForActionXml(final String described, final FacetHolder holder) {
+        super(described, holder);
     }
 
 }
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/layout/NamedFacetForActionLayoutAnnotation.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/layout/NamedFacetForActionLayoutAnnotation.java
index 0219cc0..e7a1dd0 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/layout/NamedFacetForActionLayoutAnnotation.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/layout/NamedFacetForActionLayoutAnnotation.java
@@ -24,12 +24,13 @@ import java.util.Optional;
 import org.apache.isis.applib.annotation.ActionLayout;
 import org.apache.isis.commons.internal.base._Strings;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
-import org.apache.isis.core.metamodel.facets.all.i8n.staatic.NounForms;
-import org.apache.isis.core.metamodel.facets.all.named.NamedFacetAbstract;
+import org.apache.isis.core.metamodel.facets.all.named.MemberNamedFacet;
+import org.apache.isis.core.metamodel.facets.all.named.MemberNamedFacetWithStaticTextAbstract;
 
-public class NamedFacetForActionLayoutAnnotation extends NamedFacetAbstract {
+public class NamedFacetForActionLayoutAnnotation
+extends MemberNamedFacetWithStaticTextAbstract {
 
-    public static Optional<NamedFacetForActionLayoutAnnotation> create(
+    public static Optional<MemberNamedFacet> create(
             final Optional<ActionLayout> actionLayoutIfAny,
             final FacetHolder holder) {
 
@@ -39,9 +40,8 @@ public class NamedFacetForActionLayoutAnnotation extends NamedFacetAbstract {
                 .map(named -> new NamedFacetForActionLayoutAnnotation(named, holder));
     }
 
-    private NamedFacetForActionLayoutAnnotation(final String singularName, final FacetHolder holder) {
-
-        super(NounForms.preferredSingular(singularName).build(), /*escaped*/ true, holder);
+    private NamedFacetForActionLayoutAnnotation(final String named, final FacetHolder holder) {
+        super(named, holder);
     }
 
 }
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/layout/NamedFacetForActionXml.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/layout/NamedFacetForActionXml.java
index 57746b0..437c897 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/layout/NamedFacetForActionXml.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/layout/NamedFacetForActionXml.java
@@ -24,29 +24,26 @@ import java.util.Optional;
 import org.apache.isis.applib.layout.component.ActionLayoutData;
 import org.apache.isis.commons.internal.base._Strings;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
-import org.apache.isis.core.metamodel.facets.all.i8n.staatic.NounForms;
-import org.apache.isis.core.metamodel.facets.all.named.NamedFacet;
-import org.apache.isis.core.metamodel.facets.all.named.NamedFacetAbstract;
+import org.apache.isis.core.metamodel.facets.all.named.MemberNamedFacet;
+import org.apache.isis.core.metamodel.facets.all.named.MemberNamedFacetWithStaticTextAbstract;
 
 public class NamedFacetForActionXml
-extends NamedFacetAbstract {
+extends MemberNamedFacetWithStaticTextAbstract {
 
-    public static Optional<NamedFacet> create(
+    public static Optional<MemberNamedFacet> create(
             final ActionLayoutData actionLayout,
             final FacetHolder holder) {
         if(actionLayout == null) {
             return Optional.empty();
         }
         final String named = _Strings.emptyToNull(actionLayout.getNamed());
-        Boolean escaped = actionLayout.getNamedEscaped();
         return named != null
-                ? Optional.of(new NamedFacetForActionXml(named, (escaped == null || escaped), holder))
+                ? Optional.of(new NamedFacetForActionXml(named, holder))
                 : Optional.empty();
     }
 
-    private NamedFacetForActionXml(final String singularName, final boolean escaped, final FacetHolder holder) {
-
-        super(NounForms.preferredSingular(singularName).build(), escaped, holder);
+    private NamedFacetForActionXml(final String named, final FacetHolder holder) {
+        super(named, holder);
     }
 
 }
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/all/described/DescribedAsFacet.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/all/described/MemberDescribedFacet.java
similarity index 83%
copy from core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/all/described/DescribedAsFacet.java
copy to core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/all/described/MemberDescribedFacet.java
index 7b813eb..6e05a28 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/all/described/DescribedAsFacet.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/all/described/MemberDescribedFacet.java
@@ -16,7 +16,6 @@
  *  specific language governing permissions and limitations
  *  under the License.
  */
-
 package org.apache.isis.core.metamodel.facets.all.described;
 
 import org.apache.isis.commons.internal.base._Either;
@@ -24,14 +23,7 @@ import org.apache.isis.core.metamodel.facetapi.Facet;
 import org.apache.isis.core.metamodel.facets.all.i8n.imperative.HasImperativeText;
 import org.apache.isis.core.metamodel.facets.all.i8n.staatic.HasStaticText;
 
-/**
- * Describes a class, a property, collection, an action or an action parameter.
- *
- * <p>
- * In the standard Apache Isis Programming Model, corresponds to annotating the
- * member with <tt>@DescribedAs</tt>.
- */
-public interface DescribedAsFacet
+public interface MemberDescribedFacet
 extends
     Facet {
 
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/all/described/DescribedAsFacetAbstract.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/all/described/MemberDescribedFacetWithImperativeTextAbstract.java
similarity index 60%
copy from core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/all/described/DescribedAsFacetAbstract.java
copy to core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/all/described/MemberDescribedFacetWithImperativeTextAbstract.java
index d9d508e..174c4ad 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/all/described/DescribedAsFacetAbstract.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/all/described/MemberDescribedFacetWithImperativeTextAbstract.java
@@ -16,56 +16,44 @@
  *  specific language governing permissions and limitations
  *  under the License.
  */
-
 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.internal.base._Either;
 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.imperative.HasImperativeText;
+import org.apache.isis.core.metamodel.facets.all.i8n.imperative.HasImperativeTextFacetAbstract;
 import org.apache.isis.core.metamodel.facets.all.i8n.staatic.HasStaticText;
-import org.apache.isis.core.metamodel.facets.all.i8n.staatic.I8nStaticFacetAbstract;
-import org.apache.isis.core.metamodel.facets.all.i8n.staatic.NounForms;
 
 import lombok.Getter;
 
-public abstract class DescribedAsFacetAbstract
-extends I8nStaticFacetAbstract
-implements DescribedAsFacet {
+/**
+ * One of two bases for the {@link MemberDescribedFacet}.
+ *
+ * @see MemberDescribedFacetWithStaticTextAbstract
+ * @since 2.0
+ */
+public abstract class MemberDescribedFacetWithImperativeTextAbstract
+extends HasImperativeTextFacetAbstract
+implements MemberDescribedFacet {
 
     private static final Class<? extends Facet> type() {
-        return DescribedAsFacet.class;
+        return MemberDescribedFacet.class;
     }
 
     @Getter(onMethod_ = {@Override})
-    private final _Either<HasStaticText, HasImperativeText> specialization = _Either.left(this);
+    private final _Either<HasStaticText, HasImperativeText> specialization = _Either.right(this);
 
-    protected DescribedAsFacetAbstract(
-            final String originalText,
+    protected MemberDescribedFacetWithImperativeTextAbstract(
+            final Method method,
             final FacetHolder holder) {
-        this(originalText, holder, Precedence.DEFAULT);
-    }
-
-    protected DescribedAsFacetAbstract(
-            final String originalText,
-            final FacetHolder holder,
-            final Facet.Precedence precedence) {
         super(type(),
-                NounForms
-                    .preferredIndifferent(originalText)
-                    .build(),
-                holder,
-                precedence);
+                TranslationContext.forTranslationContextHolder(holder.getFeatureIdentifier()),
+                method,
+                holder);
     }
 
-    public final String text() {
-        return preferredText();
-    }
-
-    public final String translated() {
-        return preferredTranslated();
-    }
-
-
 }
-
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
new file mode 100644
index 0000000..a33e40d
--- /dev/null
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/all/described/MemberDescribedFacetWithStaticTextAbstract.java
@@ -0,0 +1,50 @@
+package org.apache.isis.core.metamodel.facets.all.described;
+
+import org.apache.isis.applib.services.i18n.TranslationContext;
+import org.apache.isis.commons.internal.base._Either;
+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.imperative.HasImperativeText;
+import org.apache.isis.core.metamodel.facets.all.i8n.staatic.HasStaticText;
+import org.apache.isis.core.metamodel.facets.all.i8n.staatic.HasStaticTextFacetAbstract;
+
+import lombok.Getter;
+
+/**
+ * One of two bases for the {@link MemberDescribedFacet}.
+ *
+ * @see MemberDescribedFacetWithImperativeTextAbstract
+ * @since 2.0
+ */
+public abstract class MemberDescribedFacetWithStaticTextAbstract
+extends HasStaticTextFacetAbstract
+implements MemberDescribedFacet {
+
+    private static final Class<? extends Facet> type() {
+        return MemberDescribedFacet.class;
+    }
+
+    @Getter(onMethod_ = {@Override})
+    private final _Either<HasStaticText, HasImperativeText> specialization = _Either.left(this);
+
+    protected MemberDescribedFacetWithStaticTextAbstract(
+            final String originalText,
+            final FacetHolder holder) {
+        this(
+                originalText,
+                holder,
+                Precedence.DEFAULT);
+    }
+
+    protected MemberDescribedFacetWithStaticTextAbstract(
+            final String originalText,
+            final FacetHolder holder,
+            final Precedence precedence) {
+        super(type(),
+                TranslationContext.forTranslationContextHolder(holder.getFeatureIdentifier()),
+                originalText,
+                holder,
+                precedence);
+    }
+
+}
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/all/described/DescribedAsFacet.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/all/described/ObjectDescribedFacet.java
similarity index 68%
copy from core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/all/described/DescribedAsFacet.java
copy to core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/all/described/ObjectDescribedFacet.java
index 7b813eb..e20331a 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/all/described/DescribedAsFacet.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/all/described/ObjectDescribedFacet.java
@@ -16,25 +16,14 @@
  *  specific language governing permissions and limitations
  *  under the License.
  */
-
 package org.apache.isis.core.metamodel.facets.all.described;
 
-import org.apache.isis.commons.internal.base._Either;
 import org.apache.isis.core.metamodel.facetapi.Facet;
-import org.apache.isis.core.metamodel.facets.all.i8n.imperative.HasImperativeText;
 import org.apache.isis.core.metamodel.facets.all.i8n.staatic.HasStaticText;
 
-/**
- * Describes a class, a property, collection, an action or an action parameter.
- *
- * <p>
- * In the standard Apache Isis Programming Model, corresponds to annotating the
- * member with <tt>@DescribedAs</tt>.
- */
-public interface DescribedAsFacet
+public interface ObjectDescribedFacet
 extends
-    Facet {
-
-    _Either<HasStaticText, HasImperativeText> getSpecialization();
+    Facet,
+    HasStaticText {
 
 }
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/all/described/DescribedAsFacet.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/all/described/ObjectDescribedFacetAbstract.java
similarity index 58%
copy from core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/all/described/DescribedAsFacet.java
copy to core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/all/described/ObjectDescribedFacetAbstract.java
index 7b813eb..8763b08 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/all/described/DescribedAsFacet.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/all/described/ObjectDescribedFacetAbstract.java
@@ -16,25 +16,32 @@
  *  specific language governing permissions and limitations
  *  under the License.
  */
-
 package org.apache.isis.core.metamodel.facets.all.described;
 
-import org.apache.isis.commons.internal.base._Either;
+import org.apache.isis.applib.services.i18n.TranslationContext;
 import org.apache.isis.core.metamodel.facetapi.Facet;
-import org.apache.isis.core.metamodel.facets.all.i8n.imperative.HasImperativeText;
-import org.apache.isis.core.metamodel.facets.all.i8n.staatic.HasStaticText;
+import org.apache.isis.core.metamodel.facetapi.FacetHolder;
+import org.apache.isis.core.metamodel.facets.all.i8n.staatic.HasStaticTextFacetAbstract;
 
 /**
- * Describes a class, a property, collection, an action or an action parameter.
- *
- * <p>
- * In the standard Apache Isis Programming Model, corresponds to annotating the
- * member with <tt>@DescribedAs</tt>.
+ * The base for the {@link ObjectDescribedFacet}.
+ * @since 2.0
  */
-public interface DescribedAsFacet
-extends
-    Facet {
+public class ObjectDescribedFacetAbstract
+extends HasStaticTextFacetAbstract
+implements ObjectDescribedFacet {
+
+    private static final Class<? extends Facet> type() {
+        return ObjectDescribedFacet.class;
+    }
 
-    _Either<HasStaticText, HasImperativeText> getSpecialization();
+    protected ObjectDescribedFacetAbstract(
+            final String originalText,
+            final FacetHolder holder) {
+        super(type(),
+                TranslationContext.forTranslationContextHolder(holder.getFeatureIdentifier()),
+                originalText,
+                holder);
+    }
 
 }
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/all/described/DescribedAsFacet.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/all/described/ParamDescribedFacet.java
similarity index 68%
copy from core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/all/described/DescribedAsFacet.java
copy to core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/all/described/ParamDescribedFacet.java
index 7b813eb..c063469 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/all/described/DescribedAsFacet.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/all/described/ParamDescribedFacet.java
@@ -16,25 +16,17 @@
  *  specific language governing permissions and limitations
  *  under the License.
  */
-
 package org.apache.isis.core.metamodel.facets.all.described;
 
-import org.apache.isis.commons.internal.base._Either;
 import org.apache.isis.core.metamodel.facetapi.Facet;
-import org.apache.isis.core.metamodel.facets.all.i8n.imperative.HasImperativeText;
 import org.apache.isis.core.metamodel.facets.all.i8n.staatic.HasStaticText;
 
-/**
- * Describes a class, a property, collection, an action or an action parameter.
- *
- * <p>
- * In the standard Apache Isis Programming Model, corresponds to annotating the
- * member with <tt>@DescribedAs</tt>.
- */
-public interface DescribedAsFacet
+public interface ParamDescribedFacet
 extends
-    Facet {
+    Facet,
+    HasStaticText {
 
-    _Either<HasStaticText, HasImperativeText> getSpecialization();
+    // not yet - future extension
+    //_Either<HasStaticText, HasImperativeText> getSpecialization();
 
 }
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/all/described/DescribedAsFacetAbstract.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/all/described/ParamDescribedFacetAbstract.java
similarity index 56%
rename from core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/all/described/DescribedAsFacetAbstract.java
rename to core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/all/described/ParamDescribedFacetAbstract.java
index d9d508e..f3e737c 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/all/described/DescribedAsFacetAbstract.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/all/described/ParamDescribedFacetAbstract.java
@@ -16,56 +16,44 @@
  *  specific language governing permissions and limitations
  *  under the License.
  */
-
 package org.apache.isis.core.metamodel.facets.all.described;
 
-import org.apache.isis.commons.internal.base._Either;
+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.imperative.HasImperativeText;
-import org.apache.isis.core.metamodel.facets.all.i8n.staatic.HasStaticText;
-import org.apache.isis.core.metamodel.facets.all.i8n.staatic.I8nStaticFacetAbstract;
-import org.apache.isis.core.metamodel.facets.all.i8n.staatic.NounForms;
-
-import lombok.Getter;
+import org.apache.isis.core.metamodel.facets.all.i8n.staatic.HasStaticTextFacetAbstract;
 
-public abstract class DescribedAsFacetAbstract
-extends I8nStaticFacetAbstract
-implements DescribedAsFacet {
+/**
+ * The base for the {@link ParamDescribedFacet}.
+ * @since 2.0
+ */
+public class ParamDescribedFacetAbstract
+extends HasStaticTextFacetAbstract
+implements ParamDescribedFacet {
 
     private static final Class<? extends Facet> type() {
-        return DescribedAsFacet.class;
+        return ParamDescribedFacet.class;
     }
 
-    @Getter(onMethod_ = {@Override})
-    private final _Either<HasStaticText, HasImperativeText> specialization = _Either.left(this);
-
-    protected DescribedAsFacetAbstract(
+    protected ParamDescribedFacetAbstract(
             final String originalText,
             final FacetHolder holder) {
-        this(originalText, holder, Precedence.DEFAULT);
+        this(
+                originalText,
+                holder,
+                Precedence.DEFAULT);
     }
 
-    protected DescribedAsFacetAbstract(
+    protected ParamDescribedFacetAbstract(
             final String originalText,
             final FacetHolder holder,
-            final Facet.Precedence precedence) {
+            final Precedence precedence) {
         super(type(),
-                NounForms
-                    .preferredIndifferent(originalText)
-                    .build(),
+                TranslationContext.forTranslationContextHolder(holder.getFeatureIdentifier()),
+                originalText,
                 holder,
                 precedence);
     }
 
-    public final String text() {
-        return preferredText();
-    }
-
-    public final String translated() {
-        return preferredTranslated();
-    }
-
 
 }
-
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/fallback/DescribedAsFacetNone.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/all/i8n/HasMemoizableTranslation.java
similarity index 60%
rename from core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/fallback/DescribedAsFacetNone.java
rename to core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/all/i8n/HasMemoizableTranslation.java
index 88d3f23..113323d 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/fallback/DescribedAsFacetNone.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/all/i8n/HasMemoizableTranslation.java
@@ -16,22 +16,10 @@
  *  specific language governing permissions and limitations
  *  under the License.
  */
+package org.apache.isis.core.metamodel.facets.all.i8n;
 
-package org.apache.isis.core.metamodel.facets.fallback;
+public interface HasMemoizableTranslation {
 
-import org.apache.isis.core.metamodel.facetapi.FacetHolder;
-import org.apache.isis.core.metamodel.facetapi.HasSemanticEqualityByClass;
-import org.apache.isis.core.metamodel.facets.all.described.DescribedAsFacetAbstract;
-
-/**
- * Has a description of the empty string.
- */
-public class DescribedAsFacetNone
-extends DescribedAsFacetAbstract
-implements HasSemanticEqualityByClass {
-
-    public DescribedAsFacetNone(final FacetHolder holder) {
-        super("", holder, Precedence.FALLBACK);
-    }
+    void memoizeTranslations();
 
 }
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/all/i8n/imperative/HasImperativeText.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/all/i8n/imperative/HasImperativeText.java
index 3016c20..bd86ffa 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/all/i8n/imperative/HasImperativeText.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/all/i8n/imperative/HasImperativeText.java
@@ -41,4 +41,13 @@ public interface HasImperativeText {
         return text(object).optionalElseFail().orElse(null);
     }
 
+    /**
+     * Flag indicating whether the label should be show as is, or should be HTML escaped.
+     * @deprecated - never bypass escaping
+     */
+    @Deprecated
+    default boolean escaped() {
+        return true;
+    }
+
 }
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/all/i8n/imperative/I8nImperativeFacetAbstract.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/all/i8n/imperative/HasImperativeTextFacetAbstract.java
similarity index 87%
copy from core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/all/i8n/imperative/I8nImperativeFacetAbstract.java
copy to core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/all/i8n/imperative/HasImperativeTextFacetAbstract.java
index 8e05beb..599ae1b 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/all/i8n/imperative/I8nImperativeFacetAbstract.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/all/i8n/imperative/HasImperativeTextFacetAbstract.java
@@ -35,7 +35,7 @@ import org.apache.isis.core.metamodel.spec.ManagedObjects;
 import lombok.NonNull;
 import lombok.val;
 
-public class I8nImperativeFacetAbstract
+public class HasImperativeTextFacetAbstract
 extends FacetAbstract
 implements
     ImperativeFacet,
@@ -44,14 +44,15 @@ implements
     protected final TranslationContext translationContext;
     protected final @NonNull Method method;
 
-    protected I8nImperativeFacetAbstract(
+    protected HasImperativeTextFacetAbstract(
             final Class<? extends Facet> facetType,
+            final TranslationContext translationContext, //TranslationContext.forTranslationContextHolder(holder.getFeatureIdentifier());
             final Method method,
             final FacetHolder holder) {
+        // imperative takes precedence over any other (except for events)
         super(facetType, holder, Precedence.HIGH);
         this.method = method;
-        this.translationContext = TranslationContext
-                .forTranslationContextHolder(holder.getFeatureIdentifier());
+        this.translationContext = translationContext;
     }
 
     @Override
@@ -85,7 +86,7 @@ implements
             return false;
         }
 
-        val otherFacet = (I8nImperativeFacetAbstract)other;
+        val otherFacet = (HasImperativeTextFacetAbstract)other;
 
         return Objects.equals(this.method, otherFacet.method)
                 && Objects.equals(this.translationContext, otherFacet.translationContext);
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/all/i8n/noun/HasNoun.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/all/i8n/noun/HasNoun.java
new file mode 100644
index 0000000..bbfa934
--- /dev/null
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/all/i8n/noun/HasNoun.java
@@ -0,0 +1,72 @@
+/*
+ *  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.all.i8n.noun;
+
+import javax.annotation.Nullable;
+
+import org.apache.isis.commons.collections.ImmutableEnumSet;
+import org.apache.isis.core.metamodel.facets.all.i8n.HasMemoizableTranslation;
+
+public interface HasNoun
+extends HasMemoizableTranslation {
+
+    /**
+     * Originating text of preferred NounForm to be translated before use in the UI.
+     */
+    String preferredText();
+
+    /**
+     * Translated text of preferred NounForm to be used in the UI.
+     */
+    String preferredTranslated();
+
+    /**
+     * Originating text to be translated before use in the UI.
+     */
+    String text(NounForm nounForm);
+
+    /**
+     * Translated text to be used in the UI.
+     */
+    String translated(NounForm nounForm);
+
+    ImmutableEnumSet<NounForm> getSupportedNounForms();
+
+    @Nullable
+    default String translatedElseNull(final NounForm nounForm) {
+        return getSupportedNounForms().contains(nounForm)
+                ? translated(nounForm)
+                : null;
+    }
+
+    @Override
+    default void memoizeTranslations() {
+        getSupportedNounForms().forEach(this::translated);
+    }
+
+    /**
+     * Flag indicating whether the label should be show as is, or should be HTML escaped.
+     * @deprecated - never bypass escaping
+     */
+    @Deprecated
+    default boolean escaped() {
+        return true;
+    }
+
+}
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/all/i8n/staatic/I8nStaticFacetAbstract.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/all/i8n/noun/HasNounFacetAbstract.java
similarity index 68%
rename from core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/all/i8n/staatic/I8nStaticFacetAbstract.java
rename to core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/all/i8n/noun/HasNounFacetAbstract.java
index fe9b6f3..bcd2d42 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/all/i8n/staatic/I8nStaticFacetAbstract.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/all/i8n/noun/HasNounFacetAbstract.java
@@ -1,4 +1,22 @@
-package org.apache.isis.core.metamodel.facets.all.i8n.staatic;
+/*
+ *  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.all.i8n.noun;
 
 import java.util.Objects;
 import java.util.function.BiConsumer;
@@ -14,31 +32,32 @@ import org.apache.isis.core.metamodel.facetapi.FacetHolder;
 import lombok.NonNull;
 import lombok.val;
 
-public abstract class I8nStaticFacetAbstract
+public abstract class HasNounFacetAbstract
 extends FacetAbstract
-implements HasStaticText {
+implements HasNoun {
 
     protected final TranslationContext translationContext;
 
     private final @NonNull NounForms nounForms;
     private final @NonNull _Lazy<NounForms> translatedNounForms;
 
-    protected I8nStaticFacetAbstract(
+    protected HasNounFacetAbstract(
             final Class<? extends Facet> facetType,
+            final TranslationContext translationContext,
             final NounForms nounForms,
             final FacetHolder holder) {
-        this(facetType, nounForms, holder, Precedence.DEFAULT);
+        this(facetType, translationContext, nounForms, holder, Precedence.DEFAULT);
     }
 
-    protected I8nStaticFacetAbstract(
+    protected HasNounFacetAbstract(
             final Class<? extends Facet> facetType,
+            final TranslationContext translationContext,
             final NounForms nounForms,
             final FacetHolder holder,
             final Precedence precedence) {
         super(facetType, holder, precedence);
         this.nounForms = nounForms;
-        this.translationContext = TranslationContext
-                .forTranslationContextHolder(holder.getFeatureIdentifier());
+        this.translationContext = translationContext;
         this.translatedNounForms = _Lazy.threadSafe(()->
             nounForms.translate(holder.getTranslationService(), translationContext));
     }
@@ -94,7 +113,7 @@ implements HasStaticText {
             return false;
         }
 
-        val otherFacet =  (I8nStaticFacetAbstract)other;
+        val otherFacet =  (HasNounFacetAbstract)other;
 
         return Objects.equals(this.nounForms, otherFacet.nounForms)
                 && Objects.equals(this.translationContext, otherFacet.translationContext);
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/all/i8n/staatic/NounForm.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/all/i8n/noun/NounForm.java
similarity index 68%
rename from core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/all/i8n/staatic/NounForm.java
rename to core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/all/i8n/noun/NounForm.java
index d112750..e4b49eb 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/all/i8n/staatic/NounForm.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/all/i8n/noun/NounForm.java
@@ -16,9 +16,7 @@
  *  specific language governing permissions and limitations
  *  under the License.
  */
-package org.apache.isis.core.metamodel.facets.all.i8n.staatic;
-
-import org.apache.isis.core.metamodel.facets.all.described.DescribedAsFacet;
+package org.apache.isis.core.metamodel.facets.all.i8n.noun;
 
 /**
  * Represents various linguistic forms, based on <i>cardinality</i>.
@@ -27,18 +25,6 @@ import org.apache.isis.core.metamodel.facets.all.described.DescribedAsFacet;
 public enum NounForm {
 
     /**
-     * Use, if there is no semantic difference between EMPTY, SINGULAR or PLURAL.
-     * eg. {@link DescribedAsFacet}
-     */
-    INDIFFERENT,
-
-    /**
-     * Represents the absence of a scalar or non-scalar object.
-     * @apiNote for future use (not yet implemented)
-     */
-    EMPTY,
-
-    /**
      * Represents the singular linguistic form.
      */
     SINGULAR,
@@ -49,14 +35,6 @@ public enum NounForm {
     PLURAL
     ;
 
-    public boolean isIndifferent() {
-        return this == INDIFFERENT;
-    }
-
-    public boolean isEmpty() {
-        return this == EMPTY;
-    }
-
     public boolean isSingular() {
         return this == SINGULAR;
     }
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/all/i8n/staatic/NounForms.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/all/i8n/noun/NounForms.java
similarity index 79%
rename from core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/all/i8n/staatic/NounForms.java
rename to core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/all/i8n/noun/NounForms.java
index 2892172..bb7861e 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/all/i8n/staatic/NounForms.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/all/i8n/noun/NounForms.java
@@ -16,7 +16,7 @@
  *  specific language governing permissions and limitations
  *  under the License.
  */
-package org.apache.isis.core.metamodel.facets.all.i8n.staatic;
+package org.apache.isis.core.metamodel.facets.all.i8n.noun;
 
 import java.util.EnumSet;
 
@@ -40,12 +40,6 @@ import lombok.val;
 @Value @Builder
 public class NounForms {
 
-    public static NounFormsBuilder preferredIndifferent(@Nullable final String indifferent) {
-        return NounForms.builder()
-                .preferredNounForm(NounForm.INDIFFERENT)
-                .indifferent(indifferent);
-    }
-
     public static NounFormsBuilder preferredSingular(@Nullable final String singular) {
         return NounForms.builder()
                 .preferredNounForm(NounForm.SINGULAR)
@@ -58,8 +52,6 @@ public class NounForms {
                 .plural(plural);
     }
 
-    private final @Nullable String indifferent;
-    private final @Nullable String empty;
     private final @Nullable String singular;
     private final @Nullable String plural;
 
@@ -72,14 +64,6 @@ public class NounForms {
 
         val supportedNounForms = EnumSet.noneOf(NounForm.class);
 
-        if(indifferent!=null) {
-            supportedNounForms.add(NounForm.INDIFFERENT);
-        }
-
-        if(empty!=null) {
-            supportedNounForms.add(NounForm.EMPTY);
-        }
-
         if(singular!=null) {
             supportedNounForms.add(NounForm.SINGULAR);
         }
@@ -96,10 +80,6 @@ public class NounForms {
             throw _Exceptions.illegalArgument("NounForm %s not supported with this instance", nounForm);
         };
         switch(nounForm) {
-        case INDIFFERENT:
-            return getIndifferent();
-        case EMPTY:
-            return getEmpty();
         case SINGULAR:
             return getSingular();
         case PLURAL:
@@ -123,12 +103,6 @@ public class NounForms {
         .forEach(nounForm->{
 
             switch(nounForm) {
-            case INDIFFERENT:
-                builder.indifferent(translationService.translate(context, indifferent));
-                break;
-            case EMPTY:
-                builder.empty(translationService.translate(context, empty));
-                break;
             case SINGULAR:
                 builder.singular(translationService.translate(context, singular));
                 break;
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/all/i8n/staatic/HasStaticText.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/all/i8n/staatic/HasStaticText.java
index a730312..b4a2654 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/all/i8n/staatic/HasStaticText.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/all/i8n/staatic/HasStaticText.java
@@ -1,42 +1,49 @@
+/*
+ *  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.all.i8n.staatic;
 
-import javax.annotation.Nullable;
+import org.apache.isis.core.metamodel.facets.all.i8n.HasMemoizableTranslation;
 
-import org.apache.isis.commons.collections.ImmutableEnumSet;
-
-public interface HasStaticText {
-
-    /**
-     * Originating text of preferred NounForm to be translated before use in the UI.
-     */
-    String preferredText();
-
-    /**
-     * Translated text of preferred NounForm to be used in the UI.
-     */
-    String preferredTranslated();
+public interface HasStaticText
+extends HasMemoizableTranslation {
 
     /**
      * Originating text to be translated before use in the UI.
      */
-    String text(NounForm nounForm);
+    String text();
 
     /**
      * Translated text to be used in the UI.
      */
-    String translated(NounForm nounForm);
-
-    ImmutableEnumSet<NounForm> getSupportedNounForms();
-
-    @Nullable
-    default String translatedElseNull(final NounForm nounForm) {
-        return getSupportedNounForms().contains(nounForm)
-                ? translated(nounForm)
-                : null;
-    }
+    String translated();
 
+    @Override
     default void memoizeTranslations() {
-        getSupportedNounForms().forEach(this::translated);
+        translated();
     }
 
+    /**
+     * Flag indicating whether the label should be show as is, or should be HTML escaped.
+     * @deprecated - never bypass escaping
+     */
+    @Deprecated
+    default boolean escaped() {
+        return true;
+    }
 }
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/all/i8n/imperative/I8nImperativeFacetAbstract.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/all/i8n/staatic/HasStaticTextFacetAbstract.java
similarity index 50%
rename from core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/all/i8n/imperative/I8nImperativeFacetAbstract.java
rename to core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/all/i8n/staatic/HasStaticTextFacetAbstract.java
index 8e05beb..5536a45 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/all/i8n/imperative/I8nImperativeFacetAbstract.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/all/i8n/staatic/HasStaticTextFacetAbstract.java
@@ -16,78 +16,80 @@
  *  specific language governing permissions and limitations
  *  under the License.
  */
-package org.apache.isis.core.metamodel.facets.all.i8n.imperative;
+package org.apache.isis.core.metamodel.facets.all.i8n.staatic;
 
-import java.lang.reflect.Method;
 import java.util.Objects;
 import java.util.function.BiConsumer;
 
 import org.apache.isis.applib.services.i18n.TranslationContext;
-import org.apache.isis.commons.collections.Can;
-import org.apache.isis.commons.functional.Result;
+import org.apache.isis.commons.internal.base._Lazy;
 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.facets.ImperativeFacet;
-import org.apache.isis.core.metamodel.spec.ManagedObject;
-import org.apache.isis.core.metamodel.spec.ManagedObjects;
 
 import lombok.NonNull;
 import lombok.val;
 
-public class I8nImperativeFacetAbstract
+public abstract class HasStaticTextFacetAbstract
 extends FacetAbstract
-implements
-    ImperativeFacet,
-    HasImperativeText {
+implements HasStaticText {
 
     protected final TranslationContext translationContext;
-    protected final @NonNull Method method;
 
-    protected I8nImperativeFacetAbstract(
+    private final @NonNull String originalText;
+    private final @NonNull _Lazy<String> translatedText;
+
+    protected HasStaticTextFacetAbstract(
             final Class<? extends Facet> facetType,
-            final Method method,
+            final TranslationContext translationContext,
+            final String originalText,
             final FacetHolder holder) {
-        super(facetType, holder, Precedence.HIGH);
-        this.method = method;
-        this.translationContext = TranslationContext
-                .forTranslationContextHolder(holder.getFeatureIdentifier());
+        this(facetType, translationContext, originalText, holder, Precedence.DEFAULT);
     }
 
-    @Override
-    public final Result<String> text(final ManagedObject object) {
-        return ManagedObjects.imperativeText(object, method, translationContext);
+    protected HasStaticTextFacetAbstract(
+            final Class<? extends Facet> facetType,
+            final TranslationContext translationContext,
+            final String originalText,
+            final FacetHolder holder,
+            final Precedence precedence) {
+        super(facetType, holder, precedence);
+        this.originalText = originalText;
+        this.translationContext = translationContext;
+        this.translatedText = _Lazy.threadSafe(()->
+            holder.getTranslationService().translate(translationContext, originalText));
     }
 
     @Override
-    public final Can<Method> getMethods() {
-        return Can.ofSingleton(method);
+    public final String text() {
+        return originalText;
     }
 
     @Override
-    public final Intent getIntent(final Method method) {
-        return Intent.UI_HINT;
+    public final String translated() {
+        return translatedText.get();
     }
 
     @Override
-    public final void visitAttributes(final BiConsumer<String, Object> visitor) {
+    public void visitAttributes(final BiConsumer<String, Object> visitor) {
         super.visitAttributes(visitor);
         visitor.accept("context", translationContext);
-        ImperativeFacet.visitAttributes(this, visitor);
+        visitor.accept("originalText", text());
+        visitor.accept("translated", translated()); // memoizes as a side-effect
     }
 
     @Override
-    public final boolean semanticEquals(final @NonNull Facet other) {
+    public boolean semanticEquals(final @NonNull Facet other) {
 
-        // equality by facet-type, java-method and translation-context
+        // equality by facet-type, (original) text and translation-context
 
         if(!this.facetType().equals(other.facetType())) {
             return false;
         }
 
-        val otherFacet = (I8nImperativeFacetAbstract)other;
+        val otherFacet =  (HasStaticTextFacetAbstract)other;
 
-        return Objects.equals(this.method, otherFacet.method)
+        return Objects.equals(this.originalText, otherFacet.originalText)
                 && Objects.equals(this.translationContext, otherFacet.translationContext);
 
     }
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/all/described/DescribedAsFacet.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/all/named/MemberNamedFacet.java
similarity index 79%
rename from core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/all/described/DescribedAsFacet.java
rename to core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/all/named/MemberNamedFacet.java
index 7b813eb..776986a 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/all/described/DescribedAsFacet.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/all/named/MemberNamedFacet.java
@@ -16,25 +16,17 @@
  *  specific language governing permissions and limitations
  *  under the License.
  */
-
-package org.apache.isis.core.metamodel.facets.all.described;
+package org.apache.isis.core.metamodel.facets.all.named;
 
 import org.apache.isis.commons.internal.base._Either;
 import org.apache.isis.core.metamodel.facetapi.Facet;
 import org.apache.isis.core.metamodel.facets.all.i8n.imperative.HasImperativeText;
 import org.apache.isis.core.metamodel.facets.all.i8n.staatic.HasStaticText;
 
-/**
- * Describes a class, a property, collection, an action or an action parameter.
- *
- * <p>
- * In the standard Apache Isis Programming Model, corresponds to annotating the
- * member with <tt>@DescribedAs</tt>.
- */
-public interface DescribedAsFacet
+public interface MemberNamedFacet
 extends
     Facet {
 
     _Either<HasStaticText, HasImperativeText> getSpecialization();
 
-}
+}
\ No newline at end of file
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/all/named/NamedFacetForMemberName.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/all/named/MemberNamedFacetForStaticMemberName.java
similarity index 71%
rename from core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/all/named/NamedFacetForMemberName.java
rename to core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/all/named/MemberNamedFacetForStaticMemberName.java
index 8ae3e8c..17c2e18 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/all/named/NamedFacetForMemberName.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/all/named/MemberNamedFacetForStaticMemberName.java
@@ -20,18 +20,21 @@
 package org.apache.isis.core.metamodel.facets.all.named;
 
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
-import org.apache.isis.core.metamodel.facets.all.i8n.staatic.NounForm;
 
-import lombok.NonNull;
+public class MemberNamedFacetForStaticMemberName
+extends MemberNamedFacetWithStaticTextAbstract {
 
-public class NamedFacetForMemberName
-extends NamedFacetForMemberNameAbstract {
-
-    public NamedFacetForMemberName(
-            final @NonNull NounForm preferredNounForm,
+    public MemberNamedFacetForStaticMemberName(
             final String memberName,
             final FacetHolder holder) {
-        super(preferredNounForm, memberName, holder, Precedence.DEFAULT);
+        super(memberName, holder, Precedence.DEFAULT);
+    }
+
+    public MemberNamedFacetForStaticMemberName(
+            final String memberName,
+            final FacetHolder holder,
+            final Precedence precedence) {
+        super(memberName, holder, precedence);
     }
 
 }
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/members/named/method/NamedFacetForMemberViaMethod.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/all/named/MemberNamedFacetWithImperativeTextAbstract.java
similarity index 68%
copy from core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/members/named/method/NamedFacetForMemberViaMethod.java
copy to core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/all/named/MemberNamedFacetWithImperativeTextAbstract.java
index ffc5e92..7b757fe 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/members/named/method/NamedFacetForMemberViaMethod.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/all/named/MemberNamedFacetWithImperativeTextAbstract.java
@@ -16,41 +16,44 @@
  *  specific language governing permissions and limitations
  *  under the License.
  */
-package org.apache.isis.core.metamodel.facets.members.named.method;
+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.internal.base._Either;
 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.imperative.HasImperativeText;
-import org.apache.isis.core.metamodel.facets.all.i8n.imperative.I8nImperativeFacetAbstract;
+import org.apache.isis.core.metamodel.facets.all.i8n.imperative.HasImperativeTextFacetAbstract;
 import org.apache.isis.core.metamodel.facets.all.i8n.staatic.HasStaticText;
-import org.apache.isis.core.metamodel.facets.all.named.NamedFacet;
 
 import lombok.Getter;
 
-public class NamedFacetForMemberViaMethod
-extends I8nImperativeFacetAbstract
-implements NamedFacet {
+/**
+ * One of two bases for the {@link MemberNamedFacet}.
+ *
+ * @see MemberNamedFacetWithStaticTextAbstract
+ * @since 2.0
+ */
+public abstract class MemberNamedFacetWithImperativeTextAbstract
+extends HasImperativeTextFacetAbstract
+implements MemberNamedFacet {
 
     private static final Class<? extends Facet> type() {
-        return NamedFacet.class;
+        return MemberNamedFacet.class;
     }
 
     @Getter(onMethod_ = {@Override})
     private final _Either<HasStaticText, HasImperativeText> specialization = _Either.right(this);
 
-    public NamedFacetForMemberViaMethod(
-            final Method namedMethod,
+    protected MemberNamedFacetWithImperativeTextAbstract(
+            final Method method,
             final FacetHolder holder) {
-        super(type(), namedMethod, holder);
+        super(type(),
+                TranslationContext.forTranslationContextHolder(holder.getFeatureIdentifier()),
+                method,
+                holder);
     }
 
-    @Override
-    public boolean escaped() {
-        return true; // dynamic names are always escaped
-    }
-
-
 }
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
new file mode 100644
index 0000000..b59d0f6
--- /dev/null
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/all/named/MemberNamedFacetWithStaticTextAbstract.java
@@ -0,0 +1,50 @@
+package org.apache.isis.core.metamodel.facets.all.named;
+
+import org.apache.isis.applib.services.i18n.TranslationContext;
+import org.apache.isis.commons.internal.base._Either;
+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.imperative.HasImperativeText;
+import org.apache.isis.core.metamodel.facets.all.i8n.staatic.HasStaticText;
+import org.apache.isis.core.metamodel.facets.all.i8n.staatic.HasStaticTextFacetAbstract;
+
+import lombok.Getter;
+
+/**
+ * One of two bases for the {@link MemberNamedFacet}.
+ *
+ * @see MemberNamedFacetWithImperativeTextAbstract
+ * @since 2.0
+ */
+public abstract class MemberNamedFacetWithStaticTextAbstract
+extends HasStaticTextFacetAbstract
+implements MemberNamedFacet {
+
+    private static final Class<? extends Facet> type() {
+        return MemberNamedFacet.class;
+    }
+
+    @Getter(onMethod_ = {@Override})
+    private final _Either<HasStaticText, HasImperativeText> specialization = _Either.left(this);
+
+    protected MemberNamedFacetWithStaticTextAbstract(
+            final String originalText,
+            final FacetHolder holder) {
+        this(
+                originalText,
+                holder,
+                Precedence.DEFAULT);
+    }
+
+    protected MemberNamedFacetWithStaticTextAbstract(
+            final String originalText,
+            final FacetHolder holder,
+            final Precedence precedence) {
+        super(type(),
+                TranslationContext.forTranslationContextHolder(holder.getFeatureIdentifier()),
+                originalText,
+                holder,
+                precedence);
+    }
+
+}
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/all/named/NamedFacet.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/all/named/NamedFacet.java
index 0ac7a8f..d28fb9d 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/all/named/NamedFacet.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/all/named/NamedFacet.java
@@ -22,7 +22,7 @@ package org.apache.isis.core.metamodel.facets.all.named;
 import org.apache.isis.commons.internal.base._Either;
 import org.apache.isis.core.metamodel.facetapi.Facet;
 import org.apache.isis.core.metamodel.facets.all.i8n.imperative.HasImperativeText;
-import org.apache.isis.core.metamodel.facets.all.i8n.staatic.HasStaticText;
+import org.apache.isis.core.metamodel.facets.all.i8n.noun.HasNoun;
 
 /**
  * The name of a class, a property, collection, an action or a parameter.
@@ -31,11 +31,12 @@ import org.apache.isis.core.metamodel.facets.all.i8n.staatic.HasStaticText;
  * In the standard Apache Isis Programming Model, corresponds to annotating the
  * member with <tt>@Named</tt>.
  */
+@Deprecated
 public interface NamedFacet
 extends
     Facet {
 
-    _Either<HasStaticText, HasImperativeText> getSpecialization();
+    _Either<HasNoun, HasImperativeText> getSpecialization();
 
     /**
      * Flag indicating whether the label should be show as is, or should be HTML escaped.
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/all/named/NamedFacetAbstract.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/all/named/NamedFacetAbstract.java
deleted file mode 100644
index e3045a9..0000000
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/all/named/NamedFacetAbstract.java
+++ /dev/null
@@ -1,88 +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.all.named;
-
-import java.util.function.BiConsumer;
-
-import org.apache.isis.commons.internal.base._Either;
-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.imperative.HasImperativeText;
-import org.apache.isis.core.metamodel.facets.all.i8n.staatic.HasStaticText;
-import org.apache.isis.core.metamodel.facets.all.i8n.staatic.I8nStaticFacetAbstract;
-import org.apache.isis.core.metamodel.facets.all.i8n.staatic.NounForms;
-
-import lombok.Getter;
-import lombok.NonNull;
-import lombok.val;
-
-public abstract class NamedFacetAbstract
-extends I8nStaticFacetAbstract
-implements NamedFacet {
-
-    private static final Class<? extends Facet> type() {
-        return NamedFacet.class;
-    }
-
-    @Getter(onMethod_ = {@Override})
-    private final _Either<HasStaticText, HasImperativeText> specialization = _Either.left(this);
-
-    private final boolean escaped;
-
-    protected NamedFacetAbstract(
-            final NounForms namedNounForms,
-            final boolean escaped,
-            final FacetHolder holder) {
-        this(namedNounForms, escaped, holder, Precedence.DEFAULT);
-    }
-
-    protected NamedFacetAbstract(
-            final NounForms namedNounForms,
-            final boolean escaped,
-            final FacetHolder holder,
-            final Facet.Precedence precedence) {
-        super(type(), namedNounForms, holder, precedence);
-        this.escaped = escaped;
-    }
-
-    @Override
-    public boolean escaped() {
-        return escaped;
-    }
-
-    @Override
-    public void visitAttributes(final BiConsumer<String, Object> visitor) {
-        super.visitAttributes(visitor);
-        visitor.accept("escaped", escaped);
-    }
-
-    @Override
-    public boolean semanticEquals(final @NonNull Facet other) {
-        if(! (other instanceof NamedFacetAbstract)) {
-            return false;
-        }
-
-        val otherNamedFacet = (NamedFacetAbstract)other;
-
-        return this.escaped() == otherNamedFacet.escaped()
-                && super.semanticEquals(otherNamedFacet);
-    }
-
-}
diff --git a/api/applib/src/main/java/org/apache/isis/applib/layout/component/HasNamed.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/all/named/ObjectNamedFacet.java
similarity index 67%
copy from api/applib/src/main/java/org/apache/isis/applib/layout/component/HasNamed.java
copy to core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/all/named/ObjectNamedFacet.java
index 8567b2f..a57b4fb 100644
--- a/api/applib/src/main/java/org/apache/isis/applib/layout/component/HasNamed.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/all/named/ObjectNamedFacet.java
@@ -16,22 +16,14 @@
  *  specific language governing permissions and limitations
  *  under the License.
  */
-package org.apache.isis.applib.layout.component;
+package org.apache.isis.core.metamodel.facets.all.named;
 
-import javax.xml.bind.annotation.XmlAttribute;
-import javax.xml.bind.annotation.XmlElement;
+import org.apache.isis.core.metamodel.facetapi.Facet;
+import org.apache.isis.core.metamodel.facets.all.i8n.noun.HasNoun;
 
-/**
- * @since 1.x {@index}
- */
-public interface HasNamed {
-
-    @XmlElement(required = false)
-    String getNamed();
-    void setNamed(String named);
-
-    @XmlAttribute(required = false)
-    Boolean getNamedEscaped();
-    void setNamedEscaped(Boolean namedEscaped);
+public interface ObjectNamedFacet
+extends
+    Facet,
+    HasNoun {
 
 }
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/all/named/NamedFacetForMemberNameAbstract.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/all/named/ObjectNamedFacetAbstract.java
similarity index 52%
rename from core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/all/named/NamedFacetForMemberNameAbstract.java
rename to core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/all/named/ObjectNamedFacetAbstract.java
index a2f9e71..72bc2f1 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/all/named/NamedFacetForMemberNameAbstract.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/all/named/ObjectNamedFacetAbstract.java
@@ -16,39 +16,33 @@
  *  specific language governing permissions and limitations
  *  under the License.
  */
-
 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.NounForm;
-import org.apache.isis.core.metamodel.facets.all.i8n.staatic.NounForms;
-
-import lombok.NonNull;
-
-public abstract class NamedFacetForMemberNameAbstract
-extends NamedFacetAbstract {
+import org.apache.isis.core.metamodel.facets.all.i8n.noun.HasNounFacetAbstract;
+import org.apache.isis.core.metamodel.facets.all.i8n.noun.NounForms;
 
-    public static final boolean ESCAPED = true;
+/**
+ * The base for the {@link ObjectNamedFacet}.
+ * @since 2.0
+ */
+public class ObjectNamedFacetAbstract
+extends HasNounFacetAbstract
+implements ObjectNamedFacet {
 
-    protected NamedFacetForMemberNameAbstract(
-            final @NonNull NounForm preferredNounForm,
-            final String memberName,
-            final FacetHolder holder,
-            final Facet.Precedence precedence) {
-        super(
-                preferredNounForm.isSingular()
-                ? NounForms
-                        .preferredSingular(memberName)
-                        .build()
-                : NounForms
-                        .preferredPlural(memberName)
-                        .build()
-                ,
-                ESCAPED,
-                holder,
-                precedence);
+    private static final Class<? extends Facet> type() {
+        return ObjectNamedFacet.class;
     }
 
+    protected ObjectNamedFacetAbstract(
+            final NounForms nounForms,
+            final FacetHolder holder) {
+        super(type(),
+                TranslationContext.forTranslationContextHolder(holder.getFeatureIdentifier()),
+                nounForms,
+                holder);
+    }
 
 }
diff --git a/api/applib/src/main/java/org/apache/isis/applib/layout/component/HasNamed.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/all/named/ParamNamedFacet.java
similarity index 67%
copy from api/applib/src/main/java/org/apache/isis/applib/layout/component/HasNamed.java
copy to core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/all/named/ParamNamedFacet.java
index 8567b2f..908e930 100644
--- a/api/applib/src/main/java/org/apache/isis/applib/layout/component/HasNamed.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/all/named/ParamNamedFacet.java
@@ -16,22 +16,17 @@
  *  specific language governing permissions and limitations
  *  under the License.
  */
-package org.apache.isis.applib.layout.component;
+package org.apache.isis.core.metamodel.facets.all.named;
 
-import javax.xml.bind.annotation.XmlAttribute;
-import javax.xml.bind.annotation.XmlElement;
+import org.apache.isis.core.metamodel.facetapi.Facet;
+import org.apache.isis.core.metamodel.facets.all.i8n.staatic.HasStaticText;
 
-/**
- * @since 1.x {@index}
- */
-public interface HasNamed {
-
-    @XmlElement(required = false)
-    String getNamed();
-    void setNamed(String named);
+public interface ParamNamedFacet
+extends
+    Facet,
+    HasStaticText {
 
-    @XmlAttribute(required = false)
-    Boolean getNamedEscaped();
-    void setNamedEscaped(Boolean namedEscaped);
+    // not yet - future extension
+    //_Either<HasStaticText, HasImperativeText> getSpecialization();
 
 }
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/all/named/NamedFacet.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/all/named/ParamNamedFacetAbstract.java
similarity index 58%
copy from core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/all/named/NamedFacet.java
copy to core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/all/named/ParamNamedFacetAbstract.java
index 0ac7a8f..1f4dbbb 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/all/named/NamedFacet.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/all/named/ParamNamedFacetAbstract.java
@@ -16,29 +16,33 @@
  *  specific language governing permissions and limitations
  *  under the License.
  */
-
 package org.apache.isis.core.metamodel.facets.all.named;
 
-import org.apache.isis.commons.internal.base._Either;
+import org.apache.isis.applib.services.i18n.TranslationContext;
 import org.apache.isis.core.metamodel.facetapi.Facet;
-import org.apache.isis.core.metamodel.facets.all.i8n.imperative.HasImperativeText;
-import org.apache.isis.core.metamodel.facets.all.i8n.staatic.HasStaticText;
+import org.apache.isis.core.metamodel.facetapi.FacetHolder;
+import org.apache.isis.core.metamodel.facets.all.i8n.staatic.HasStaticTextFacetAbstract;
 
 /**
- * The name of a class, a property, collection, an action or a parameter.
- *
- * <p>
- * In the standard Apache Isis Programming Model, corresponds to annotating the
- * member with <tt>@Named</tt>.
+ * The base for the {@link ParamNamedFacet}.
+ * @since 2.0
  */
-public interface NamedFacet
-extends
-    Facet {
+public class ParamNamedFacetAbstract
+extends HasStaticTextFacetAbstract
+implements ParamNamedFacet {
+
+    private static final Class<? extends Facet> type() {
+        return ParamNamedFacet.class;
+    }
+
+    protected ParamNamedFacetAbstract(
+            final String originalText,
+            final FacetHolder holder) {
+        super(type(),
+                TranslationContext.forTranslationContextHolder(holder.getFeatureIdentifier()),
+                originalText,
+                holder);
+    }
 
-    _Either<HasStaticText, HasImperativeText> getSpecialization();
 
-    /**
-     * Flag indicating whether the label should be show as is, or should be HTML escaped.
-     */
-    boolean escaped();
 }
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collections/layout/DescribedAsFacetForCollectionLayoutAnnotation.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collections/layout/DescribedAsFacetForCollectionLayoutAnnotation.java
index f05c0f9..dff0c52 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collections/layout/DescribedAsFacetForCollectionLayoutAnnotation.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collections/layout/DescribedAsFacetForCollectionLayoutAnnotation.java
@@ -24,22 +24,27 @@ import java.util.Optional;
 import org.apache.isis.applib.annotation.CollectionLayout;
 import org.apache.isis.commons.internal.base._Strings;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
-import org.apache.isis.core.metamodel.facets.all.described.DescribedAsFacetAbstract;
+import org.apache.isis.core.metamodel.facets.all.described.MemberDescribedFacet;
+import org.apache.isis.core.metamodel.facets.all.described.MemberDescribedFacetWithStaticTextAbstract;
 
-public class DescribedAsFacetForCollectionLayoutAnnotation extends DescribedAsFacetAbstract {
+public class DescribedAsFacetForCollectionLayoutAnnotation
+extends MemberDescribedFacetWithStaticTextAbstract {
 
-    public static Optional<DescribedAsFacetForCollectionLayoutAnnotation> create(
+    public static Optional<MemberDescribedFacet> create(
             final Optional<CollectionLayout> collectionLayoutIfAny,
             final FacetHolder holder) {
 
         return collectionLayoutIfAny
                 .map(CollectionLayout::describedAs)
                 .filter(_Strings::isNotEmpty)
-                .map(describedAs -> new DescribedAsFacetForCollectionLayoutAnnotation(describedAs, holder));
+                .map(describedAs ->
+                    new DescribedAsFacetForCollectionLayoutAnnotation(describedAs, holder));
     }
 
-    private DescribedAsFacetForCollectionLayoutAnnotation(final String value, final FacetHolder holder) {
-        super(value, holder);
+    private DescribedAsFacetForCollectionLayoutAnnotation(
+            final String described,
+            final FacetHolder holder) {
+        super(described, holder);
     }
 
 }
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collections/layout/DescribedAsFacetForCollectionXml.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collections/layout/DescribedAsFacetForCollectionXml.java
index 026349d..15ff135 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collections/layout/DescribedAsFacetForCollectionXml.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collections/layout/DescribedAsFacetForCollectionXml.java
@@ -24,13 +24,13 @@ import java.util.Optional;
 import org.apache.isis.applib.layout.component.CollectionLayoutData;
 import org.apache.isis.commons.internal.base._Strings;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
-import org.apache.isis.core.metamodel.facets.all.described.DescribedAsFacet;
-import org.apache.isis.core.metamodel.facets.all.described.DescribedAsFacetAbstract;
+import org.apache.isis.core.metamodel.facets.all.described.MemberDescribedFacet;
+import org.apache.isis.core.metamodel.facets.all.described.MemberDescribedFacetWithStaticTextAbstract;
 
 public class DescribedAsFacetForCollectionXml
-extends DescribedAsFacetAbstract {
+extends MemberDescribedFacetWithStaticTextAbstract {
 
-    public static Optional<DescribedAsFacet> create(
+    public static Optional<MemberDescribedFacet> create(
             final CollectionLayoutData collectionLayout,
             final FacetHolder holder) {
         if(collectionLayout == null) {
@@ -42,8 +42,10 @@ extends DescribedAsFacetAbstract {
                 : Optional.empty();
     }
 
-    private DescribedAsFacetForCollectionXml(final String value, final FacetHolder holder) {
-        super(value, holder);
+    private DescribedAsFacetForCollectionXml(
+            final String described,
+            final FacetHolder holder) {
+        super(described, holder);
     }
 
 }
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collections/layout/NamedFacetForCollectionLayoutAnnotation.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collections/layout/NamedFacetForCollectionLayoutAnnotation.java
index b3ee38a..b1f0354 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collections/layout/NamedFacetForCollectionLayoutAnnotation.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collections/layout/NamedFacetForCollectionLayoutAnnotation.java
@@ -24,28 +24,27 @@ import java.util.Optional;
 import org.apache.isis.applib.annotation.CollectionLayout;
 import org.apache.isis.commons.internal.base._Strings;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
-import org.apache.isis.core.metamodel.facets.all.i8n.staatic.NounForms;
-import org.apache.isis.core.metamodel.facets.all.named.NamedFacetAbstract;
+import org.apache.isis.core.metamodel.facets.all.named.MemberNamedFacet;
+import org.apache.isis.core.metamodel.facets.all.named.MemberNamedFacetWithStaticTextAbstract;
 
-public class NamedFacetForCollectionLayoutAnnotation extends NamedFacetAbstract {
+public class NamedFacetForCollectionLayoutAnnotation
+extends MemberNamedFacetWithStaticTextAbstract {
 
-    public static Optional<NamedFacetForCollectionLayoutAnnotation> create(
+    public static Optional<MemberNamedFacet> create(
             final Optional<CollectionLayout> collectionLayoutIfAny,
             final FacetHolder holder) {
 
         return collectionLayoutIfAny
-                .filter(collectionLayout -> _Strings.emptyToNull(collectionLayout.named()) != null)
-                .map(collectionLayout ->
-                new NamedFacetForCollectionLayoutAnnotation(
-                        collectionLayout.named(), collectionLayout.namedEscaped(), holder));
+        .filter(collectionLayout -> _Strings.emptyToNull(collectionLayout.named()) != null)
+        .map(collectionLayout ->
+            new NamedFacetForCollectionLayoutAnnotation(collectionLayout.named(), holder));
     }
 
     private NamedFacetForCollectionLayoutAnnotation(
-            final String pluralName,
-            final boolean escaped,
+            final String named,
             final FacetHolder holder) {
 
-        super(NounForms.preferredPlural(pluralName).build(), escaped, holder);
+        super(named, holder);
     }
 
 }
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collections/layout/NamedFacetForCollectionXml.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collections/layout/NamedFacetForCollectionXml.java
index 701ae75..f276a61 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collections/layout/NamedFacetForCollectionXml.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/collections/layout/NamedFacetForCollectionXml.java
@@ -24,32 +24,29 @@ import java.util.Optional;
 import org.apache.isis.applib.layout.component.CollectionLayoutData;
 import org.apache.isis.commons.internal.base._Strings;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
-import org.apache.isis.core.metamodel.facets.all.i8n.staatic.NounForms;
-import org.apache.isis.core.metamodel.facets.all.named.NamedFacet;
-import org.apache.isis.core.metamodel.facets.all.named.NamedFacetAbstract;
+import org.apache.isis.core.metamodel.facets.all.named.MemberNamedFacet;
+import org.apache.isis.core.metamodel.facets.all.named.MemberNamedFacetWithStaticTextAbstract;
 
 public class NamedFacetForCollectionXml
-extends NamedFacetAbstract {
+extends MemberNamedFacetWithStaticTextAbstract {
 
-    public static Optional<NamedFacet> create(
+    public static Optional<MemberNamedFacet> create(
             final CollectionLayoutData collectionLayout,
             final FacetHolder holder) {
         if(collectionLayout == null) {
             return Optional.empty();
         }
         final String named = _Strings.emptyToNull(collectionLayout.getNamed());
-        final Boolean escaped = collectionLayout.getNamedEscaped();
         return named != null
-                ? Optional.of(new NamedFacetForCollectionXml(named, escaped == null || escaped, holder))
+                ? Optional.of(new NamedFacetForCollectionXml(named, holder))
                 : Optional.empty();
     }
 
     private NamedFacetForCollectionXml(
-            final String pluralName,
-            final boolean escaped,
+            final String named,
             final FacetHolder holder) {
 
-        super(NounForms.preferredPlural(pluralName).build(), escaped, holder);
+        super(named, holder);
     }
 
 }
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/fallback/FallbackFacetFactory.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/fallback/FallbackFacetFactory.java
index 1f3db68..0a1f1b7 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/fallback/FallbackFacetFactory.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/fallback/FallbackFacetFactory.java
@@ -32,7 +32,6 @@ import org.apache.isis.core.metamodel.facetapi.FeatureType;
 import org.apache.isis.core.metamodel.facets.FacetFactoryAbstract;
 import org.apache.isis.core.metamodel.facets.FacetedMethod;
 import org.apache.isis.core.metamodel.facets.TypedHolder;
-import org.apache.isis.core.metamodel.facets.all.i8n.staatic.NounForm;
 
 import lombok.val;
 
@@ -73,7 +72,6 @@ public class FallbackFacetFactory extends FacetFactoryAbstract {
 
         val facetHolder = processClassContext.getFacetHolder();
 
-        addFacet(new DescribedAsFacetNone(facetHolder));
         addFacet(new TitleFacetNone(facetHolder));
         addFacet(
                 new PagedFacetFromConfiguration(
@@ -86,8 +84,7 @@ public class FallbackFacetFactory extends FacetFactoryAbstract {
 
         final FacetedMethod facetedMethod = processMethodContext.getFacetHolder();
 
-        addFacet(new NamedFacetFallbackFromMemberName(NounForm.SINGULAR, facetedMethod));
-        addFacet(new DescribedAsFacetNone(facetedMethod));
+        addFacet(new NamedFacetFallbackFromMemberName(facetedMethod));
         addFacet(new HelpFacetNone(facetedMethod));
 
         final FeatureType featureType = facetedMethod.getFeatureType();
@@ -114,8 +111,6 @@ public class FallbackFacetFactory extends FacetFactoryAbstract {
 
         final TypedHolder typedHolder = processParameterContext.getFacetHolder();
         if (typedHolder.getFeatureType().isActionParameter()) {
-            addFacet(new NamedFacetNone(typedHolder));
-            addFacet(new DescribedAsFacetNone(typedHolder));
             addFacet(new HelpFacetNone(typedHolder));
             addFacet(new MultiLineFacetNone(typedHolder));
 
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/fallback/NamedFacetFallbackFromMemberName.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/fallback/NamedFacetFallbackFromMemberName.java
index 8318d25..189bf16 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/fallback/NamedFacetFallbackFromMemberName.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/fallback/NamedFacetFallbackFromMemberName.java
@@ -21,15 +21,13 @@ package org.apache.isis.core.metamodel.facets.fallback;
 
 import org.apache.isis.core.metamodel.commons.StringExtensions;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
-import org.apache.isis.core.metamodel.facets.all.i8n.staatic.NounForm;
-import org.apache.isis.core.metamodel.facets.all.named.NamedFacetForMemberNameAbstract;
+import org.apache.isis.core.metamodel.facets.all.named.MemberNamedFacetForStaticMemberName;
 
 public class NamedFacetFallbackFromMemberName
-extends NamedFacetForMemberNameAbstract {
+extends MemberNamedFacetForStaticMemberName {
 
-    protected NamedFacetFallbackFromMemberName(final NounForm nounForm, final FacetHolder holder) {
+    public NamedFacetFallbackFromMemberName(final FacetHolder holder) {
         super(
-                nounForm,
                 StringExtensions.asNaturalName2(holder.getFeatureIdentifier().getMemberLogicalName()),
                 holder,
                 Precedence.FALLBACK);
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/fallback/NamedFacetNone.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/fallback/NamedFacetNone.java
deleted file mode 100644
index f2c5f60..0000000
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/fallback/NamedFacetNone.java
+++ /dev/null
@@ -1,38 +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.fallback;
-
-import org.apache.isis.core.metamodel.facetapi.FacetHolder;
-import org.apache.isis.core.metamodel.facets.all.i8n.staatic.NounForms;
-import org.apache.isis.core.metamodel.facets.all.named.NamedFacetAbstract;
-
-/**
- * Has a name of <tt>null</tt>.
- */
-public class NamedFacetNone
-extends NamedFacetAbstract {
-
-    public static final boolean ESCAPED = true;
-
-    public NamedFacetNone(final FacetHolder holder) {
-        super(NounForms.preferredSingular(null).build(), ESCAPED, holder, Precedence.FALLBACK);
-    }
-
-}
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/members/described/annotprop/DescribedAsFacetOnMemberFactory.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/members/described/annotprop/DescribedAsFacetOnMemberFactory.java
deleted file mode 100644
index 568e3c1..0000000
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/members/described/annotprop/DescribedAsFacetOnMemberFactory.java
+++ /dev/null
@@ -1,57 +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.members.described.annotprop;
-
-import javax.inject.Inject;
-
-import org.apache.isis.core.metamodel.context.MetaModelContext;
-import org.apache.isis.core.metamodel.facetapi.FeatureType;
-import org.apache.isis.core.metamodel.facets.FacetFactoryAbstract;
-import org.apache.isis.core.metamodel.facets.all.described.DescribedAsFacet;
-
-import lombok.val;
-
-public class DescribedAsFacetOnMemberFactory
-extends FacetFactoryAbstract {
-
-    @Inject
-    public DescribedAsFacetOnMemberFactory(final MetaModelContext mmc) {
-        super(mmc, FeatureType.MEMBERS);
-    }
-
-    @Override
-    public void process(final ProcessMethodContext processMethodContext) {
-
-        // (facet derived from type moved to post-processor)
-
-        val returnType = processMethodContext.getMethod().getReturnType();
-        val paramTypeSpec = getSpecificationLoader().loadSpecification(returnType);
-
-        addFacetIfPresent(
-                paramTypeSpec.lookupFacet(DescribedAsFacet.class)
-                .flatMap(returnTypeDescribedAsFacet->
-                    DescribedAsFacetOnMemberDerivedFromType
-                    .create(
-                            returnTypeDescribedAsFacet,
-                            processMethodContext.getFacetHolder())));
-    }
-
-
-}
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/members/described/annotprop/DescribedAsFacetOnMemberFromProperties.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/members/described/annotprop/DescribedAsFacetOnMemberFromProperties.java
index 00b31e9..95eed83 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/members/described/annotprop/DescribedAsFacetOnMemberFromProperties.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/members/described/annotprop/DescribedAsFacetOnMemberFromProperties.java
@@ -22,9 +22,10 @@ package org.apache.isis.core.metamodel.facets.members.described.annotprop;
 import java.util.Properties;
 
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
-import org.apache.isis.core.metamodel.facets.all.described.DescribedAsFacetAbstract;
+import org.apache.isis.core.metamodel.facets.all.described.MemberDescribedFacetWithStaticTextAbstract;
 
-public class DescribedAsFacetOnMemberFromProperties extends DescribedAsFacetAbstract {
+public class DescribedAsFacetOnMemberFromProperties
+extends MemberDescribedFacetWithStaticTextAbstract {
 
     public DescribedAsFacetOnMemberFromProperties(final Properties properties, final FacetHolder holder) {
         super(valueFrom(properties), holder);
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/members/described/annotprop/DescribedAsFacetOnMemberDerivedFromType.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/members/described/annotprop/DescribedAsFacetOnMemberInferredFromType.java
similarity index 51%
rename from core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/members/described/annotprop/DescribedAsFacetOnMemberDerivedFromType.java
rename to core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/members/described/annotprop/DescribedAsFacetOnMemberInferredFromType.java
index 3bf1060..6485c8a 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/members/described/annotprop/DescribedAsFacetOnMemberDerivedFromType.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/members/described/annotprop/DescribedAsFacetOnMemberInferredFromType.java
@@ -21,33 +21,33 @@ package org.apache.isis.core.metamodel.facets.members.described.annotprop;
 
 import java.util.Optional;
 
+import org.apache.isis.commons.internal.base._Strings;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
-import org.apache.isis.core.metamodel.facets.all.described.DescribedAsFacet;
-import org.apache.isis.core.metamodel.facets.all.described.DescribedAsFacetAbstract;
-
-public class DescribedAsFacetOnMemberDerivedFromType
-extends DescribedAsFacetAbstract {
-
-    /**
-     * As {@link DescribedAsFacet}(s) have either static or dynamic (imperative) text,
-     * we yet only support inferring from those with static text.
-     */
-    public static Optional<DescribedAsFacet> create(
-            final DescribedAsFacet describedAsFacet,
+import org.apache.isis.core.metamodel.facets.all.described.MemberDescribedFacet;
+import org.apache.isis.core.metamodel.facets.all.described.MemberDescribedFacetWithStaticTextAbstract;
+import org.apache.isis.core.metamodel.facets.all.described.ObjectDescribedFacet;
+
+import lombok.val;
+
+public class DescribedAsFacetOnMemberInferredFromType
+extends MemberDescribedFacetWithStaticTextAbstract {
+
+    public static Optional<MemberDescribedFacet> create(
+            final ObjectDescribedFacet objectDescribedFacet,
             final FacetHolder holder) {
 
-        return describedAsFacet instanceof DescribedAsFacetAbstract
-                ? Optional.of(
-                        new DescribedAsFacetOnMemberDerivedFromType(
-                                (DescribedAsFacetAbstract) describedAsFacet,
-                                holder))
-                : Optional.empty();
+        val describedIfAny = _Strings.emptyToNull(objectDescribedFacet.text());
+
+        return Optional.ofNullable(describedIfAny)
+        .map(described->
+            new DescribedAsFacetOnMemberInferredFromType(described, holder));
+
     }
 
-    private DescribedAsFacetOnMemberDerivedFromType(
-            final DescribedAsFacetAbstract describedAsFacet,
+    private DescribedAsFacetOnMemberInferredFromType(
+            final String described,
             final FacetHolder holder) {
-        super(describedAsFacet.text(), holder);
+        super(described, holder, Precedence.INFERRED);
     }
 
 }
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/members/described/method/DescribedAsFacetForMemberViaMethod.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/members/described/method/DescribedAsFacetForMemberViaMethod.java
index 6de102e..9989564 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/members/described/method/DescribedAsFacetForMemberViaMethod.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/members/described/method/DescribedAsFacetForMemberViaMethod.java
@@ -20,32 +20,18 @@ package org.apache.isis.core.metamodel.facets.members.described.method;
 
 import java.lang.reflect.Method;
 
-import org.apache.isis.commons.internal.base._Either;
-import org.apache.isis.core.metamodel.facetapi.Facet;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
-import org.apache.isis.core.metamodel.facets.all.described.DescribedAsFacet;
-import org.apache.isis.core.metamodel.facets.all.i8n.imperative.HasImperativeText;
-import org.apache.isis.core.metamodel.facets.all.i8n.imperative.I8nImperativeFacetAbstract;
-import org.apache.isis.core.metamodel.facets.all.i8n.staatic.HasStaticText;
-
-import lombok.Getter;
+import org.apache.isis.core.metamodel.facets.all.described.MemberDescribedFacetWithImperativeTextAbstract;
 
 public class DescribedAsFacetForMemberViaMethod
-extends I8nImperativeFacetAbstract
-implements
-    DescribedAsFacet {
-
-    private static final Class<? extends Facet> type() {
-        return DescribedAsFacet.class;
-    }
-
-    @Getter(onMethod_ = {@Override})
-    private final _Either<HasStaticText, HasImperativeText> specialization = _Either.right(this);
+extends MemberDescribedFacetWithImperativeTextAbstract {
 
     public DescribedAsFacetForMemberViaMethod(
             final Method describedMethod,
             final FacetHolder holder) {
-        super(type(), describedMethod, holder);
+        super(
+                describedMethod,
+                holder);
     }
 
 }
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/members/named/method/NamedFacetForMemberViaMethod.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/members/named/method/NamedFacetForMemberViaMethod.java
index ffc5e92..049b527 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/members/named/method/NamedFacetForMemberViaMethod.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/members/named/method/NamedFacetForMemberViaMethod.java
@@ -20,37 +20,18 @@ package org.apache.isis.core.metamodel.facets.members.named.method;
 
 import java.lang.reflect.Method;
 
-import org.apache.isis.commons.internal.base._Either;
-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.imperative.HasImperativeText;
-import org.apache.isis.core.metamodel.facets.all.i8n.imperative.I8nImperativeFacetAbstract;
-import org.apache.isis.core.metamodel.facets.all.i8n.staatic.HasStaticText;
-import org.apache.isis.core.metamodel.facets.all.named.NamedFacet;
-
-import lombok.Getter;
+import org.apache.isis.core.metamodel.facets.all.named.MemberNamedFacetWithImperativeTextAbstract;
 
 public class NamedFacetForMemberViaMethod
-extends I8nImperativeFacetAbstract
-implements NamedFacet {
-
-    private static final Class<? extends Facet> type() {
-        return NamedFacet.class;
-    }
-
-    @Getter(onMethod_ = {@Override})
-    private final _Either<HasStaticText, HasImperativeText> specialization = _Either.right(this);
+extends MemberNamedFacetWithImperativeTextAbstract {
 
     public NamedFacetForMemberViaMethod(
             final Method namedMethod,
             final FacetHolder holder) {
-        super(type(), namedMethod, holder);
+        super(
+                namedMethod,
+                holder);
     }
 
-    @Override
-    public boolean escaped() {
-        return true; // dynamic names are always escaped
-    }
-
-
 }
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainobjectlayout/DescribedAsFacetForDomainObjectLayoutAnnotation.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainobjectlayout/DescribedAsFacetForDomainObjectLayoutAnnotation.java
index 6fe54b2..268d444 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainobjectlayout/DescribedAsFacetForDomainObjectLayoutAnnotation.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainobjectlayout/DescribedAsFacetForDomainObjectLayoutAnnotation.java
@@ -23,10 +23,11 @@ import java.util.Optional;
 import org.apache.isis.applib.annotation.DomainObjectLayout;
 import org.apache.isis.commons.internal.base._Strings;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
-import org.apache.isis.core.metamodel.facets.all.described.DescribedAsFacetAbstract;
+import org.apache.isis.core.metamodel.facets.all.described.ObjectDescribedFacetAbstract;
 
 
-public class DescribedAsFacetForDomainObjectLayoutAnnotation extends DescribedAsFacetAbstract {
+public class DescribedAsFacetForDomainObjectLayoutAnnotation
+extends ObjectDescribedFacetAbstract {
 
     public static Optional<DescribedAsFacetForDomainObjectLayoutAnnotation> create(
             final Optional<DomainObjectLayout> domainObjectLayoutIfAny,
@@ -38,7 +39,9 @@ public class DescribedAsFacetForDomainObjectLayoutAnnotation extends DescribedAs
                 .map(describedAs -> new DescribedAsFacetForDomainObjectLayoutAnnotation(describedAs, holder));
     }
 
-    private DescribedAsFacetForDomainObjectLayoutAnnotation(final String value, final FacetHolder holder) {
-        super(value, holder);
+    private DescribedAsFacetForDomainObjectLayoutAnnotation(
+            final String described,
+            final FacetHolder holder) {
+        super(described, holder);
     }
 }
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainobjectlayout/DescribedAsFacetForDomainObjectXml.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainobjectlayout/DescribedAsFacetForDomainObjectXml.java
index 54a6d15..abb07ea 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainobjectlayout/DescribedAsFacetForDomainObjectXml.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainobjectlayout/DescribedAsFacetForDomainObjectXml.java
@@ -24,13 +24,13 @@ import java.util.Optional;
 import org.apache.isis.applib.layout.component.DomainObjectLayoutData;
 import org.apache.isis.commons.internal.base._Strings;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
-import org.apache.isis.core.metamodel.facets.all.described.DescribedAsFacet;
-import org.apache.isis.core.metamodel.facets.all.described.DescribedAsFacetAbstract;
+import org.apache.isis.core.metamodel.facets.all.described.ObjectDescribedFacet;
+import org.apache.isis.core.metamodel.facets.all.described.ObjectDescribedFacetAbstract;
 
 public class DescribedAsFacetForDomainObjectXml
-extends DescribedAsFacetAbstract {
+extends ObjectDescribedFacetAbstract {
 
-    public static Optional<DescribedAsFacet> create(
+    public static Optional<ObjectDescribedFacet> create(
             final DomainObjectLayoutData domainObjectLayout,
             final FacetHolder holder) {
         if(domainObjectLayout == null) {
@@ -43,9 +43,9 @@ extends DescribedAsFacetAbstract {
     }
 
     private DescribedAsFacetForDomainObjectXml(
-            final String value,
+            final String described,
             final FacetHolder holder) {
-        super(value, holder);
+        super(described, holder);
     }
 
 }
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainobjectlayout/NamedFacetForDomainObjectLayoutAnnotation.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainobjectlayout/NamedFacetForDomainObjectLayoutAnnotation.java
index 4e879a7..a96f47d 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainobjectlayout/NamedFacetForDomainObjectLayoutAnnotation.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainobjectlayout/NamedFacetForDomainObjectLayoutAnnotation.java
@@ -18,23 +18,22 @@
  */
 package org.apache.isis.core.metamodel.facets.object.domainobjectlayout;
 
-
 import java.util.Optional;
 
 import org.apache.isis.applib.annotation.DomainObjectLayout;
 import org.apache.isis.commons.internal.base._Strings;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
-import org.apache.isis.core.metamodel.facets.all.i8n.staatic.NounForm;
-import org.apache.isis.core.metamodel.facets.all.i8n.staatic.NounForms;
-import org.apache.isis.core.metamodel.facets.all.named.NamedFacetAbstract;
+import org.apache.isis.core.metamodel.facets.all.i8n.noun.NounForm;
+import org.apache.isis.core.metamodel.facets.all.i8n.noun.NounForms;
+import org.apache.isis.core.metamodel.facets.all.named.ObjectNamedFacet;
+import org.apache.isis.core.metamodel.facets.all.named.ObjectNamedFacetAbstract;
 
 import lombok.val;
 
-
 public class NamedFacetForDomainObjectLayoutAnnotation
-extends NamedFacetAbstract {
+extends ObjectNamedFacetAbstract {
 
-    public static Optional<NamedFacetForDomainObjectLayoutAnnotation> create(
+    public static Optional<ObjectNamedFacet> create(
             final Optional<DomainObjectLayout> domainObjectLayoutIfAny,
             final FacetHolder holder) {
 
@@ -47,6 +46,7 @@ extends NamedFacetAbstract {
         val singular = _Strings.emptyToNull(domainObjectLayout.named());
         val plural = _Strings.emptyToNull(domainObjectLayout.plural());
 
+        //TODO[1720] if singular is not explicit (is empty), infer
         val nounForms = NounForms
                 .builder()
                 .preferredNounForm(singular!=null ? NounForm.SINGULAR : NounForm.PLURAL)
@@ -62,13 +62,12 @@ extends NamedFacetAbstract {
                 new NamedFacetForDomainObjectLayoutAnnotation(
                             nounForms,
                             holder));
-
     }
 
     private NamedFacetForDomainObjectLayoutAnnotation(
             final NounForms nounForms,
             final FacetHolder holder) {
-        super(nounForms, /*escaped*/ true, holder);
+        super(nounForms, holder);
     }
 
 }
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainobjectlayout/NamedFacetForDomainObjectXml.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainobjectlayout/NamedFacetForDomainObjectXml.java
index b1d468e..52deac4 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainobjectlayout/NamedFacetForDomainObjectXml.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainobjectlayout/NamedFacetForDomainObjectXml.java
@@ -24,17 +24,17 @@ import java.util.Optional;
 import org.apache.isis.applib.layout.component.DomainObjectLayoutData;
 import org.apache.isis.commons.internal.base._Strings;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
-import org.apache.isis.core.metamodel.facets.all.i8n.staatic.NounForm;
-import org.apache.isis.core.metamodel.facets.all.i8n.staatic.NounForms;
-import org.apache.isis.core.metamodel.facets.all.named.NamedFacet;
-import org.apache.isis.core.metamodel.facets.all.named.NamedFacetAbstract;
+import org.apache.isis.core.metamodel.facets.all.i8n.noun.NounForm;
+import org.apache.isis.core.metamodel.facets.all.i8n.noun.NounForms;
+import org.apache.isis.core.metamodel.facets.all.named.ObjectNamedFacet;
+import org.apache.isis.core.metamodel.facets.all.named.ObjectNamedFacetAbstract;
 
 import lombok.val;
 
 public class NamedFacetForDomainObjectXml
-extends NamedFacetAbstract {
+extends ObjectNamedFacetAbstract {
 
-    public static Optional<NamedFacet> create(
+    public static Optional<ObjectNamedFacet> create(
             final DomainObjectLayoutData domainObjectLayout,
             final FacetHolder holder) {
 
@@ -45,6 +45,7 @@ extends NamedFacetAbstract {
         val singular = _Strings.emptyToNull(domainObjectLayout.getNamed());
         val plural = _Strings.emptyToNull(domainObjectLayout.getPlural());
 
+        //TODO[1720] if singular is not explicit (is empty), infer
         val nounForms = NounForms
                 .builder()
                 .preferredNounForm(singular!=null ? NounForm.SINGULAR : NounForm.PLURAL)
@@ -56,21 +57,16 @@ extends NamedFacetAbstract {
             return Optional.empty();
         }
 
-        final Boolean _escaped = domainObjectLayout.getNamedEscaped();
-        final boolean escaped = (_escaped == null || _escaped);
-
         return Optional.of(
                 new NamedFacetForDomainObjectXml(
                             nounForms,
-                            escaped,
                             holder));
     }
 
     private NamedFacetForDomainObjectXml(
             final NounForms nounForms,
-            final boolean escaped,
             final FacetHolder holder) {
-        super(nounForms, escaped, holder);
+        super(nounForms, holder);
     }
 
 }
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainservicelayout/NamedFacetForDomainServiceLayoutAnnotation.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainservicelayout/NamedFacetForDomainServiceLayoutAnnotation.java
index 5b2e0c3..a0a6d0f 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainservicelayout/NamedFacetForDomainServiceLayoutAnnotation.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/domainservicelayout/NamedFacetForDomainServiceLayoutAnnotation.java
@@ -24,16 +24,16 @@ import java.util.Optional;
 import org.apache.isis.applib.annotation.DomainServiceLayout;
 import org.apache.isis.commons.internal.base._Strings;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
-import org.apache.isis.core.metamodel.facets.all.i8n.staatic.NounForms;
-import org.apache.isis.core.metamodel.facets.all.named.NamedFacet;
-import org.apache.isis.core.metamodel.facets.all.named.NamedFacetAbstract;
+import org.apache.isis.core.metamodel.facets.all.i8n.noun.NounForms;
+import org.apache.isis.core.metamodel.facets.all.named.ObjectNamedFacet;
+import org.apache.isis.core.metamodel.facets.all.named.ObjectNamedFacetAbstract;
 
 import lombok.val;
 
 public class NamedFacetForDomainServiceLayoutAnnotation
-extends NamedFacetAbstract {
+extends ObjectNamedFacetAbstract {
 
-    public static Optional<NamedFacet> create(
+    public static Optional<ObjectNamedFacet> create(
             final Optional<DomainServiceLayout> domainServiceLayoutIfAny,
             final FacetHolder facetHolder) {
 
@@ -60,7 +60,7 @@ extends NamedFacetAbstract {
     private NamedFacetForDomainServiceLayoutAnnotation(
             final NounForms nounForms,
             final FacetHolder holder) {
-        super(nounForms, /*escaped*/ true, holder);
+        super(nounForms, holder);
     }
 
 
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/objectvalue/mandatory/MandatoryFacetAbstract.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/objectvalue/mandatory/MandatoryFacetAbstract.java
index 80334c6..b2ddc2d 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/objectvalue/mandatory/MandatoryFacetAbstract.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/objectvalue/mandatory/MandatoryFacetAbstract.java
@@ -25,7 +25,7 @@ import org.apache.isis.commons.internal.base._Strings;
 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.facets.all.named.NamedFacet;
+import org.apache.isis.core.metamodel.facets.all.named.MemberNamedFacet;
 import org.apache.isis.core.metamodel.interactions.ActionArgValidityContext;
 import org.apache.isis.core.metamodel.interactions.PropertyModifyContext;
 import org.apache.isis.core.metamodel.interactions.ProposedHolder;
@@ -87,31 +87,26 @@ implements MandatoryFacet {
 
     @Override
     public String invalidates(final ValidityContext context) {
-        if (!(context instanceof PropertyModifyContext)
-                && !(context instanceof ActionArgValidityContext)) {
-            return null;
-        }
-        // TODO: IntelliJ says the following is always false, so looks like it can be removed...
-        if (!(context instanceof ProposedHolder)) {
-            // shouldn't happen, since both the above should hold a proposed
-            // value/argument
-            return null;
-        }
-        final ProposedHolder proposedHolder = (ProposedHolder) context;
-        final boolean required = isRequiredButNull(proposedHolder.getProposed());
-        if (!required) {
+
+        val proposedHolder =
+                context instanceof PropertyModifyContext
+                || context instanceof ActionArgValidityContext
+                        ? (ProposedHolder) context
+                        : null;
+
+        if(proposedHolder==null
+                || !isRequiredButNull(proposedHolder.getProposed())) {
             return null;
         }
-        val name = getFacetHolder().lookupFacet(NamedFacet.class)
-        .map(NamedFacet::getSpecialization)
-        .map(specialization->specialization
-                .fold(textFacet->textFacet.preferredTranslated(),
-                      textFacet->textFacet.textElseNull(context.getHead().getTarget())))
-        .orElse(null);
-
-        return name != null
-                ? "'" + name + "' is mandatory"
-                : "Mandatory";
+
+        return getFacetHolder()
+                .lookupFacet(MemberNamedFacet.class)
+                .map(MemberNamedFacet::getSpecialization)
+                .map(specialization->specialization
+                        .fold(textFacet->textFacet.translated(),
+                              textFacet->textFacet.textElseNull(context.getHead().getTarget())))
+                .map(named->"'" + named + "' is mandatory")
+                .orElse("Mandatory");
     }
 
     @Override
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/param/described/annotderived/DescribedAsFacetOnParameterAnnotationElseDerivedFromTypeFactory.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/param/described/annotderived/DescribedAsFacetOnParameterAnnotationElseDerivedFromTypeFactory.java
deleted file mode 100644
index 8107f49..0000000
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/param/described/annotderived/DescribedAsFacetOnParameterAnnotationElseDerivedFromTypeFactory.java
+++ /dev/null
@@ -1,62 +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.param.described.annotderived;
-
-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.all.described.DescribedAsFacet;
-import org.apache.isis.core.metamodel.spec.ObjectSpecification;
-
-import lombok.val;
-
-public class DescribedAsFacetOnParameterAnnotationElseDerivedFromTypeFactory
-extends FacetFactoryAbstract {
-
-    @Inject
-    public DescribedAsFacetOnParameterAnnotationElseDerivedFromTypeFactory(final MetaModelContext mmc) {
-        super(mmc, FeatureType.PARAMETERS_ONLY);
-    }
-
-    @Override
-    public void processParams(final ProcessParameterContext processParameterContext) {
-
-        val parameterType = processParameterContext.getParameterType();
-
-        // fall back to a description on the parameter's type, if
-        // available
-        final DescribedAsFacet parameterTypeDescribedAsFacet = getDescribedAsFacet(parameterType);
-        if (parameterTypeDescribedAsFacet != null) {
-            FacetUtil.addFacetIfPresent(
-                    DescribedAsFacetOnParameterDerivedFromType
-                    .create(parameterTypeDescribedAsFacet, processParameterContext.getFacetHolder()));
-        }
-
-    }
-
-    private DescribedAsFacet getDescribedAsFacet(final Class<?> type) {
-        final ObjectSpecification paramTypeSpec = getSpecificationLoader().loadSpecification(type);
-        return paramTypeSpec.getFacet(DescribedAsFacet.class);
-    }
-
-}
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/param/described/annotderived/DescribedAsFacetOnParameterDerivedFromType.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/param/described/annotderived/DescribedAsFacetOnParameterInferredFromType.java
similarity index 51%
rename from core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/param/described/annotderived/DescribedAsFacetOnParameterDerivedFromType.java
rename to core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/param/described/annotderived/DescribedAsFacetOnParameterInferredFromType.java
index bb551c6..e86624e 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/param/described/annotderived/DescribedAsFacetOnParameterDerivedFromType.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/param/described/annotderived/DescribedAsFacetOnParameterInferredFromType.java
@@ -21,33 +21,32 @@ package org.apache.isis.core.metamodel.facets.param.described.annotderived;
 
 import java.util.Optional;
 
+import org.apache.isis.commons.internal.base._Strings;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
-import org.apache.isis.core.metamodel.facets.all.described.DescribedAsFacet;
-import org.apache.isis.core.metamodel.facets.all.described.DescribedAsFacetAbstract;
-
-public class DescribedAsFacetOnParameterDerivedFromType
-extends DescribedAsFacetAbstract {
-
-    /**
-     * As {@link DescribedAsFacet}(s) have either static or dynamic (imperative) text,
-     * we yet only support inferring from those with static text.
-     */
-    public static Optional<DescribedAsFacet> create(
-            final DescribedAsFacet describedAsFacet,
+import org.apache.isis.core.metamodel.facets.all.described.ObjectDescribedFacet;
+import org.apache.isis.core.metamodel.facets.all.described.ParamDescribedFacet;
+import org.apache.isis.core.metamodel.facets.all.described.ParamDescribedFacetAbstract;
+
+import lombok.val;
+
+public class DescribedAsFacetOnParameterInferredFromType
+extends ParamDescribedFacetAbstract {
+
+    public static Optional<ParamDescribedFacet> create(
+            final ObjectDescribedFacet objectDescribedFacet,
             final FacetHolder holder) {
 
-        return describedAsFacet instanceof DescribedAsFacetAbstract
-                ? Optional.of(
-                        new DescribedAsFacetOnParameterDerivedFromType(
-                                (DescribedAsFacetAbstract) describedAsFacet,
-                                holder))
-                : Optional.empty();
+        val describedIfAny = _Strings.emptyToNull(objectDescribedFacet.text());
+
+        return Optional.ofNullable(describedIfAny)
+        .map(described->
+            new DescribedAsFacetOnParameterInferredFromType(described, holder));
     }
 
-    private DescribedAsFacetOnParameterDerivedFromType(
-            final DescribedAsFacetAbstract describedAsFacet,
+    private DescribedAsFacetOnParameterInferredFromType(
+            final String described,
             final FacetHolder holder) {
-        super(describedAsFacet.text(), holder);
+        super(described, holder, Precedence.INFERRED);
     }
 
 }
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/param/layout/DescribedAsFacetForParameterLayoutAnnotation.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/param/layout/DescribedAsFacetForParameterLayoutAnnotation.java
index 5d389c8..ff07e71 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/param/layout/DescribedAsFacetForParameterLayoutAnnotation.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/param/layout/DescribedAsFacetForParameterLayoutAnnotation.java
@@ -24,13 +24,13 @@ import java.util.Optional;
 import org.apache.isis.applib.annotation.ParameterLayout;
 import org.apache.isis.commons.internal.base._Strings;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
-import org.apache.isis.core.metamodel.facets.all.described.DescribedAsFacet;
-import org.apache.isis.core.metamodel.facets.all.described.DescribedAsFacetAbstract;
+import org.apache.isis.core.metamodel.facets.all.described.ParamDescribedFacet;
+import org.apache.isis.core.metamodel.facets.all.described.ParamDescribedFacetAbstract;
 
 public class DescribedAsFacetForParameterLayoutAnnotation
-extends DescribedAsFacetAbstract {
+extends ParamDescribedFacetAbstract {
 
-    public static Optional<DescribedAsFacet> create(
+    public static Optional<ParamDescribedFacet> create(
             final Optional<ParameterLayout> parameterLayoutIfAny,
             final FacetHolder holder) {
 
@@ -40,7 +40,9 @@ extends DescribedAsFacetAbstract {
                 .map(describedAs -> new DescribedAsFacetForParameterLayoutAnnotation(describedAs, holder));
     }
 
-    private DescribedAsFacetForParameterLayoutAnnotation(final String value, final FacetHolder holder) {
-        super(value, holder);
+    private DescribedAsFacetForParameterLayoutAnnotation(
+            final String described,
+            final FacetHolder holder) {
+        super(described, holder);
     }
 }
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/param/layout/NamedFacetForParameterLayoutAnnotation.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/param/layout/NamedFacetForParameterLayoutAnnotation.java
index 66ebc33..4153d3a 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/param/layout/NamedFacetForParameterLayoutAnnotation.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/param/layout/NamedFacetForParameterLayoutAnnotation.java
@@ -24,14 +24,13 @@ import java.util.Optional;
 import org.apache.isis.applib.annotation.ParameterLayout;
 import org.apache.isis.commons.internal.base._Strings;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
-import org.apache.isis.core.metamodel.facets.all.i8n.staatic.NounForms;
-import org.apache.isis.core.metamodel.facets.all.named.NamedFacet;
-import org.apache.isis.core.metamodel.facets.all.named.NamedFacetAbstract;
+import org.apache.isis.core.metamodel.facets.all.named.ParamNamedFacet;
+import org.apache.isis.core.metamodel.facets.all.named.ParamNamedFacetAbstract;
 
 public class NamedFacetForParameterLayoutAnnotation
-extends NamedFacetAbstract {
+extends ParamNamedFacetAbstract {
 
-    public static Optional<NamedFacet> create(
+    public static Optional<ParamNamedFacet> create(
             final Optional<ParameterLayout> parameterLayoutIfAny,
             final FacetHolder holder) {
 
@@ -40,16 +39,14 @@ extends NamedFacetAbstract {
                 .map(parameterLayout ->
                         new NamedFacetForParameterLayoutAnnotation(
                             parameterLayout.named(),
-                            parameterLayout.namedEscaped(),
                             holder));
     }
 
     private NamedFacetForParameterLayoutAnnotation(
-            final String singularName,
-            final boolean escaped,
+            final String named,
             final FacetHolder holder) {
 
-        super(NounForms.preferredSingular(singularName).build(), escaped, holder);
+        super(named, holder);
     }
 
 }
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/param/name/NamedFacetForParameterUsingReflection.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/param/name/NamedFacetForParameterUsingReflection.java
index df7db47..95c8fdf 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/param/name/NamedFacetForParameterUsingReflection.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/param/name/NamedFacetForParameterUsingReflection.java
@@ -19,18 +19,19 @@
 package org.apache.isis.core.metamodel.facets.param.name;
 
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
-import org.apache.isis.core.metamodel.facets.all.i8n.staatic.NounForms;
-import org.apache.isis.core.metamodel.facets.all.named.NamedFacetAbstract;
+import org.apache.isis.core.metamodel.facets.all.named.ParamNamedFacetAbstract;
 
 /**
  *
  * @since 2.0
  */
 public class NamedFacetForParameterUsingReflection
-extends NamedFacetAbstract {
+extends ParamNamedFacetAbstract {
 
-    public NamedFacetForParameterUsingReflection(final String singularName, final FacetHolder holder) {
-        super(NounForms.preferredSingular(singularName).build(), false, holder);
+    public NamedFacetForParameterUsingReflection(
+            final String named,
+            final FacetHolder holder) {
+        super(named, holder);
     }
 
 }
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/propertylayout/DescribedAsFacetForPropertyLayoutAnnotation.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/propertylayout/DescribedAsFacetForPropertyLayoutAnnotation.java
index 0e2e486..79ea36c 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/propertylayout/DescribedAsFacetForPropertyLayoutAnnotation.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/propertylayout/DescribedAsFacetForPropertyLayoutAnnotation.java
@@ -24,11 +24,13 @@ import java.util.Optional;
 import org.apache.isis.applib.annotation.PropertyLayout;
 import org.apache.isis.commons.internal.base._Strings;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
-import org.apache.isis.core.metamodel.facets.all.described.DescribedAsFacetAbstract;
+import org.apache.isis.core.metamodel.facets.all.described.MemberDescribedFacet;
+import org.apache.isis.core.metamodel.facets.all.described.MemberDescribedFacetWithStaticTextAbstract;
 
-public class DescribedAsFacetForPropertyLayoutAnnotation extends DescribedAsFacetAbstract {
+public class DescribedAsFacetForPropertyLayoutAnnotation
+extends MemberDescribedFacetWithStaticTextAbstract {
 
-    public static Optional<DescribedAsFacetForPropertyLayoutAnnotation> create(
+    public static Optional<MemberDescribedFacet> create(
             final Optional<PropertyLayout> propertyLayoutIfAny,
             final FacetHolder holder) {
 
@@ -38,8 +40,10 @@ public class DescribedAsFacetForPropertyLayoutAnnotation extends DescribedAsFace
                 .map(describedAs -> new DescribedAsFacetForPropertyLayoutAnnotation(describedAs, holder));
     }
 
-    private DescribedAsFacetForPropertyLayoutAnnotation(final String value, final FacetHolder holder) {
-        super(value, holder);
+    private DescribedAsFacetForPropertyLayoutAnnotation(
+            final String described,
+            final FacetHolder holder) {
+        super(described, holder);
     }
 
 }
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/propertylayout/DescribedAsFacetForPropertyXml.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/propertylayout/DescribedAsFacetForPropertyXml.java
index 2189f80..a6e2d3e 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/propertylayout/DescribedAsFacetForPropertyXml.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/propertylayout/DescribedAsFacetForPropertyXml.java
@@ -24,13 +24,13 @@ import java.util.Optional;
 import org.apache.isis.applib.layout.component.PropertyLayoutData;
 import org.apache.isis.commons.internal.base._Strings;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
-import org.apache.isis.core.metamodel.facets.all.described.DescribedAsFacet;
-import org.apache.isis.core.metamodel.facets.all.described.DescribedAsFacetAbstract;
+import org.apache.isis.core.metamodel.facets.all.described.MemberDescribedFacet;
+import org.apache.isis.core.metamodel.facets.all.described.MemberDescribedFacetWithStaticTextAbstract;
 
 public class DescribedAsFacetForPropertyXml
-extends DescribedAsFacetAbstract {
+extends MemberDescribedFacetWithStaticTextAbstract {
 
-    public static Optional<DescribedAsFacet> create(
+    public static Optional<MemberDescribedFacet> create(
             final PropertyLayoutData propertyLayout,
             final FacetHolder holder) {
         if(propertyLayout == null) {
@@ -42,8 +42,10 @@ extends DescribedAsFacetAbstract {
                 : Optional.empty();
     }
 
-    private DescribedAsFacetForPropertyXml(final String value, final FacetHolder holder) {
-        super(value, holder);
+    private DescribedAsFacetForPropertyXml(
+            final String described,
+            final FacetHolder holder) {
+        super(described, holder);
     }
 
 }
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/propertylayout/NamedFacetForPropertyLayoutAnnotation.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/propertylayout/NamedFacetForPropertyLayoutAnnotation.java
index 7c18c5e..f9299d8 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/propertylayout/NamedFacetForPropertyLayoutAnnotation.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/propertylayout/NamedFacetForPropertyLayoutAnnotation.java
@@ -24,13 +24,13 @@ import java.util.Optional;
 import org.apache.isis.applib.annotation.PropertyLayout;
 import org.apache.isis.commons.internal.base._Strings;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
-import org.apache.isis.core.metamodel.facets.all.i8n.staatic.NounForms;
-import org.apache.isis.core.metamodel.facets.all.named.NamedFacetAbstract;
+import org.apache.isis.core.metamodel.facets.all.named.MemberNamedFacet;
+import org.apache.isis.core.metamodel.facets.all.named.MemberNamedFacetWithStaticTextAbstract;
 
 public class NamedFacetForPropertyLayoutAnnotation
-extends NamedFacetAbstract {
+extends MemberNamedFacetWithStaticTextAbstract {
 
-    public static Optional<NamedFacetForPropertyLayoutAnnotation> create(
+    public static Optional<MemberNamedFacet> create(
             final Optional<PropertyLayout> propertyLayoutIfAny,
             final FacetHolder holder) {
 
@@ -39,16 +39,14 @@ extends NamedFacetAbstract {
                 .map(propertyLayout ->
                     new NamedFacetForPropertyLayoutAnnotation(
                         propertyLayout.named(),
-                        propertyLayout.namedEscaped(),
                         holder));
     }
 
     private NamedFacetForPropertyLayoutAnnotation(
-            final String singularName,
-            final boolean escaped,
+            final String named,
             final FacetHolder holder) {
 
-        super(NounForms.preferredSingular(singularName).build(), escaped, holder);
+        super(named, holder);
     }
 
 }
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/propertylayout/NamedFacetForPropertyXml.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/propertylayout/NamedFacetForPropertyXml.java
index bb338fe..5d378c3 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/propertylayout/NamedFacetForPropertyXml.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/propertylayout/NamedFacetForPropertyXml.java
@@ -24,16 +24,15 @@ import java.util.Optional;
 import org.apache.isis.applib.layout.component.PropertyLayoutData;
 import org.apache.isis.commons.internal.base._Strings;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
-import org.apache.isis.core.metamodel.facets.all.i8n.staatic.NounForms;
-import org.apache.isis.core.metamodel.facets.all.named.NamedFacet;
-import org.apache.isis.core.metamodel.facets.all.named.NamedFacetAbstract;
+import org.apache.isis.core.metamodel.facets.all.named.MemberNamedFacet;
+import org.apache.isis.core.metamodel.facets.all.named.MemberNamedFacetWithStaticTextAbstract;
 
 import lombok.val;
 
 public class NamedFacetForPropertyXml
-extends NamedFacetAbstract {
+extends MemberNamedFacetWithStaticTextAbstract {
 
-    public static Optional<NamedFacet> create(
+    public static Optional<MemberNamedFacet> create(
             final PropertyLayoutData propertyLayout,
             final FacetHolder holder) {
 
@@ -41,29 +40,22 @@ extends NamedFacetAbstract {
             return Optional.empty();
         }
 
-        val nounForms = NounForms
-                .preferredSingular(_Strings.emptyToNull(propertyLayout.getNamed()))
-                .build();
+        val named = propertyLayout.getNamed();
 
-        if(nounForms.getSupportedNounForms().isEmpty()) {
+        if(_Strings.isEmpty(named)) {
             return Optional.empty();
         }
 
-        final Boolean _escaped = propertyLayout.getNamedEscaped();
-        final boolean escaped = (_escaped == null || _escaped);
-
         return Optional.of(
                 new NamedFacetForPropertyXml(
-                            nounForms,
-                            escaped,
+                            named,
                             holder));
     }
 
     private NamedFacetForPropertyXml(
-            final NounForms nounForms,
-            final boolean escaped,
+            final String named,
             final FacetHolder holder) {
-        super(nounForms, escaped, holder);
+        super(named, holder);
     }
 
 }
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/layout/LayoutFacetUtil.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/layout/LayoutFacetUtil.java
index a3d449e..d163db4 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/layout/LayoutFacetUtil.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/layout/LayoutFacetUtil.java
@@ -37,14 +37,16 @@ import org.apache.isis.applib.layout.component.HasNamed;
 import org.apache.isis.applib.layout.component.PropertyLayoutData;
 import org.apache.isis.applib.layout.grid.Grid;
 import org.apache.isis.commons.internal.base._Strings;
+import org.apache.isis.commons.internal.functions._Functions;
 import org.apache.isis.core.metamodel.facetapi.Facet;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
 import org.apache.isis.core.metamodel.facets.actions.position.ActionPositionFacet;
-import org.apache.isis.core.metamodel.facets.all.described.DescribedAsFacet;
+import org.apache.isis.core.metamodel.facets.all.described.MemberDescribedFacet;
+import org.apache.isis.core.metamodel.facets.all.described.ObjectDescribedFacet;
 import org.apache.isis.core.metamodel.facets.all.hide.HiddenFacet;
-import org.apache.isis.core.metamodel.facets.all.i8n.staatic.HasStaticText;
-import org.apache.isis.core.metamodel.facets.all.i8n.staatic.NounForm;
-import org.apache.isis.core.metamodel.facets.all.named.NamedFacet;
+import org.apache.isis.core.metamodel.facets.all.i8n.noun.NounForm;
+import org.apache.isis.core.metamodel.facets.all.named.MemberNamedFacet;
+import org.apache.isis.core.metamodel.facets.all.named.ObjectNamedFacet;
 import org.apache.isis.core.metamodel.facets.collections.collection.defaultview.DefaultViewFacet;
 import org.apache.isis.core.metamodel.facets.collections.sortedby.SortedByFacet;
 import org.apache.isis.core.metamodel.facets.members.cssclass.CssClassFacet;
@@ -128,21 +130,68 @@ public class LayoutFacetUtil {
         }
     }
 
-    public void setDescribedAsIfAny(
+    private void setObjectNamedIfAny(
+            final HasNamed hasNamed,
+            final FacetHolder facetHolder) {
+
+        facetHolder.lookupNonFallbackFacet(ObjectNamedFacet.class)
+        .filter(namedFacet->namedFacet.getSupportedNounForms().contains(NounForm.SINGULAR))
+        .ifPresent(namedFacet->{
+            final String named = namedFacet.translated(NounForm.SINGULAR);
+            if(!_Strings.isNullOrEmpty(named)){
+                hasNamed.setNamed(named);
+            }
+            hasNamed.setNamedEscaped(true);
+        });
+    }
+
+    private void setObjectDescribedIfAny(
             final HasDescribedAs hasDescribedAs,
             final FacetHolder facetHolder) {
 
-        facetHolder.lookupNonFallbackFacet(DescribedAsFacet.class)
-        .filter(describedAsFacet->describedAsFacet instanceof HasStaticText)
-        .map(HasStaticText.class::cast)
-        .ifPresent(describedAsFacet->{
-            final String describedAs = describedAsFacet.preferredTranslated();
-            if(!_Strings.isNullOrEmpty(describedAs)) {
+        facetHolder.lookupNonFallbackFacet(ObjectDescribedFacet.class)
+        .map(ObjectDescribedFacet::translated)
+        .ifPresent(describedAs->{
+            if(_Strings.isNotEmpty(describedAs)) {
                 hasDescribedAs.setDescribedAs(describedAs);
             }
         });
     }
 
+    private void setMemberNamedIfAny(
+            final HasNamed hasNamed,
+            final FacetHolder facetHolder) {
+
+        facetHolder.lookupNonFallbackFacet(MemberNamedFacet.class)
+        .map(MemberNamedFacet::getSpecialization)
+        .ifPresent(specialization->
+            specialization.accept(
+                    hasStaticText->{
+                        val describedAs = hasStaticText.translated();
+                        if(_Strings.isNotEmpty(describedAs)) {
+                            hasNamed.setNamed(describedAs);
+                        }
+                    },
+                    _Functions.noopConsumer())); // not supported for imperative text
+    }
+
+    private void setMemberDescribedIfAny(
+            final HasDescribedAs hasDescribedAs,
+            final FacetHolder facetHolder) {
+
+        facetHolder.lookupNonFallbackFacet(MemberDescribedFacet.class)
+        .map(MemberDescribedFacet::getSpecialization)
+        .ifPresent(specialization->
+            specialization.accept(
+                    hasStaticText->{
+                        val describedAs = hasStaticText.translated();
+                        if(_Strings.isNotEmpty(describedAs)) {
+                            hasDescribedAs.setDescribedAs(describedAs);
+                        }
+                    },
+                    _Functions.noopConsumer())); // not supported for imperative text
+    }
+
     public void setHiddenIfAny(
             final HasHidden hasHidden,
             final FacetHolder facetHolder) {
@@ -182,25 +231,7 @@ public class LayoutFacetUtil {
         }
     }
 
-    public void setNamedIfAny(
-            final HasNamed hasNamed,
-            final FacetHolder facetHolder) {
 
-        facetHolder.lookupNonFallbackFacet(NamedFacet.class)
-        .filter(namedFacet->namedFacet instanceof HasStaticText)
-        .map(HasStaticText.class::cast)
-        .filter(namedFacet->namedFacet.getSupportedNounForms().contains(NounForm.SINGULAR))
-        .ifPresent(namedFacet->{
-            final String named = namedFacet.translated(NounForm.SINGULAR);
-            if(!_Strings.isNullOrEmpty(named)){
-                hasNamed.setNamed(named);
-            }
-            final boolean escaped = ((NamedFacet)namedFacet).escaped();
-            if(!escaped) {
-                hasNamed.setNamedEscaped(escaped);
-            }
-        });
-    }
 
     public void setPagedIfAny(
             final CollectionLayoutData collectionLayoutData,
@@ -219,9 +250,7 @@ public class LayoutFacetUtil {
             final DomainObjectLayoutData domainObjectLayoutData,
             final FacetHolder facetHolder) {
 
-        facetHolder.lookupNonFallbackFacet(NamedFacet.class)
-        .filter(namedFacet->namedFacet instanceof HasStaticText)
-        .map(HasStaticText.class::cast)
+        facetHolder.lookupNonFallbackFacet(ObjectNamedFacet.class)
         .filter(namedFacet->namedFacet.getSupportedNounForms().contains(NounForm.PLURAL))
         .ifPresent(namedFacet->{
             val plural = namedFacet.translated(NounForm.PLURAL);
@@ -332,9 +361,9 @@ public class LayoutFacetUtil {
                 setBookmarkingIfAny(actionLayoutData, objectAction);
                 setCssClassIfAny(actionLayoutData, objectAction);
                 setCssClassFaIfAny(actionLayoutData, objectAction);
-                setDescribedAsIfAny(actionLayoutData, objectAction);
+                setMemberDescribedIfAny(actionLayoutData, objectAction);
                 setHiddenIfAny(actionLayoutData, objectAction);
-                setNamedIfAny(actionLayoutData, objectAction);
+                setMemberNamedIfAny(actionLayoutData, objectAction);
                 setActionPositionIfAny(actionLayoutData, objectAction);
             });
         }
@@ -345,9 +374,9 @@ public class LayoutFacetUtil {
             .ifPresent(collection->{
                 setCssClassIfAny(collectionLayoutData, collection);
                 setDefaultViewIfAny(collectionLayoutData, collection);
-                setDescribedAsIfAny(collectionLayoutData, collection);
+                setMemberDescribedIfAny(collectionLayoutData, collection);
                 setHiddenIfAny(collectionLayoutData, collection);
-                setNamedIfAny(collectionLayoutData, collection);
+                setMemberNamedIfAny(collectionLayoutData, collection);
                 setPagedIfAny(collectionLayoutData, collection);
                 setSortedByIfAny(collectionLayoutData, collection);
             });
@@ -358,9 +387,9 @@ public class LayoutFacetUtil {
             objectSpec.getAssociation(propertyLayoutData.getId())
             .ifPresent(property->{
                 setCssClassIfAny(propertyLayoutData, property);
-                setDescribedAsIfAny(propertyLayoutData, property);
+                setMemberDescribedIfAny(propertyLayoutData, property);
                 setHiddenIfAny(propertyLayoutData, property);
-                setNamedIfAny(propertyLayoutData, property);
+                setMemberNamedIfAny(propertyLayoutData, property);
                 setLabelPositionIfAny(propertyLayoutData, property);
                 setMultiLineIfAny(propertyLayoutData, property);
                 setRenderedAsDayBeforeIfAny(propertyLayoutData, property);
@@ -373,8 +402,8 @@ public class LayoutFacetUtil {
             setBookmarkingIfAny(domainObjectLayoutData, objectSpec);
             setCssClassIfAny(domainObjectLayoutData, objectSpec);
             setCssClassFaIfAny(domainObjectLayoutData, objectSpec);
-            setDescribedAsIfAny(domainObjectLayoutData, objectSpec);
-            setNamedIfAny(domainObjectLayoutData, objectSpec);
+            setObjectDescribedIfAny(domainObjectLayoutData, objectSpec);
+            setObjectNamedIfAny(domainObjectLayoutData, objectSpec);
             setPluralIfAny(domainObjectLayoutData, objectSpec);
         }
     }
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/postprocessors/all/DeriveDescribedAsFromTypePostProcessor.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/postprocessors/all/DeriveDescribedAsFromTypePostProcessor.java
index caf75e4..32e5687 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/postprocessors/all/DeriveDescribedAsFromTypePostProcessor.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/postprocessors/all/DeriveDescribedAsFromTypePostProcessor.java
@@ -23,11 +23,11 @@ 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.facets.all.described.DescribedAsFacet;
-import org.apache.isis.core.metamodel.facets.members.described.annotprop.DescribedAsFacetOnMemberDerivedFromType;
-import org.apache.isis.core.metamodel.facets.members.described.annotprop.DescribedAsFacetOnMemberFactory;
-import org.apache.isis.core.metamodel.facets.param.described.annotderived.DescribedAsFacetOnParameterAnnotationElseDerivedFromTypeFactory;
-import org.apache.isis.core.metamodel.facets.param.described.annotderived.DescribedAsFacetOnParameterDerivedFromType;
+import org.apache.isis.core.metamodel.facets.all.described.MemberDescribedFacet;
+import org.apache.isis.core.metamodel.facets.all.described.ObjectDescribedFacet;
+import org.apache.isis.core.metamodel.facets.all.described.ParamDescribedFacet;
+import org.apache.isis.core.metamodel.facets.members.described.annotprop.DescribedAsFacetOnMemberInferredFromType;
+import org.apache.isis.core.metamodel.facets.param.described.annotderived.DescribedAsFacetOnParameterInferredFromType;
 import org.apache.isis.core.metamodel.postprocessors.ObjectSpecificationPostProcessorAbstract;
 import org.apache.isis.core.metamodel.spec.ObjectSpecification;
 import org.apache.isis.core.metamodel.spec.feature.ObjectAction;
@@ -36,10 +36,6 @@ import org.apache.isis.core.metamodel.spec.feature.ObjectAssociation;
 import org.apache.isis.core.metamodel.spec.feature.OneToManyAssociation;
 import org.apache.isis.core.metamodel.spec.feature.OneToOneAssociation;
 
-/**
- * Replaces some of the functionality in {@link DescribedAsFacetOnMemberFactory} and
- * {@link DescribedAsFacetOnParameterAnnotationElseDerivedFromTypeFactory}.
- */
 public class DeriveDescribedAsFromTypePostProcessor
 extends ObjectSpecificationPostProcessorAbstract {
 
@@ -55,13 +51,13 @@ extends ObjectSpecificationPostProcessorAbstract {
 
     @Override
     protected void doPostProcess(final ObjectSpecification objectSpecification, final ObjectAction objectAction) {
-        if(objectAction.containsNonFallbackFacet(DescribedAsFacet.class)) {
+        if(objectAction.containsNonFallbackFacet(MemberDescribedFacet.class)) {
             return;
         }
         objectAction.getReturnType()
-        .lookupNonFallbackFacet(DescribedAsFacet.class)
+        .lookupNonFallbackFacet(ObjectDescribedFacet.class)
         .ifPresent(specFacet -> FacetUtil.addFacetIfPresent(
-                DescribedAsFacetOnMemberDerivedFromType
+                DescribedAsFacetOnMemberInferredFromType
                 .create(
                         specFacet,
                         facetedMethodFor(objectAction))));
@@ -69,14 +65,14 @@ extends ObjectSpecificationPostProcessorAbstract {
 
     @Override
     protected void doPostProcess(final ObjectSpecification objectSpecification, final ObjectAction objectAction, final ObjectActionParameter parameter) {
-        if(parameter.containsNonFallbackFacet(DescribedAsFacet.class)) {
+        if(parameter.containsNonFallbackFacet(ParamDescribedFacet.class)) {
             return;
         }
         final ObjectSpecification paramSpec = parameter.getSpecification();
-        paramSpec.lookupNonFallbackFacet(DescribedAsFacet.class)
+        paramSpec.lookupNonFallbackFacet(ObjectDescribedFacet.class)
         .ifPresent(describedAsFacet->{
             FacetUtil.addFacetIfPresent(
-                    DescribedAsFacetOnParameterDerivedFromType
+                    DescribedAsFacetOnParameterInferredFromType
                     .create(describedAsFacet, peerFor(parameter)));
         });
     }
@@ -92,13 +88,13 @@ extends ObjectSpecificationPostProcessorAbstract {
     }
 
     private void handle(final ObjectAssociation objectAssociation) {
-        if(objectAssociation.containsNonFallbackFacet(DescribedAsFacet.class)) {
+        if(objectAssociation.containsNonFallbackFacet(MemberDescribedFacet.class)) {
             return;
         }
         objectAssociation.getSpecification()
-        .lookupNonFallbackFacet(DescribedAsFacet.class)
+        .lookupNonFallbackFacet(ObjectDescribedFacet.class)
         .ifPresent(specFacet -> FacetUtil.addFacetIfPresent(
-                DescribedAsFacetOnMemberDerivedFromType
+                DescribedAsFacetOnMemberInferredFromType
                 .create(specFacet, facetedMethodFor(objectAssociation))));
     }
 
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/postprocessors/all/i18n/TranslationPostProcessor.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/postprocessors/all/i18n/TranslationPostProcessor.java
index 39e3a71..fc9f9bf 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/postprocessors/all/i18n/TranslationPostProcessor.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/postprocessors/all/i18n/TranslationPostProcessor.java
@@ -19,14 +19,21 @@
 package org.apache.isis.core.metamodel.postprocessors.all.i18n;
 
 
+import java.util.Optional;
+import java.util.stream.Stream;
+
 import javax.inject.Inject;
 
-import org.apache.isis.commons.internal.functions._Functions;
 import org.apache.isis.core.metamodel.context.MetaModelContext;
+import org.apache.isis.core.metamodel.facetapi.Facet;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
-import org.apache.isis.core.metamodel.facets.all.described.DescribedAsFacet;
-import org.apache.isis.core.metamodel.facets.all.i8n.staatic.HasStaticText;
-import org.apache.isis.core.metamodel.facets.all.named.NamedFacet;
+import org.apache.isis.core.metamodel.facets.all.described.MemberDescribedFacet;
+import org.apache.isis.core.metamodel.facets.all.described.ObjectDescribedFacet;
+import org.apache.isis.core.metamodel.facets.all.described.ParamDescribedFacet;
+import org.apache.isis.core.metamodel.facets.all.i8n.HasMemoizableTranslation;
+import org.apache.isis.core.metamodel.facets.all.named.MemberNamedFacet;
+import org.apache.isis.core.metamodel.facets.all.named.ObjectNamedFacet;
+import org.apache.isis.core.metamodel.facets.all.named.ParamNamedFacet;
 import org.apache.isis.core.metamodel.postprocessors.ObjectSpecificationPostProcessorAbstract;
 import org.apache.isis.core.metamodel.spec.ObjectSpecification;
 import org.apache.isis.core.metamodel.spec.feature.ObjectAction;
@@ -77,19 +84,19 @@ extends ObjectSpecificationPostProcessorAbstract {
     // -- HELPER
 
     private void memoizeTranslations(final FacetHolder facetHolder) {
-        facetHolder
-            .lookupFacet(NamedFacet.class)
-            .map(NamedFacet::getSpecialization)
-            .ifPresent(specialization->specialization
-                    .accept(  HasStaticText::memoizeTranslations,
-                              _Functions.noopConsumer()));
-
-        facetHolder
-            .lookupFacet(DescribedAsFacet.class)
-            .map(DescribedAsFacet::getSpecialization)
-            .ifPresent(specialization->specialization
-                    .accept(  HasStaticText::memoizeTranslations,
-                              _Functions.noopConsumer()));
+
+        Stream.<Optional<? extends Facet>>of(
+                facetHolder.lookupFacet(ObjectNamedFacet.class),
+                facetHolder.lookupFacet(MemberNamedFacet.class),
+                facetHolder.lookupFacet(ParamNamedFacet.class),
+                facetHolder.lookupFacet(ObjectDescribedFacet.class),
+                facetHolder.lookupFacet(MemberDescribedFacet.class),
+                facetHolder.lookupFacet(ParamDescribedFacet.class))
+        .filter(Optional::isPresent)
+        .map(Optional::get)
+        .filter(facet->facet instanceof HasMemoizableTranslation)
+        .map(HasMemoizableTranslation.class::cast)
+        .forEach(HasMemoizableTranslation::memoizeTranslations);
 
     }
 
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/progmodels/dflt/ProgrammingModelFacetsJava8.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/progmodels/dflt/ProgrammingModelFacetsJava8.java
index 8156a06..b8b7fdb 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/progmodels/dflt/ProgrammingModelFacetsJava8.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/progmodels/dflt/ProgrammingModelFacetsJava8.java
@@ -38,7 +38,6 @@ import org.apache.isis.core.metamodel.facets.fallback.FallbackFacetFactory;
 import org.apache.isis.core.metamodel.facets.jaxb.JaxbFacetFactory;
 import org.apache.isis.core.metamodel.facets.members.cssclass.annotprop.CssClassFacetOnActionFromConfiguredRegexFactory;
 import org.apache.isis.core.metamodel.facets.members.cssclassfa.annotprop.CssClassFaFacetOnMemberFactory;
-import org.apache.isis.core.metamodel.facets.members.described.annotprop.DescribedAsFacetOnMemberFactory;
 import org.apache.isis.core.metamodel.facets.members.described.method.DescribedAsFacetForMemberViaMethodFactory;
 import org.apache.isis.core.metamodel.facets.members.disabled.method.DisableForContextFacetViaMethodFactory;
 import org.apache.isis.core.metamodel.facets.members.hidden.method.HideForContextFacetViaMethodFactory;
@@ -252,8 +251,6 @@ extends ProgrammingModelAbstract {
 
         addFactory(FacetProcessingOrder.E1_MEMBER_MODELLING, new DefaultedFacetAnnotationElseConfigurationFactory(mmc));
 
-        addFactory(FacetProcessingOrder.E1_MEMBER_MODELLING, new DescribedAsFacetOnMemberFactory(mmc));
-
         addFactory(FacetProcessingOrder.E1_MEMBER_MODELLING, new BigDecimalFacetOnParameterFromJavaxValidationAnnotationFactory(mmc));
         addFactory(FacetProcessingOrder.E1_MEMBER_MODELLING, new BigDecimalFacetOnPropertyFromJavaxValidationDigitsAnnotationFactory(mmc));
 
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/grid/GridSystemServiceAbstract.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/grid/GridSystemServiceAbstract.java
index c83766b..7714c8e 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/grid/GridSystemServiceAbstract.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/grid/GridSystemServiceAbstract.java
@@ -49,7 +49,7 @@ import org.apache.isis.core.metamodel.facets.actions.layout.HiddenFacetForAction
 import org.apache.isis.core.metamodel.facets.actions.layout.NamedFacetForActionXml;
 import org.apache.isis.core.metamodel.facets.actions.layout.PromptStyleFacetForActionXml;
 import org.apache.isis.core.metamodel.facets.actions.layout.RedirectFacetFromActionXml;
-import org.apache.isis.core.metamodel.facets.all.named.NamedFacet;
+import org.apache.isis.core.metamodel.facets.all.named.MemberNamedFacet;
 import org.apache.isis.core.metamodel.facets.collections.layout.CssClassFacetForCollectionXml;
 import org.apache.isis.core.metamodel.facets.collections.layout.DefaultViewFacetForCollectionXml;
 import org.apache.isis.core.metamodel.facets.collections.layout.DescribedAsFacetForCollectionXml;
@@ -262,7 +262,7 @@ implements GridSystemService<G> {
                 addFacetIfPresent(DescribedAsFacetForActionXml.create(actionLayoutData, objectAction));
                 addFacetIfPresent(HiddenFacetForActionXml.create(actionLayoutData, objectAction));
                 // preserve translations
-                NamedFacet existingNamedFacet = objectAction.getFacet(NamedFacet.class);
+                val existingNamedFacet = objectAction.getFacet(MemberNamedFacet.class);
                 if(existingNamedFacet == null) {
                     addFacetIfPresent(NamedFacetForActionXml.create(actionLayoutData, objectAction));
                 }
@@ -283,7 +283,7 @@ implements GridSystemService<G> {
                 addFacetIfPresent(LabelAtFacetForPropertyXml.create(propertyLayoutData, oneToOneAssociation));
                 addFacetIfPresent(MultiLineFacetForPropertyXml.create(propertyLayoutData, oneToOneAssociation));
                 // preserve translations
-                NamedFacet existingNamedFacet = oneToOneAssociation.getFacet(NamedFacet.class);
+                val existingNamedFacet = oneToOneAssociation.getFacet(MemberNamedFacet.class);
                 if(existingNamedFacet == null) {
                     addFacetIfPresent(NamedFacetForPropertyXml.create(propertyLayoutData, oneToOneAssociation));
                 }
@@ -313,7 +313,7 @@ implements GridSystemService<G> {
                 addFacetIfPresent(DescribedAsFacetForCollectionXml.create(collectionLayoutData, oneToManyAssociation));
                 addFacetIfPresent(HiddenFacetForCollectionXml.create(collectionLayoutData, oneToManyAssociation));
                 // preserve translations
-                NamedFacet existingNamedFacet = oneToManyAssociation.getFacet(NamedFacet.class);
+                val existingNamedFacet = oneToManyAssociation.getFacet(MemberNamedFacet.class);
                 if(existingNamedFacet == null) {
                     addFacetIfPresent(NamedFacetForCollectionXml.create(collectionLayoutData, oneToManyAssociation));
                 }
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/ManagedObject.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/ManagedObject.java
index 41c0de8..b17ef86 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/ManagedObject.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/ManagedObject.java
@@ -291,9 +291,4 @@ public interface ManagedObject {
     }
 
 
-
-
-
-
-
 }
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/ObjectSpecification.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/ObjectSpecification.java
index 640d094..ada2b27 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/ObjectSpecification.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/ObjectSpecification.java
@@ -43,12 +43,13 @@ import org.apache.isis.core.metamodel.consent.Consent;
 import org.apache.isis.core.metamodel.consent.InteractionInitiatedBy;
 import org.apache.isis.core.metamodel.consent.InteractionResult;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
-import org.apache.isis.core.metamodel.facets.all.described.DescribedAsFacet;
+import org.apache.isis.core.metamodel.facets.all.described.ObjectDescribedFacet;
 import org.apache.isis.core.metamodel.facets.all.help.HelpFacet;
 import org.apache.isis.core.metamodel.facets.all.hide.HiddenFacet;
+import org.apache.isis.core.metamodel.facets.all.i8n.noun.HasNoun;
+import org.apache.isis.core.metamodel.facets.all.i8n.noun.NounForm;
 import org.apache.isis.core.metamodel.facets.all.i8n.staatic.HasStaticText;
-import org.apache.isis.core.metamodel.facets.all.i8n.staatic.NounForm;
-import org.apache.isis.core.metamodel.facets.all.named.NamedFacet;
+import org.apache.isis.core.metamodel.facets.all.named.ObjectNamedFacet;
 import org.apache.isis.core.metamodel.facets.collections.CollectionFacet;
 import org.apache.isis.core.metamodel.facets.members.cssclass.CssClassFacet;
 import org.apache.isis.core.metamodel.facets.object.encodeable.EncodableFacet;
@@ -168,18 +169,18 @@ extends
     /**
      * Returns the (singular) name for objects of this specification.
      * <p>
-     * Corresponds to the {@link HasStaticText#translated(NounForm)}
+     * Corresponds to the {@link HasNoun#translated(NounForm)}
      * with {@link NounForm#SINGULAR}
-     * of {@link NamedFacet}; is
+     * of {@link ObjectNamedFacet}; is
      * not necessarily immutable.
      */
     String getSingularName();
 
     /**
      * Returns the plural name for objects of this specification.
-     * Corresponds to the {@link HasStaticText#translated(NounForm)}
+     * Corresponds to the {@link HasNoun#translated(NounForm)}
      * with {@link NounForm#PLURAL}
-     * of {@link NamedFacet}; is
+     * of {@link ObjectNamedFacet}; is
      * not necessarily immutable.
      */
     String getPluralName();
@@ -188,8 +189,8 @@ extends
      * Returns the description, if any, of the specification.
      *
      * <p>
-     * Corresponds to the {@link HasStaticText#preferredTranslated() value} of
-     * {@link DescribedAsFacet}; is not necessarily immutable.
+     * Corresponds to the {@link HasStaticText#translated() value} of
+     * {@link ObjectDescribedFacet}; is not necessarily immutable.
      */
     String getDescription();
 
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/feature/ObjectActionParameter.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/feature/ObjectActionParameter.java
index 3ec749f..3fc4cd4 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/feature/ObjectActionParameter.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/feature/ObjectActionParameter.java
@@ -27,7 +27,7 @@ import javax.enterprise.inject.Vetoed;
 import org.apache.isis.commons.collections.Can;
 import org.apache.isis.core.metamodel.consent.Consent;
 import org.apache.isis.core.metamodel.consent.InteractionInitiatedBy;
-import org.apache.isis.core.metamodel.facets.all.named.NamedFacet;
+import org.apache.isis.core.metamodel.facets.all.named.MemberNamedFacet;
 import org.apache.isis.core.metamodel.interactions.ActionArgValidityContext;
 import org.apache.isis.core.metamodel.interactions.InteractionHead;
 import org.apache.isis.core.metamodel.interactions.managed.ParameterNegotiationModel;
@@ -60,7 +60,7 @@ public interface ObjectActionParameter extends ObjectFeature, CurrentHolder {
      * of the parameter, we have to do figure out the name of the parameter
      * ourselves:
      * <ul>
-     * <li>If there is a {@link NamedFacet} associated with this parameter then
+     * <li>If there is a {@link MemberNamedFacet} associated with this parameter then
      * we infer a name from this, eg "First Name" becomes "firstName".
      * <li>Otherwise we use the type, eg "string".
      * <li>If there is more than one parameter of the same type, then we use a
@@ -130,7 +130,7 @@ public interface ObjectActionParameter extends ObjectFeature, CurrentHolder {
     }
 
     /** default value as result of a initial param value fixed point search */
-    default ManagedObject getDefault(ManagedObject actionOnwer) {
+    default ManagedObject getDefault(final ManagedObject actionOnwer) {
         return getAction()
                 .interactionHead(actionOnwer).defaults()
                 .getParamValues()
@@ -261,7 +261,7 @@ public interface ObjectActionParameter extends ObjectFeature, CurrentHolder {
         }
     }
 
-    default String getCssClass(String prefix) {
+    default String getCssClass(final String prefix) {
         return getAction().getCssClass(prefix) + "-" + getId();
     }
 
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 86d6c32..2bc71b7 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
@@ -27,9 +27,8 @@ import org.apache.isis.core.metamodel.consent.InteractionInitiatedBy;
 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.all.i8n.staatic.NounForm;
-import org.apache.isis.core.metamodel.facets.all.named.NamedFacet;
-import org.apache.isis.core.metamodel.facets.all.named.NamedFacetForMemberName;
+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.interactions.InteractionHead;
 import org.apache.isis.core.metamodel.interactions.managed.ActionInteractionHead;
 import org.apache.isis.core.metamodel.spec.ManagedObject;
@@ -91,12 +90,13 @@ implements MixedInMember {
 
         // adjust name if necessary
 
-        val isExplicitlyNamed = lookupNonFallbackFacet(NamedFacet.class)
+        val isExplicitlyNamed = lookupNonFallbackFacet(MemberNamedFacet.class)
                 .isPresent();
 
         if(!isExplicitlyNamed) {
             val memberName = determineNameFrom(mixinAction);
-            this.addFacet(new NamedFacetForMemberName(NounForm.SINGULAR, memberName, facetHolder));
+            this.addFacet(
+                    new MemberNamedFacetForStaticMemberName(memberName, facetHolder));
         }
     }
 
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectActionParameterAbstract.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectActionParameterAbstract.java
index 6106648..f255021 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectActionParameterAbstract.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectActionParameterAbstract.java
@@ -36,9 +36,8 @@ import org.apache.isis.core.metamodel.facetapi.FacetHolder;
 import org.apache.isis.core.metamodel.facetapi.FeatureType;
 import org.apache.isis.core.metamodel.facetapi.HasFacetHolder;
 import org.apache.isis.core.metamodel.facets.TypedHolder;
-import org.apache.isis.core.metamodel.facets.all.described.DescribedAsFacet;
-import org.apache.isis.core.metamodel.facets.all.i8n.staatic.HasStaticText;
-import org.apache.isis.core.metamodel.facets.all.named.NamedFacet;
+import org.apache.isis.core.metamodel.facets.all.described.ParamDescribedFacet;
+import org.apache.isis.core.metamodel.facets.all.named.ParamNamedFacet;
 import org.apache.isis.core.metamodel.facets.param.autocomplete.ActionParameterAutoCompleteFacet;
 import org.apache.isis.core.metamodel.facets.param.autocomplete.MinLengthUtil;
 import org.apache.isis.core.metamodel.facets.param.choices.ActionParameterChoicesFacet;
@@ -135,11 +134,8 @@ implements ObjectActionParameter, HasFacetHolder {
     @Override
     public String getName() {
 
-        // assuming parameters don't have imperative naming support
-        val name = lookupFacet(NamedFacet.class)
-        .filter(namedFacet->namedFacet instanceof HasStaticText)
-        .map(HasStaticText.class::cast)
-        .map(HasStaticText::preferredTranslated)
+        val name = lookupFacet(ParamNamedFacet.class)
+        .map(ParamNamedFacet::translated)
         .orElse(null);
 
         if (name!=null) {
@@ -163,11 +159,8 @@ implements ObjectActionParameter, HasFacetHolder {
 
     @Override
     public String getDescription() {
-        // assuming parameters don't have imperative description support
-        return lookupFacet(DescribedAsFacet.class)
-        .filter(describedAsFacet->describedAsFacet instanceof HasStaticText)
-        .map(HasStaticText.class::cast)
-        .map(HasStaticText::preferredTranslated)
+        return lookupFacet(ParamDescribedFacet.class)
+        .map(ParamDescribedFacet::translated)
         .orElse("");
     }
 
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectMemberAbstract.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectMemberAbstract.java
index b8e605e..b7ffcfa 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectMemberAbstract.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectMemberAbstract.java
@@ -37,10 +37,10 @@ import org.apache.isis.core.metamodel.facetapi.Facet;
 import org.apache.isis.core.metamodel.facetapi.FeatureType;
 import org.apache.isis.core.metamodel.facetapi.HasFacetHolder;
 import org.apache.isis.core.metamodel.facets.FacetedMethod;
-import org.apache.isis.core.metamodel.facets.all.described.DescribedAsFacet;
+import org.apache.isis.core.metamodel.facets.all.described.MemberDescribedFacet;
 import org.apache.isis.core.metamodel.facets.all.help.HelpFacet;
 import org.apache.isis.core.metamodel.facets.all.hide.HiddenFacet;
-import org.apache.isis.core.metamodel.facets.all.named.NamedFacet;
+import org.apache.isis.core.metamodel.facets.all.named.MemberNamedFacet;
 import org.apache.isis.core.metamodel.facets.object.mixin.MixinFacet;
 import org.apache.isis.core.metamodel.interactions.AccessContext;
 import org.apache.isis.core.metamodel.interactions.DisablingInteractionAdvisor;
@@ -129,15 +129,15 @@ implements
 
         final ManagedObject owner = null; //TODO[ISIS-1720] must take ManagedObject (owner) as an argument
 
-        val namedFacet = getFacet(NamedFacet.class);
+        val namedFacet = getFacet(MemberNamedFacet.class);
 
         if(namedFacet==null) {
-            throw _Exceptions.unrecoverableFormatted("no NamedFacet preset on %s", getFeatureIdentifier());
+            throw _Exceptions.unrecoverableFormatted("no MemberNamedFacet preset on %s", getFeatureIdentifier());
         }
 
         return namedFacet
             .getSpecialization()
-            .fold(  textFacet->textFacet.preferredTranslated(),
+            .fold(  textFacet->textFacet.translated(),
                     textFacet->textFacet.textElseNull(owner));
     }
 
@@ -146,10 +146,10 @@ implements
 
         final ManagedObject owner = null; //TODO[ISIS-1720] must take ManagedObject (owner) as an argument
 
-        return lookupFacet(DescribedAsFacet.class)
-        .map(DescribedAsFacet::getSpecialization)
+        return lookupFacet(MemberDescribedFacet.class)
+        .map(MemberDescribedFacet::getSpecialization)
         .map(specialization->specialization
-                .fold(textFacet->textFacet.preferredTranslated(),
+                .fold(textFacet->textFacet.translated(),
                       textFacet->textFacet.textElseNull(owner)))
         .orElse(null);
     }
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectSpecificationAbstract.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectSpecificationAbstract.java
index cb10cae..8078b88 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectSpecificationAbstract.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectSpecificationAbstract.java
@@ -52,11 +52,11 @@ import org.apache.isis.core.metamodel.consent.InteractionInitiatedBy;
 import org.apache.isis.core.metamodel.consent.InteractionResult;
 import org.apache.isis.core.metamodel.facetapi.Facet;
 import org.apache.isis.core.metamodel.facetapi.FeatureType;
-import org.apache.isis.core.metamodel.facets.all.described.DescribedAsFacet;
+import org.apache.isis.core.metamodel.facets.all.described.ObjectDescribedFacet;
 import org.apache.isis.core.metamodel.facets.all.help.HelpFacet;
 import org.apache.isis.core.metamodel.facets.all.hide.HiddenFacet;
-import org.apache.isis.core.metamodel.facets.all.i8n.staatic.NounForm;
-import org.apache.isis.core.metamodel.facets.all.named.NamedFacet;
+import org.apache.isis.core.metamodel.facets.all.i8n.noun.NounForm;
+import org.apache.isis.core.metamodel.facets.all.named.ObjectNamedFacet;
 import org.apache.isis.core.metamodel.facets.members.cssclass.CssClassFacet;
 import org.apache.isis.core.metamodel.facets.object.encodeable.EncodableFacet;
 import org.apache.isis.core.metamodel.facets.object.icon.IconFacet;
@@ -484,35 +484,26 @@ implements ObjectSpecification {
 
     @Override
     public String getSingularName() {
-        return lookupFacet(NamedFacet.class)
-            .map(NamedFacet::getSpecialization)
-            .map(specialization->specialization
-                    .fold(  textFacet->textFacet.translatedElseNull(NounForm.SINGULAR),
-                            textFacet->textFacet.textElseNull(null)))
+        return lookupFacet(ObjectNamedFacet.class)
+            .map(textFacet->textFacet.translatedElseNull(NounForm.SINGULAR))
             .orElseGet(this::getFullIdentifier);
     }
 
     @Override
     public String getPluralName() {
-        return lookupFacet(NamedFacet.class)
-                .map(NamedFacet::getSpecialization)
-                .map(specialization->specialization
-                        .fold(  textFacet->textFacet.translatedElseNull(NounForm.PLURAL),
-                                textFacet->textFacet.textElseNull(null)))
+        return lookupFacet(ObjectNamedFacet.class)
+                .map(textFacet->textFacet.translatedElseNull(NounForm.PLURAL))
                 .orElseGet(this::getFullIdentifier);
     }
 
     /**
-     * The translated description according to any available {@link DescribedAsFacet},
+     * The translated description according to any available {@link ObjectDescribedFacet},
      * else empty string (<tt>""</tt>).
      */
     @Override
     public String getDescription() {
-        return lookupFacet(DescribedAsFacet.class)
-                .map(DescribedAsFacet::getSpecialization)
-                .map(specialization->specialization
-                        .fold(  textFacet->textFacet.preferredTranslated(),
-                                textFacet->textFacet.textElseNull(null)))
+        return lookupFacet(ObjectDescribedFacet.class)
+                .map(ObjectDescribedFacet::translated)
                 .orElse("");
     }
 
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 ec007bf..c7e3995 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
@@ -27,9 +27,8 @@ 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.TypeOfFacetAbstract;
-import org.apache.isis.core.metamodel.facets.all.i8n.staatic.NounForm;
-import org.apache.isis.core.metamodel.facets.all.named.NamedFacet;
-import org.apache.isis.core.metamodel.facets.all.named.NamedFacetForMemberName;
+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;
 import org.apache.isis.core.metamodel.facets.members.disabled.DisabledFacetForContributee;
 import org.apache.isis.core.metamodel.facets.propcoll.memserexcl.SnapshotExcludeFacetAbstract;
@@ -119,12 +118,13 @@ public class OneToManyAssociationMixedIn extends OneToManyAssociationDefault imp
         FacetUtil.copyFacetsTo(mixinAction.getFacetedMethod(), facetHolder);
 
         // adjust name if necessary
-        val isExplicitlyNamed = lookupNonFallbackFacet(NamedFacet.class)
+        val isExplicitlyNamed = lookupNonFallbackFacet(MemberNamedFacet.class)
                 .isPresent();
 
         if(!isExplicitlyNamed) {
             String memberName = determineNameFrom(mixinAction);
-            FacetUtil.addFacet(new NamedFacetForMemberName(NounForm.PLURAL, memberName, facetHolder));
+            FacetUtil.addFacet(
+                    new MemberNamedFacetForStaticMemberName(memberName, facetHolder));
         }
 
     }
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 b9b7f91..902ae71 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
@@ -25,9 +25,8 @@ import org.apache.isis.core.metamodel.consent.InteractionInitiatedBy;
 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.all.i8n.staatic.NounForm;
-import org.apache.isis.core.metamodel.facets.all.named.NamedFacet;
-import org.apache.isis.core.metamodel.facets.all.named.NamedFacetForMemberName;
+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;
 import org.apache.isis.core.metamodel.facets.members.disabled.DisabledFacetForContributee;
 import org.apache.isis.core.metamodel.interactions.InteractionHead;
@@ -100,14 +99,14 @@ public class OneToOneAssociationMixedIn extends OneToOneAssociationDefault imple
 
         FacetUtil.copyFacetsTo(mixinAction.getFacetedMethod(), facetHolder);
 
-
         // adjust name if necessary
-        val isExplicitlyNamed = lookupNonFallbackFacet(NamedFacet.class)
+        val isExplicitlyNamed = lookupNonFallbackFacet(MemberNamedFacet.class)
                 .isPresent();
 
         if(!isExplicitlyNamed) {
             String memberName = determineNameFrom(mixinAction);
-            FacetUtil.addFacet(new NamedFacetForMemberName(NounForm.SINGULAR, memberName, facetHolder));
+            FacetUtil.addFacet(
+                    new MemberNamedFacetForStaticMemberName(memberName, facetHolder));
         }
 
     }
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/dflt/ObjectSpecificationDefault.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/dflt/ObjectSpecificationDefault.java
index 65ed708..94e6a83 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/dflt/ObjectSpecificationDefault.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/dflt/ObjectSpecificationDefault.java
@@ -40,9 +40,8 @@ import org.apache.isis.core.metamodel.facetapi.FacetHolder;
 import org.apache.isis.core.metamodel.facets.FacetedMethod;
 import org.apache.isis.core.metamodel.facets.ImperativeFacet;
 import org.apache.isis.core.metamodel.facets.actcoll.typeof.TypeOfFacet;
-import org.apache.isis.core.metamodel.facets.all.i8n.staatic.NounForm;
-import org.apache.isis.core.metamodel.facets.all.named.NamedFacet;
-import org.apache.isis.core.metamodel.facets.all.named.NamedFacetForMemberName;
+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.object.value.ValueFacet;
 import org.apache.isis.core.metamodel.facets.object.viewmodel.ViewModelFacet;
 import org.apache.isis.core.metamodel.facets.object.wizard.WizardFacet;
@@ -118,7 +117,7 @@ implements FacetHolder {
         facetedMethodsBuilder.introspectClass();
 
         // name
-        addNamedFacetIfRequired(NounForm.SINGULAR);
+        addNamedFacetIfRequired();
 
         // go no further if a value
         if(this.containsFacet(ValueFacet.class)) {
@@ -177,15 +176,12 @@ implements FacetHolder {
         postProcess();
     }
 
-    private void addNamedFacetIfRequired(final NounForm nounForm) {
-        if (getFacet(NamedFacet.class) == null) {
-
-            addFacet(new NamedFacetForMemberName(
-                    nounForm,
+    private void addNamedFacetIfRequired() {
+        if (getFacet(MemberNamedFacet.class) == null) {
+            addFacet(new MemberNamedFacetForStaticMemberName(
                     StringExtensions.asNaturalName2(getShortIdentifier()),
                     this));
         }
-
     }
 
 
diff --git a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/collections/layout/annotation/NamedFacetForCollectionLayoutAnnotationFactoryTest.java b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/collections/layout/annotation/NamedFacetForCollectionLayoutAnnotationFactoryTest.java
index c8b2b70..ef3b7b7 100644
--- a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/collections/layout/annotation/NamedFacetForCollectionLayoutAnnotationFactoryTest.java
+++ b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/collections/layout/annotation/NamedFacetForCollectionLayoutAnnotationFactoryTest.java
@@ -20,7 +20,6 @@
 package org.apache.isis.core.metamodel.facets.collections.layout.annotation;
 
 import java.lang.reflect.Method;
-import java.util.Set;
 import java.util.SortedSet;
 
 import static org.hamcrest.MatcherAssert.assertThat;
@@ -34,8 +33,7 @@ import org.apache.isis.commons.internal.collections._Sets;
 import org.apache.isis.core.metamodel.facets.AbstractFacetFactoryTest;
 import org.apache.isis.core.metamodel.facets.FacetFactory;
 import org.apache.isis.core.metamodel.facets.all.i8n.staatic.HasStaticText;
-import org.apache.isis.core.metamodel.facets.all.i8n.staatic.NounForm;
-import org.apache.isis.core.metamodel.facets.all.named.NamedFacet;
+import org.apache.isis.core.metamodel.facets.all.named.MemberNamedFacet;
 import org.apache.isis.core.metamodel.facets.collections.layout.CollectionLayoutFacetFactory;
 import org.apache.isis.core.metamodel.facets.collections.layout.NamedFacetForCollectionLayoutAnnotation;
 
@@ -56,31 +54,10 @@ public class NamedFacetForCollectionLayoutAnnotationFactoryTest extends Abstract
 
         facetFactory.process(new FacetFactory.ProcessMethodContext(Customer.class, null, method, methodRemover, facetedMethod));
 
-        final NamedFacet facet = facetedMethod.getFacet(NamedFacet.class);
+        val facet = facetedMethod.getFacet(MemberNamedFacet.class);
         assertThat(facet, is(notNullValue()));
         assertThat(facet, is(instanceOf(NamedFacetForCollectionLayoutAnnotation.class)));
-        assertThat(((HasStaticText)facet).text(NounForm.PLURAL), is(equalTo("1st names")));
-        assertThat(facet.escaped(), is(true));
-    }
-
-    public void testCollectionLayoutAnnotationNamedEscapedFalse() {
-        val facetFactory = new CollectionLayoutFacetFactory(metaModelContext);
-
-        class Customer {
-            @CollectionLayout(named = "1st names", namedEscaped = false)
-            public Set<String> getFirstNames() {
-                return _Sets.newTreeSet();
-            }
-        }
-        final Method method = findMethod(Customer.class, "getFirstNames");
-
-        facetFactory.process(new FacetFactory.ProcessMethodContext(Customer.class, null, method, methodRemover, facetedMethod));
-
-        final NamedFacet facet = facetedMethod.getFacet(NamedFacet.class);
-        assertThat(facet, is(notNullValue()));
-        assertThat(facet, is(instanceOf(NamedFacetForCollectionLayoutAnnotation.class)));
-        assertThat(((HasStaticText)facet).text(NounForm.PLURAL), is(equalTo("1st names")));
-        assertThat(facet.escaped(), is(false));
+        assertThat(((HasStaticText)facet).text(), is(equalTo("1st names")));
     }
 
 }
diff --git a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/object/domainobjectlayout/DomainObjectLayoutFactoryTest.java b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/object/domainobjectlayout/DomainObjectLayoutFactoryTest.java
index 8902c7b..df79292 100644
--- a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/object/domainobjectlayout/DomainObjectLayoutFactoryTest.java
+++ b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/object/domainobjectlayout/DomainObjectLayoutFactoryTest.java
@@ -40,16 +40,18 @@ import org.apache.isis.applib.layout.component.CssClassFaPosition;
 import org.apache.isis.core.metamodel.facetapi.Facet;
 import org.apache.isis.core.metamodel.facets.AbstractFacetFactoryJUnit4TestCase;
 import org.apache.isis.core.metamodel.facets.FacetFactory;
-import org.apache.isis.core.metamodel.facets.all.described.DescribedAsFacet;
-import org.apache.isis.core.metamodel.facets.all.i8n.staatic.HasStaticText;
-import org.apache.isis.core.metamodel.facets.all.i8n.staatic.NounForm;
-import org.apache.isis.core.metamodel.facets.all.named.NamedFacet;
+import org.apache.isis.core.metamodel.facets.all.described.ObjectDescribedFacet;
+import org.apache.isis.core.metamodel.facets.all.i8n.noun.HasNoun;
+import org.apache.isis.core.metamodel.facets.all.i8n.noun.NounForm;
+import org.apache.isis.core.metamodel.facets.all.named.ObjectNamedFacet;
 import org.apache.isis.core.metamodel.facets.members.cssclass.CssClassFacet;
 import org.apache.isis.core.metamodel.facets.members.cssclassfa.CssClassFaFacet;
 import org.apache.isis.core.metamodel.facets.object.bookmarkpolicy.BookmarkPolicyFacet;
 import org.apache.isis.core.metamodel.facets.object.paged.PagedFacet;
 import org.apache.isis.core.metamodel.spec.ManagedObject;
 
+import lombok.val;
+
 public class DomainObjectLayoutFactoryTest
 extends AbstractFacetFactoryJUnit4TestCase {
 
@@ -248,7 +250,7 @@ extends AbstractFacetFactoryJUnit4TestCase {
 
                 facetFactory.process(new FacetFactory.ProcessClassContext(cls, mockMethodRemover, facetHolder));
 
-                final Facet facet = facetHolder.getFacet(DescribedAsFacet.class);
+                final Facet facet = facetHolder.getFacet(ObjectDescribedFacet.class);
                 assertNotNull(facet);
                 assertTrue(facet instanceof DescribedAsFacetForDomainObjectLayoutAnnotation);
 
@@ -265,7 +267,7 @@ extends AbstractFacetFactoryJUnit4TestCase {
 
                 facetFactory.process(new FacetFactory.ProcessClassContext(cls, mockMethodRemover, facetHolder));
 
-                final Facet facet = facetHolder.getFacet(DescribedAsFacet.class);
+                final Facet facet = facetHolder.getFacet(ObjectDescribedFacet.class);
                 assertNull(facet);
 
                 expectNoMethodsRemoved();
@@ -293,11 +295,11 @@ extends AbstractFacetFactoryJUnit4TestCase {
 
                 facetFactory.process(new FacetFactory.ProcessClassContext(cls, mockMethodRemover, facetHolder));
 
-                final NamedFacet namedFacet = facetHolder.getFacet(NamedFacet.class);
+                val namedFacet = facetHolder.getFacet(ObjectNamedFacet.class);
                 assertNotNull(namedFacet);
                 assertTrue(namedFacet instanceof NamedFacetForDomainObjectLayoutAnnotation);
 
-                assertEquals("Name override", ((HasStaticText)namedFacet).text(NounForm.SINGULAR));
+                assertEquals("Name override", ((HasNoun)namedFacet).text(NounForm.SINGULAR));
 
                 expectNoMethodsRemoved();
             }
@@ -309,7 +311,7 @@ extends AbstractFacetFactoryJUnit4TestCase {
 
                 facetFactory.process(new FacetFactory.ProcessClassContext(cls, mockMethodRemover, facetHolder));
 
-                final Facet facet = facetHolder.getFacet(NamedFacet.class);
+                val facet = facetHolder.getFacet(ObjectNamedFacet.class);
                 assertNull(facet);
 
                 expectNoMethodsRemoved();
@@ -381,10 +383,10 @@ extends AbstractFacetFactoryJUnit4TestCase {
 
                 facetFactory.process(new FacetFactory.ProcessClassContext(cls, mockMethodRemover, facetHolder));
 
-                final NamedFacet namedFacet = facetHolder.getFacet(NamedFacet.class);
+                val namedFacet = facetHolder.getFacet(ObjectNamedFacet.class);
                 assertNotNull(namedFacet);
 
-                assertEquals("Customers Plural Form", ((HasStaticText)namedFacet).translated(NounForm.PLURAL));
+                assertEquals("Customers Plural Form", ((HasNoun)namedFacet).translated(NounForm.PLURAL));
 
                 expectNoMethodsRemoved();
             }
@@ -396,7 +398,7 @@ extends AbstractFacetFactoryJUnit4TestCase {
 
                 facetFactory.process(new FacetFactory.ProcessClassContext(cls, mockMethodRemover, facetHolder));
 
-                final NamedFacet namedFacet = facetHolder.getFacet(NamedFacet.class);
+                val namedFacet = facetHolder.getFacet(ObjectNamedFacet.class);
                 assertNull(namedFacet);
 
                 //assertEquals("", namedFacet.translated(NounForm.PLURAL));
diff --git a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/param/layout/annotation/NamedFacetForParameterLayoutAnnotationFactoryTest.java b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/param/layout/annotation/NamedFacetForParameterLayoutAnnotationFactoryTest.java
index 517c8e7..a6832d6 100644
--- a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/param/layout/annotation/NamedFacetForParameterLayoutAnnotationFactoryTest.java
+++ b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/param/layout/annotation/NamedFacetForParameterLayoutAnnotationFactoryTest.java
@@ -22,7 +22,6 @@ package org.apache.isis.core.metamodel.facets.param.layout.annotation;
 import java.lang.reflect.Method;
 
 import static org.hamcrest.MatcherAssert.assertThat;
-import static org.hamcrest.Matchers.equalTo;
 import static org.hamcrest.Matchers.instanceOf;
 import static org.hamcrest.Matchers.is;
 import static org.hamcrest.Matchers.notNullValue;
@@ -30,12 +29,12 @@ import static org.hamcrest.Matchers.notNullValue;
 import org.apache.isis.applib.annotation.ParameterLayout;
 import org.apache.isis.core.metamodel.facets.AbstractFacetFactoryTest;
 import org.apache.isis.core.metamodel.facets.FacetFactory;
-import org.apache.isis.core.metamodel.facets.all.i8n.staatic.HasStaticText;
-import org.apache.isis.core.metamodel.facets.all.i8n.staatic.NounForm;
-import org.apache.isis.core.metamodel.facets.all.named.NamedFacet;
+import org.apache.isis.core.metamodel.facets.all.named.ParamNamedFacet;
 import org.apache.isis.core.metamodel.facets.param.layout.NamedFacetForParameterLayoutAnnotation;
 import org.apache.isis.core.metamodel.facets.param.layout.ParameterLayoutFacetFactory;
 
+import lombok.val;
+
 public class NamedFacetForParameterLayoutAnnotationFactoryTest extends AbstractFacetFactoryTest {
 
     private static final String NAME = "an action";
@@ -52,31 +51,10 @@ public class NamedFacetForParameterLayoutAnnotationFactoryTest extends AbstractF
 
         facetFactory.processParams(new FacetFactory.ProcessParameterContext(Customer.class, method, 0, null, facetedMethodParameter));
 
-        final NamedFacet facet = facetedMethodParameter.getFacet(NamedFacet.class);
-        assertThat(facet, is(notNullValue()));
-        assertThat(facet, is(instanceOf(NamedFacetForParameterLayoutAnnotation.class)));
-        assertEquals(NAME, ((HasStaticText)facet).text(NounForm.SINGULAR));
-        assertThat(facet.escaped(), is(true));
-    }
-
-    public void testParameterLayoutAnnotationNamedEscapedFalse() {
-        final ParameterLayoutFacetFactory facetFactory = new ParameterLayoutFacetFactory(metaModelContext);
-
-        class Customer {
-            @SuppressWarnings("unused")
-            public void someAction(@ParameterLayout(named = NAME, namedEscaped = false) final String foo) {
-            }
-        }
-        final Method method = findMethod(Customer.class, "someAction", new Class[]{String.class});
-
-        facetFactory.processParams(new FacetFactory.ProcessParameterContext(Customer.class, method, 0, null, facetedMethodParameter));
-
-        final NamedFacet facet = facetedMethodParameter.getFacet(NamedFacet.class);
+        val facet = facetedMethodParameter.getFacet(ParamNamedFacet.class);
         assertThat(facet, is(notNullValue()));
         assertThat(facet, is(instanceOf(NamedFacetForParameterLayoutAnnotation.class)));
-        assertThat(((HasStaticText)facet).text(NounForm.SINGULAR), is(equalTo(NAME)));
-        assertEquals(NAME, ((HasStaticText)facet).text(NounForm.SINGULAR));
-        assertThat(facet.escaped(), is(false));
+        assertEquals(NAME, facet.text());
     }
 
 }
diff --git a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/param/name/ParameterNameFacetTest.java b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/param/name/ParameterNameFacetTest.java
index 708dcd6..858ce98 100644
--- a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/param/name/ParameterNameFacetTest.java
+++ b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/param/name/ParameterNameFacetTest.java
@@ -32,9 +32,7 @@ import org.apache.isis.commons.internal.reflection._Reflect;
 import org.apache.isis.core.metamodel._testing.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.i8n.staatic.HasStaticText;
-import org.apache.isis.core.metamodel.facets.all.i8n.staatic.NounForm;
-import org.apache.isis.core.metamodel.facets.all.named.NamedFacet;
+import org.apache.isis.core.metamodel.facets.all.named.ParamNamedFacet;
 import org.apache.isis.core.metamodel.progmodel.ProgrammingModel;
 import org.apache.isis.core.metamodel.progmodels.dflt.ProgrammingModelFacetsJava8;
 
@@ -64,7 +62,7 @@ extends AbstractFacetFactoryJUnit4TestCase {
         programmingModel = metaModelContext.getProgrammingModel();
 
         // verify that
-        assertEquals(121, programmingModel.streamFactories().count());
+        assertEquals(120, programmingModel.streamFactories().count());
     }
 
     @Override
@@ -110,9 +108,9 @@ extends AbstractFacetFactoryJUnit4TestCase {
         .forEach(facetFactory->facetFactory.processParams(processParameterContext));
 
         // then
-        val namedFacet = facetedMethodParameter.getFacet(NamedFacet.class);
+        val namedFacet = facetedMethodParameter.getFacet(ParamNamedFacet.class);
 
-        assertEquals("An Awesome Name", ((HasStaticText)namedFacet).text(NounForm.SINGULAR));
+        assertEquals("An Awesome Name", namedFacet.text());
 
     }
 
@@ -140,9 +138,9 @@ extends AbstractFacetFactoryJUnit4TestCase {
         programmingModel.streamFactories().forEach(facetFactory->facetFactory.processParams(processParameterContext));
 
         // then
-        val namedFacet = facetedMethodParameter.getFacet(NamedFacet.class);
+        val namedFacet = facetedMethodParameter.getFacet(ParamNamedFacet.class);
         assertNotNull(namedFacet);
-        assertEquals("Even Better Name", ((HasStaticText)namedFacet).text(NounForm.SINGULAR));
+        assertEquals("Even Better Name", namedFacet.text());
 
     }
 
diff --git a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/properties/propertylayout/NamedFacetForPropertyLayoutAnnotationFactoryTest.java b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/properties/propertylayout/NamedFacetForPropertyLayoutAnnotationFactoryTest.java
index bd0cc17..1c0bb4d 100644
--- a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/properties/propertylayout/NamedFacetForPropertyLayoutAnnotationFactoryTest.java
+++ b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/properties/propertylayout/NamedFacetForPropertyLayoutAnnotationFactoryTest.java
@@ -31,8 +31,7 @@ import org.apache.isis.applib.annotation.PropertyLayout;
 import org.apache.isis.core.metamodel.facets.AbstractFacetFactoryTest;
 import org.apache.isis.core.metamodel.facets.FacetFactory;
 import org.apache.isis.core.metamodel.facets.all.i8n.staatic.HasStaticText;
-import org.apache.isis.core.metamodel.facets.all.i8n.staatic.NounForm;
-import org.apache.isis.core.metamodel.facets.all.named.NamedFacet;
+import org.apache.isis.core.metamodel.facets.all.named.MemberNamedFacet;
 
 import lombok.val;
 
@@ -58,40 +57,11 @@ extends AbstractFacetFactoryTest {
         facetFactory.process(processMethodContext);
 
         // then
-        final NamedFacet facet = facetedMethod.getFacet(NamedFacet.class);
+        val facet = facetedMethod.getFacet(MemberNamedFacet.class);
         assertThat(facet, is(notNullValue()));
         assertThat(facet, is(instanceOf(NamedFacetForPropertyLayoutAnnotation.class)));
-        assertThat(((HasStaticText)facet).text(NounForm.SINGULAR), is(equalTo("1st name")));
-        assertThat(facet.escaped(), is(true));
+        assertThat(((HasStaticText)facet).text(), is(equalTo("1st name")));
     }
 
-    public void testPropertyLayoutAnnotationNamedEscapedFalse() {
-        val facetFactory = createPropertyLayoutFacetFactory(metaModelContext);
-
-        class Customer {
-            @PropertyLayout(named = "1st name", namedEscaped = false)
-            public String getFirstName() {
-                return null;
-            }
-        }
-        final Method method = findMethod(Customer.class, "getFirstName");
-
-        // when
-        final FacetFactory.ProcessMethodContext processMethodContext
-            = new FacetFactory.ProcessMethodContext(Customer.class, null, method,
-                    methodRemover, facetedMethod);
-
-        facetFactory.process(processMethodContext);
-
-        // then
-        final NamedFacet facet = facetedMethod.getFacet(NamedFacet.class);
-        assertThat(facet, is(notNullValue()));
-        assertThat(facet, is(instanceOf(NamedFacetForPropertyLayoutAnnotation.class)));
-        assertThat(((HasStaticText)facet).text(NounForm.SINGULAR), is(equalTo("1st name")));
-        assertThat(facet.escaped(), is(false));
-    }
-
-
-
 
 }
diff --git a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/objects/ObjectActionLayoutXmlDefaultTest.java b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/objects/ObjectActionLayoutXmlDefaultTest.java
index 829522c..e71da62 100644
--- a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/objects/ObjectActionLayoutXmlDefaultTest.java
+++ b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/objects/ObjectActionLayoutXmlDefaultTest.java
@@ -37,15 +37,12 @@ import org.apache.isis.core.metamodel._testing.MetaModelContext_forTesting;
 import org.apache.isis.core.metamodel._testing.TranslationService_forTesting;
 import org.apache.isis.core.metamodel.context.MetaModelContext;
 import org.apache.isis.core.metamodel.facets.FacetedMethod;
-import org.apache.isis.core.metamodel.facets.all.i8n.staatic.NounForms;
-import org.apache.isis.core.metamodel.facets.all.named.NamedFacet;
-import org.apache.isis.core.metamodel.facets.all.named.NamedFacetAbstract;
+import org.apache.isis.core.metamodel.facets.all.named.MemberNamedFacet;
+import org.apache.isis.core.metamodel.facets.all.named.MemberNamedFacetWithStaticTextAbstract;
 import org.apache.isis.core.metamodel.id.TypeIdentifierTestFactory;
 import org.apache.isis.core.metamodel.specloader.SpecificationLoader;
 import org.apache.isis.core.metamodel.specloader.specimpl.ObjectActionDefault;
 
-import lombok.val;
-
 public class ObjectActionLayoutXmlDefaultTest {
 
     @Rule public JUnitRuleMockery2 context = JUnitRuleMockery2.createFor(Mode.INTERFACES_AND_CLASSES);
@@ -85,14 +82,11 @@ public class ObjectActionLayoutXmlDefaultTest {
     public void testNameDefaultsToActionsMethodName() {
         final String name = "Reduceheadcount";
 
-        val nounForms = NounForms.preferredSingular(name)
-        .build();
-
-        final NamedFacet facet =
-                new NamedFacetAbstract(nounForms, true, mockFacetedMethod) {};
+        final MemberNamedFacet facet =
+                new MemberNamedFacetWithStaticTextAbstract(name, mockFacetedMethod) {};
         context.checking(new Expectations() {
             {
-                oneOf(mockFacetedMethod).getFacet(NamedFacet.class);
+                oneOf(mockFacetedMethod).getFacet(MemberNamedFacet.class);
                 will(returnValue(facet));
             }
         });
diff --git a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/objects/OneToManyAssociationDefaultTest.java b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/objects/OneToManyAssociationDefaultTest.java
index eea0a29..62c632f 100644
--- a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/objects/OneToManyAssociationDefaultTest.java
+++ b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/objects/OneToManyAssociationDefaultTest.java
@@ -32,15 +32,13 @@ import static org.hamcrest.Matchers.is;
 import org.apache.isis.applib.Identifier;
 import org.apache.isis.applib.services.iactn.InteractionProvider;
 import org.apache.isis.applib.services.message.MessageService;
-import org.apache.isis.commons.collections.ImmutableEnumSet;
 import org.apache.isis.commons.internal.base._Either;
 import org.apache.isis.core.internaltestsupport.jmocking.JUnitRuleMockery2;
 import org.apache.isis.core.internaltestsupport.jmocking.JUnitRuleMockery2.Mode;
 import org.apache.isis.core.metamodel._testing.MetaModelContext_forTesting;
 import org.apache.isis.core.metamodel.facets.FacetedMethod;
 import org.apache.isis.core.metamodel.facets.all.i8n.staatic.HasStaticText;
-import org.apache.isis.core.metamodel.facets.all.i8n.staatic.NounForm;
-import org.apache.isis.core.metamodel.facets.all.named.NamedFacet;
+import org.apache.isis.core.metamodel.facets.all.named.MemberNamedFacet;
 import org.apache.isis.core.metamodel.id.TypeIdentifierTestFactory;
 import org.apache.isis.core.metamodel.spec.ManagedObject;
 import org.apache.isis.core.metamodel.spec.ObjectSpecification;
@@ -67,13 +65,12 @@ public class OneToManyAssociationDefaultTest {
     @Mock ObjectSpecification mockOwnerAdapterSpec;
     @Mock MessageService mockMessageService;
     @Mock FacetedMethod mockPeer;
-    @Mock NamedFacetStatic mockNamedFacet;
+    @Mock MemberNamedFacet mockNamedFacet;
+    @Mock HasStaticText mockHasStaticText;
 
     private OneToManyAssociation association;
     private MetaModelContext_forTesting metaModelContext;
 
-    private static interface NamedFacetStatic extends NamedFacet, HasStaticText {};
-
     @Before
     public void setUp() {
 
@@ -134,18 +131,15 @@ public class OneToManyAssociationDefaultTest {
     private void expectPeerToReturnNamedFacet() {
         context.checking(new Expectations() {
             {
-                oneOf(mockPeer).getFacet(NamedFacet.class);
+                oneOf(mockPeer).getFacet(MemberNamedFacet.class);
                 will(returnValue(mockNamedFacet));
 
                 allowing(mockNamedFacet).getSpecialization();
-                will(returnValue(_Either.left(mockNamedFacet)));
+                will(returnValue(_Either.left(mockHasStaticText)));
 
-                allowing(mockNamedFacet).preferredTranslated();
+                allowing(mockHasStaticText).translated();
                 will(returnValue("My name"));
 
-                allowing(mockNamedFacet).getSupportedNounForms();
-                will(returnValue(ImmutableEnumSet.of(NounForm.SINGULAR)));
-
             }
         });
     }
diff --git a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/specloader/SpecificationLoaderTestAbstract.java b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/specloader/SpecificationLoaderTestAbstract.java
index 0dbbe23..6db5217 100644
--- a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/specloader/SpecificationLoaderTestAbstract.java
+++ b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/specloader/SpecificationLoaderTestAbstract.java
@@ -21,6 +21,7 @@ package org.apache.isis.core.metamodel.specloader;
 
 import org.junit.jupiter.api.AfterEach;
 import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Disabled;
 import org.junit.jupiter.api.Test;
 import org.mockito.Mockito;
 import org.springframework.core.env.ConfigurableEnvironment;
@@ -36,13 +37,16 @@ import org.apache.isis.applib.services.iactn.InteractionProvider;
 import org.apache.isis.applib.services.inject.ServiceInjector;
 import org.apache.isis.applib.services.message.MessageService;
 import org.apache.isis.applib.services.title.TitleService;
+import org.apache.isis.commons.internal.base._Optionals;
 import org.apache.isis.core.config.IsisConfiguration;
 import org.apache.isis.core.metamodel._testing.MetaModelContext_forTesting;
 import org.apache.isis.core.metamodel.context.MetaModelContext;
 import org.apache.isis.core.metamodel.facetapi.Facet;
 import org.apache.isis.core.metamodel.facets.actcoll.typeof.TypeOfFacet;
-import org.apache.isis.core.metamodel.facets.all.described.DescribedAsFacet;
-import org.apache.isis.core.metamodel.facets.all.named.NamedFacet;
+import org.apache.isis.core.metamodel.facets.all.described.MemberDescribedFacet;
+import org.apache.isis.core.metamodel.facets.all.described.ObjectDescribedFacet;
+import org.apache.isis.core.metamodel.facets.all.named.MemberNamedFacet;
+import org.apache.isis.core.metamodel.facets.all.named.ObjectNamedFacet;
 import org.apache.isis.core.metamodel.facets.collections.CollectionFacet;
 import org.apache.isis.core.metamodel.progmodels.dflt.ProgrammingModelFacetsJava8;
 import org.apache.isis.core.metamodel.spec.ObjectSpecification;
@@ -153,13 +157,25 @@ abstract class SpecificationLoaderTestAbstract {
 
     @Test
     public void testNamedFaced() throws Exception {
-        final Facet facet = specification.getFacet(NamedFacet.class);
+
+        val facet =
+                _Optionals.<Facet>or(
+                        specification.lookupFacet(ObjectNamedFacet.class),
+                        ()->specification.lookupFacet(MemberNamedFacet.class))
+                .orElse(null);
+
         assertNotNull(facet);
     }
 
-    @Test
+    @Test @Disabled("we allow descriptions to be absent - no need to install empty fallbacks")
     public void testDescriptionFacet() throws Exception {
-        final Facet facet = specification.getFacet(DescribedAsFacet.class);
+
+        val facet =
+                _Optionals.<Facet>or(
+                        specification.lookupFacet(ObjectDescribedFacet.class),
+                        ()->specification.lookupFacet(MemberDescribedFacet.class))
+                .orElse(null);
+
         assertNotNull(facet);
     }
 
diff --git a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectActionParameterAbstractTest_getId_and_getName.java b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectActionParameterAbstractTest_getId_and_getName.java
index 28adb1d..ebe4eb9 100644
--- a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectActionParameterAbstractTest_getId_and_getName.java
+++ b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectActionParameterAbstractTest_getId_and_getName.java
@@ -38,8 +38,7 @@ import org.apache.isis.core.metamodel.consent.Consent;
 import org.apache.isis.core.metamodel.consent.InteractionInitiatedBy;
 import org.apache.isis.core.metamodel.facetapi.FeatureType;
 import org.apache.isis.core.metamodel.facets.TypedHolder;
-import org.apache.isis.core.metamodel.facets.all.i8n.staatic.HasStaticText;
-import org.apache.isis.core.metamodel.facets.all.named.NamedFacet;
+import org.apache.isis.core.metamodel.facets.all.named.ParamNamedFacet;
 import org.apache.isis.core.metamodel.interactions.InteractionHead;
 import org.apache.isis.core.metamodel.spec.ManagedObject;
 import org.apache.isis.core.metamodel.spec.ObjectSpecification;
@@ -56,7 +55,7 @@ public class ObjectActionParameterAbstractTest_getId_and_getName {
     @Mock
     private TypedHolder actionParamPeer;
     @Mock
-    private NamedFacetStatic namedFacet;
+    private ParamNamedFacet namedFacet;
 
     @Mock
     private ObjectSpecification stubSpecForString;
@@ -65,9 +64,6 @@ public class ObjectActionParameterAbstractTest_getId_and_getName {
     @Mock
     private ObjectActionParameter stubObjectActionParameterString2;
 
-
-    private static interface NamedFacetStatic extends NamedFacet, HasStaticText {};
-
     private static final class ObjectActionParameterAbstractToTest extends ObjectActionParameterAbstract {
         private ObjectActionParameterAbstractToTest(final int number, final ObjectActionDefault objectAction, final TypedHolder peer) {
             super(FeatureType.ACTION_PARAMETER_SCALAR, number, objectAction, peer);
@@ -136,10 +132,10 @@ public class ObjectActionParameterAbstractTest_getId_and_getName {
 
         context.checking(new Expectations() {
             {
-                oneOf(actionParamPeer).getFacet(NamedFacet.class);
+                oneOf(actionParamPeer).getFacet(ParamNamedFacet.class);
                 will(returnValue(namedFacet));
 
-                atLeast(1).of(namedFacet).preferredTranslated();
+                atLeast(1).of(namedFacet).translated();
                 will(returnValue("Some parameter name"));
             }
         });
@@ -154,10 +150,10 @@ public class ObjectActionParameterAbstractTest_getId_and_getName {
 
         context.checking(new Expectations() {
             {
-                oneOf(actionParamPeer).getFacet(NamedFacet.class);
+                oneOf(actionParamPeer).getFacet(ParamNamedFacet.class);
                 will(returnValue(namedFacet));
 
-                atLeast(1).of(namedFacet).preferredTranslated();
+                atLeast(1).of(namedFacet).translated();
                 will(returnValue("Some parameter name"));
             }
         });
@@ -173,7 +169,7 @@ public class ObjectActionParameterAbstractTest_getId_and_getName {
 
         context.checking(new Expectations() {
             {
-                oneOf(actionParamPeer).getFacet(NamedFacet.class);
+                oneOf(actionParamPeer).getFacet(ParamNamedFacet.class);
                 will(returnValue(null));
 
                 oneOf(parentAction).getParameters(with(Expectations.<Predicate<ObjectActionParameter>>anything()));
@@ -192,7 +188,7 @@ public class ObjectActionParameterAbstractTest_getId_and_getName {
 
         context.checking(new Expectations() {
             {
-                oneOf(actionParamPeer).getFacet(NamedFacet.class);
+                oneOf(actionParamPeer).getFacet(ParamNamedFacet.class);
                 will(returnValue(null));
 
                 oneOf(parentAction).getParameters(with(Expectations.<Predicate<ObjectActionParameter>>anything()));
@@ -211,7 +207,7 @@ public class ObjectActionParameterAbstractTest_getId_and_getName {
 
         context.checking(new Expectations() {
             {
-                oneOf(actionParamPeer).getFacet(NamedFacet.class);
+                oneOf(actionParamPeer).getFacet(ParamNamedFacet.class);
                 will(returnValue(null));
 
                 oneOf(parentAction).getParameters(with(Expectations.<Predicate<ObjectActionParameter>>anything()));
diff --git a/core/runtimeservices/src/main/java/org/apache/isis/core/runtimeservices/menubars/bootstrap3/MenuBarsServiceBS3.java b/core/runtimeservices/src/main/java/org/apache/isis/core/runtimeservices/menubars/bootstrap3/MenuBarsServiceBS3.java
index b2eb0f9..d20177d 100644
--- a/core/runtimeservices/src/main/java/org/apache/isis/core/runtimeservices/menubars/bootstrap3/MenuBarsServiceBS3.java
+++ b/core/runtimeservices/src/main/java/org/apache/isis/core/runtimeservices/menubars/bootstrap3/MenuBarsServiceBS3.java
@@ -53,9 +53,6 @@ import org.apache.isis.commons.internal.collections._Sets;
 import org.apache.isis.core.config.environment.IsisSystemEnvironment;
 import org.apache.isis.core.metamodel.context.MetaModelContext;
 import org.apache.isis.core.metamodel.facets.actions.notinservicemenu.NotInServiceMenuFacet;
-import org.apache.isis.core.metamodel.facets.all.i8n.staatic.HasStaticText;
-import org.apache.isis.core.metamodel.facets.all.i8n.staatic.NounForm;
-import org.apache.isis.core.metamodel.facets.all.named.NamedFacet;
 import org.apache.isis.core.metamodel.facets.members.layout.group.LayoutGroupFacet;
 import org.apache.isis.core.metamodel.facets.object.domainservice.DomainServiceFacet;
 import org.apache.isis.core.metamodel.facets.object.domainservicelayout.DomainServiceLayoutFacet;
@@ -283,9 +280,10 @@ public class MenuBarsServiceBS3 implements MenuBarsService {
                 }
 
                 ObjectAction objectAction = serviceAndAction.getObjectAction();
+                val service = serviceAndAction.getServiceAdapter();
                 final String logicalTypeName = serviceAndAction.getServiceAdapter().getSpecification().getLogicalTypeName();
                 ServiceActionLayoutData action = new ServiceActionLayoutData(logicalTypeName, objectAction.getId());
-                action.setNamed(objectAction.getName());
+                action.setNamed(objectAction.getName(service));
                 menuSection.getServiceActions().add(action);
             }
             if(!menuSection.getServiceActions().isEmpty()) {
@@ -308,10 +306,9 @@ public class MenuBarsServiceBS3 implements MenuBarsService {
 
         // first, order as defined in isis.properties
         for (ManagedObject serviceAdapter : serviceAdapters) {
-            final ObjectSpecification serviceSpec = serviceAdapter.getSpecification();
-            // assuming services have immutable names (no imperative naming support)
-            String serviceName = ((HasStaticText)serviceSpec.getFacet(NamedFacet.class))
-                    .translated(NounForm.SINGULAR);
+            val serviceSpec = serviceAdapter.getSpecification();
+            // assuming services always provide singular NounForm
+            String serviceName = serviceSpec.getSingularName();
             serviceNameOrder.add(serviceName);
         }
         // then, any other services (eg due to misspellings, at the end)
@@ -381,9 +378,8 @@ public class MenuBarsServiceBS3 implements MenuBarsService {
                             ? layoutGroupFacet.getGroupId()
                             : null;
                     if(_Strings.isNullOrEmpty(serviceName)){
-                        // assuming services have immutable names (no imperative naming support)
-                        serviceName = ((HasStaticText)serviceSpec.getFacet(NamedFacet.class))
-                                .translated(NounForm.SINGULAR);
+                        // assuming services always provide singular NounForm
+                        serviceName = serviceSpec.getSingularName();
                     }
                     return new ServiceAndAction(serviceName, serviceAdapter, objectAction);
                 });
diff --git a/persistence/jdo/metamodel/src/test/java/org/apache/isis/persistence/jdo/metamodel/specloader/ObjectReflectorDefaultTest_object.java b/persistence/jdo/metamodel/src/test/java/org/apache/isis/persistence/jdo/metamodel/specloader/ObjectReflectorDefaultTest_object.java
index 9384c5b..816ffb7 100644
--- a/persistence/jdo/metamodel/src/test/java/org/apache/isis/persistence/jdo/metamodel/specloader/ObjectReflectorDefaultTest_object.java
+++ b/persistence/jdo/metamodel/src/test/java/org/apache/isis/persistence/jdo/metamodel/specloader/ObjectReflectorDefaultTest_object.java
@@ -26,10 +26,11 @@ import static org.junit.jupiter.api.Assertions.assertNotNull;
 import static org.junit.jupiter.api.Assertions.assertNull;
 import static org.junit.jupiter.api.Assertions.assertTrue;
 
+import org.apache.isis.commons.internal.base._Optionals;
 import org.apache.isis.core.metamodel.facetapi.Facet;
 import org.apache.isis.core.metamodel.facets.actcoll.typeof.TypeOfFacet;
-import org.apache.isis.core.metamodel.facets.all.described.DescribedAsFacet;
-import org.apache.isis.core.metamodel.facets.all.named.NamedFacet;
+import org.apache.isis.core.metamodel.facets.all.named.MemberNamedFacet;
+import org.apache.isis.core.metamodel.facets.all.named.ObjectNamedFacet;
 import org.apache.isis.core.metamodel.facets.collections.CollectionFacet;
 import org.apache.isis.core.metamodel.facets.object.objectvalidprops.ObjectValidPropertiesFacet;
 import org.apache.isis.core.metamodel.facets.object.title.TitleFacet;
@@ -58,8 +59,14 @@ class ObjectReflectorDefaultTest_object extends SpecificationLoaderTestAbstract
 
     @Test
     void testStandardFacets() throws Exception {
-        assertNotNull(specification.getFacet(NamedFacet.class));
-        assertNotNull(specification.getFacet(DescribedAsFacet.class));
+
+        assertNotNull(
+                _Optionals.<Facet>or(
+                        specification.lookupFacet(ObjectNamedFacet.class),
+                        ()->specification.lookupFacet(MemberNamedFacet.class))
+                .orElse(null));
+
+        //assertNotNull(specification.getFacet(ObjectDescribedFacet.class));
         assertNotNull(specification.getFacet(TitleFacet.class));
         assertNotNull(specification.getFacet(ObjectValidPropertiesFacet.class));
     }
diff --git a/persistence/jdo/metamodel/src/test/java/org/apache/isis/persistence/jdo/metamodel/specloader/SpecificationLoaderTestAbstract.java b/persistence/jdo/metamodel/src/test/java/org/apache/isis/persistence/jdo/metamodel/specloader/SpecificationLoaderTestAbstract.java
index 6ee917c..fe0ad65 100644
--- a/persistence/jdo/metamodel/src/test/java/org/apache/isis/persistence/jdo/metamodel/specloader/SpecificationLoaderTestAbstract.java
+++ b/persistence/jdo/metamodel/src/test/java/org/apache/isis/persistence/jdo/metamodel/specloader/SpecificationLoaderTestAbstract.java
@@ -21,6 +21,7 @@ package org.apache.isis.persistence.jdo.metamodel.specloader;
 
 import org.junit.jupiter.api.AfterEach;
 import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Disabled;
 import org.junit.jupiter.api.Test;
 import org.mockito.Mockito;
 import org.springframework.core.env.ConfigurableEnvironment;
@@ -36,13 +37,16 @@ import org.apache.isis.applib.services.iactn.InteractionProvider;
 import org.apache.isis.applib.services.inject.ServiceInjector;
 import org.apache.isis.applib.services.message.MessageService;
 import org.apache.isis.applib.services.title.TitleService;
+import org.apache.isis.commons.internal.base._Optionals;
 import org.apache.isis.core.config.IsisConfiguration;
 import org.apache.isis.core.metamodel._testing.MetaModelContext_forTesting;
 import org.apache.isis.core.metamodel.context.MetaModelContext;
 import org.apache.isis.core.metamodel.facetapi.Facet;
 import org.apache.isis.core.metamodel.facets.actcoll.typeof.TypeOfFacet;
-import org.apache.isis.core.metamodel.facets.all.described.DescribedAsFacet;
-import org.apache.isis.core.metamodel.facets.all.named.NamedFacet;
+import org.apache.isis.core.metamodel.facets.all.described.MemberDescribedFacet;
+import org.apache.isis.core.metamodel.facets.all.described.ObjectDescribedFacet;
+import org.apache.isis.core.metamodel.facets.all.named.MemberNamedFacet;
+import org.apache.isis.core.metamodel.facets.all.named.ObjectNamedFacet;
 import org.apache.isis.core.metamodel.facets.collections.CollectionFacet;
 import org.apache.isis.core.metamodel.progmodels.dflt.ProgrammingModelFacetsJava8;
 import org.apache.isis.core.metamodel.spec.ObjectSpecification;
@@ -155,13 +159,23 @@ abstract class SpecificationLoaderTestAbstract {
 
     @Test
     public void testNamedFaced() throws Exception {
-        final Facet facet = specification.getFacet(NamedFacet.class);
+        val facet =
+                _Optionals.<Facet>or(
+                        specification.lookupFacet(ObjectNamedFacet.class),
+                        ()->specification.lookupFacet(MemberNamedFacet.class))
+                .orElse(null);
+
         assertNotNull(facet);
     }
 
-    @Test
+    @Test @Disabled("we allow descriptions to be absent - no need to install empty fallbacks")
     public void testDescriptionFacet() throws Exception {
-        final Facet facet = specification.getFacet(DescribedAsFacet.class);
+        val facet =
+                _Optionals.<Facet>or(
+                        specification.lookupFacet(ObjectDescribedFacet.class),
+                        ()->specification.lookupFacet(MemberDescribedFacet.class))
+                .orElse(null);
+
         assertNotNull(facet);
     }
 
diff --git a/regressiontests/stable-interact/src/test/java/org/apache/isis/testdomain/interact/NewParameterModelTest.java b/regressiontests/stable-interact/src/test/java/org/apache/isis/testdomain/interact/NewParameterModelTest.java
index 219f3bc..7acc394 100644
--- a/regressiontests/stable-interact/src/test/java/org/apache/isis/testdomain/interact/NewParameterModelTest.java
+++ b/regressiontests/stable-interact/src/test/java/org/apache/isis/testdomain/interact/NewParameterModelTest.java
@@ -31,8 +31,7 @@ import static org.junit.jupiter.api.Assertions.assertTrue;
 import org.apache.isis.applib.annotation.Where;
 import org.apache.isis.commons.collections.Can;
 import org.apache.isis.core.config.presets.IsisPresets;
-import org.apache.isis.core.metamodel.facets.all.described.DescribedAsFacet;
-import org.apache.isis.core.metamodel.facets.all.i8n.staatic.HasStaticText;
+import org.apache.isis.core.metamodel.facets.all.described.ParamDescribedFacet;
 import org.apache.isis.core.metamodel.facets.objectvalue.maxlen.MaxLengthFacet;
 import org.apache.isis.core.metamodel.spec.ManagedObject;
 import org.apache.isis.testdomain.conf.Configuration_headless;
@@ -80,13 +79,13 @@ class NewParameterModelTest extends InteractionTestAbstract {
         val maxLengthFacet = param0Metamodel.getFacet(MaxLengthFacet.class);
 
         // as with first param's @ParameterLayout(describedAs = "first")
-        val describedAsFacet = param0Metamodel.getFacet(DescribedAsFacet.class);
+        val describedAsFacet = param0Metamodel.getFacet(ParamDescribedFacet.class);
 
         assertNotNull(maxLengthFacet);
         assertNotNull(describedAsFacet);
 
         assertEquals(2, maxLengthFacet.value());
-        assertEquals("first", ((HasStaticText)describedAsFacet).preferredText());
+        assertEquals("first", describedAsFacet.text());
     }
 
     @Test
diff --git a/viewers/common/src/main/java/org/apache/isis/viewer/common/model/action/ActionUiMetaModel.java b/viewers/common/src/main/java/org/apache/isis/viewer/common/model/action/ActionUiMetaModel.java
index 0a689da..a05db72 100644
--- a/viewers/common/src/main/java/org/apache/isis/viewer/common/model/action/ActionUiMetaModel.java
+++ b/viewers/common/src/main/java/org/apache/isis/viewer/common/model/action/ActionUiMetaModel.java
@@ -30,7 +30,7 @@ import org.apache.isis.applib.annotation.SemanticsOf;
 import org.apache.isis.applib.annotation.Where;
 import org.apache.isis.core.metamodel.consent.Consent;
 import org.apache.isis.core.metamodel.consent.InteractionInitiatedBy;
-import org.apache.isis.core.metamodel.facets.all.described.DescribedAsFacet;
+import org.apache.isis.core.metamodel.facets.all.described.MemberDescribedFacet;
 import org.apache.isis.core.metamodel.interactions.managed.ManagedAction;
 import org.apache.isis.core.metamodel.spec.ManagedObject;
 import org.apache.isis.core.metamodel.spec.feature.ObjectAction;
@@ -150,10 +150,10 @@ public final class ActionUiMetaModel implements Serializable {
             @NonNull final ManagedObject actionHolder,
             @NonNull final ObjectAction objectAction) {
 
-        return objectAction.lookupFacet(DescribedAsFacet.class)
-        .map(DescribedAsFacet::getSpecialization)
+        return objectAction.lookupFacet(MemberDescribedFacet.class)
+        .map(MemberDescribedFacet::getSpecialization)
         .map(specialization->specialization
-                .fold(textFacet->textFacet.preferredTranslated(),
+                .fold(textFacet->textFacet.translated(),
                       textFacet->textFacet.textElseNull(actionHolder)));
 
     }
diff --git a/viewers/wicket/model/src/main/java/org/apache/isis/viewer/wicket/model/models/EntityCollectionModelStandalone.java b/viewers/wicket/model/src/main/java/org/apache/isis/viewer/wicket/model/models/EntityCollectionModelStandalone.java
index 961af4d..b70bcee 100644
--- a/viewers/wicket/model/src/main/java/org/apache/isis/viewer/wicket/model/models/EntityCollectionModelStandalone.java
+++ b/viewers/wicket/model/src/main/java/org/apache/isis/viewer/wicket/model/models/EntityCollectionModelStandalone.java
@@ -22,8 +22,7 @@ import java.util.List;
 
 import org.apache.isis.commons.collections.Can;
 import org.apache.isis.commons.internal.base._NullSafe;
-import org.apache.isis.core.metamodel.facets.all.i8n.staatic.NounForm;
-import org.apache.isis.core.metamodel.facets.all.named.NamedFacet;
+import org.apache.isis.core.metamodel.facets.all.named.MemberNamedFacet;
 import org.apache.isis.core.metamodel.spec.ManagedObject;
 import org.apache.isis.core.metamodel.spec.feature.ObjectMember;
 import org.apache.isis.core.runtime.memento.ObjectMemento;
@@ -96,11 +95,12 @@ extends EntityCollectionModelAbstract {
 
     @Override
     public String getName() {
+
         return getTypeOfSpecification()
-            .lookupFacet(NamedFacet.class)
-            .map(NamedFacet::getSpecialization)
+            .lookupFacet(MemberNamedFacet.class)
+            .map(MemberNamedFacet::getSpecialization)
             .map(specialization->specialization
-                    .fold(namedFacet->namedFacet.translated(NounForm.PLURAL),
+                    .fold(namedFacet->namedFacet.translated(),
                           namedFacet->namedFacet.textElseNull(actionModel.getOwner())))
             .orElse(getIdentifier().getMemberLogicalName());
     }
diff --git a/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/actionprompt/ActionPromptHeaderPanel.java b/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/actionprompt/ActionPromptHeaderPanel.java
index 2aa0fb4..8290caf 100644
--- a/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/actionprompt/ActionPromptHeaderPanel.java
+++ b/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/actionprompt/ActionPromptHeaderPanel.java
@@ -22,7 +22,6 @@ import org.apache.wicket.markup.html.basic.Label;
 import org.apache.wicket.model.IModel;
 
 import org.apache.isis.commons.internal.base._Blackhole;
-import org.apache.isis.core.metamodel.facets.all.named.NamedFacet;
 import org.apache.isis.core.metamodel.spec.ManagedObject;
 import org.apache.isis.core.metamodel.spec.feature.ObjectAction;
 import org.apache.isis.viewer.wicket.model.models.ActionModel;
@@ -38,7 +37,7 @@ extends PanelAbstract<ManagedObject, ActionModel> {
     private static final long serialVersionUID = 1L;
     private static final String ID_ACTION_NAME = "actionName";
 
-    public ActionPromptHeaderPanel(String id, final ActionModel model) {
+    public ActionPromptHeaderPanel(final String id, final ActionModel model) {
         super(id, model);
 
         _Blackhole.consume(model.getOwner()); // side-effect: loads the model
@@ -55,12 +54,7 @@ extends PanelAbstract<ManagedObject, ActionModel> {
             }
         });
 
-        final ObjectAction action = model.getMetaModel();
-        NamedFacet namedFacet = action.getFacet(NamedFacet.class);
-        if (namedFacet != null) {
-            label.setEscapeModelStrings(namedFacet.escaped());
-        }
-
+        label.setEscapeModelStrings(true);
         add(label);
     }
 
diff --git a/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/collectioncontents/ajaxtable/CollectionContentsAsAjaxTablePanel.java b/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/collectioncontents/ajaxtable/CollectionContentsAsAjaxTablePanel.java
index 4aabc68..1fb4b92 100644
--- a/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/collectioncontents/ajaxtable/CollectionContentsAsAjaxTablePanel.java
+++ b/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/collectioncontents/ajaxtable/CollectionContentsAsAjaxTablePanel.java
@@ -41,9 +41,8 @@ import org.apache.isis.commons.internal.collections._Lists;
 import org.apache.isis.commons.internal.collections._Maps;
 import org.apache.isis.commons.internal.functions._Predicates;
 import org.apache.isis.core.metamodel.facets.WhereValueFacet;
-import org.apache.isis.core.metamodel.facets.all.described.DescribedAsFacet;
+import org.apache.isis.core.metamodel.facets.all.described.MemberDescribedFacet;
 import org.apache.isis.core.metamodel.facets.all.hide.HiddenFacet;
-import org.apache.isis.core.metamodel.facets.all.named.NamedFacet;
 import org.apache.isis.core.metamodel.facets.object.grid.GridFacet;
 import org.apache.isis.core.metamodel.spec.ManagedObject;
 import org.apache.isis.core.metamodel.spec.ObjectSpecification;
@@ -293,15 +292,14 @@ implements CollectionCountProvider {
 
         val collectionModel = getModel();
 
-        final NamedFacet facet = property.getFacet(NamedFacet.class);
-        final boolean escaped = facet == null || facet.escaped();
+        final boolean escaped = true;
 
         final String parentTypeName = property.getOnType().getLogicalTypeName();
 
-        final String describedAs = property.lookupFacet(DescribedAsFacet.class)
-                .map(DescribedAsFacet::getSpecialization)
+        final String describedAs = property.lookupFacet(MemberDescribedFacet.class)
+                .map(MemberDescribedFacet::getSpecialization)
                 .map(specialization->specialization
-                        .fold(textFacet->textFacet.preferredTranslated(),
+                        .fold(textFacet->textFacet.translated(),
                               textFacet->textFacet.textElseNull(collectionModel.getParentObject())))
                 .orElse(null);
 
diff --git a/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/entity/collection/EntityCollectionPanel.java b/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/entity/collection/EntityCollectionPanel.java
index 3f3168a..d5bba72 100644
--- a/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/entity/collection/EntityCollectionPanel.java
+++ b/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/entity/collection/EntityCollectionPanel.java
@@ -33,7 +33,6 @@ import org.apache.isis.applib.annotation.Where;
 import org.apache.isis.commons.collections.Can;
 import org.apache.isis.core.metamodel.consent.Consent;
 import org.apache.isis.core.metamodel.consent.InteractionInitiatedBy;
-import org.apache.isis.core.metamodel.facets.all.named.NamedFacet;
 import org.apache.isis.core.metamodel.facets.members.cssclass.CssClassFacet;
 import org.apache.isis.core.metamodel.spec.ManagedObject;
 import org.apache.isis.viewer.wicket.model.links.LinkAndLabel;
@@ -134,8 +133,7 @@ implements HasDynamicallyVisibleContent {
 
 
             Label labelComponent = collectionPanel.createLabel(ID_COLLECTION_NAME, collectionMetaModel.getName());
-            final NamedFacet namedFacet = collectionMetaModel.getFacet(NamedFacet.class);
-            labelComponent.setEscapeModelStrings(namedFacet == null || namedFacet.escaped());
+            labelComponent.setEscapeModelStrings(true);
             div.add(labelComponent);
 
             final String description = collectionMetaModel.getDescription();
@@ -174,7 +172,7 @@ implements HasDynamicallyVisibleContent {
         return div;
     }
 
-    protected CollectionPanel newCollectionModel(String id, EntityCollectionModelParented entityCollectionModel) {
+    protected CollectionPanel newCollectionModel(final String id, final EntityCollectionModelParented entityCollectionModel) {
         return new CollectionPanel(id, entityCollectionModel);
     }
 
diff --git a/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/property/PropertyEditPanel.java b/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/property/PropertyEditPanel.java
index c27140f..1ac1c3c 100644
--- a/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/property/PropertyEditPanel.java
+++ b/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/property/PropertyEditPanel.java
@@ -23,7 +23,6 @@ import org.apache.wicket.markup.html.WebMarkupContainer;
 import org.apache.wicket.markup.html.basic.Label;
 import org.apache.wicket.model.Model;
 
-import org.apache.isis.core.metamodel.facets.all.named.NamedFacet;
 import org.apache.isis.core.metamodel.spec.ManagedObject;
 import org.apache.isis.viewer.wicket.model.models.EntityModel;
 import org.apache.isis.viewer.wicket.model.models.ScalarModel;
@@ -77,7 +76,7 @@ extends PanelAbstract<ManagedObject, ScalarPropertyModel> {
         return super.getModel();
     }
 
-    public PropertyEditPanel setShowHeader(boolean showHeader) {
+    public PropertyEditPanel setShowHeader(final boolean showHeader) {
         this.showHeader = showHeader;
         return this;
     }
@@ -93,11 +92,7 @@ extends PanelAbstract<ManagedObject, ScalarPropertyModel> {
         val propertyName = property.getName();
         val label = new Label(ID_PROPERTY_NAME, Model.of(propertyName));
 
-        val namedFacet = property.getFacet(NamedFacet.class);
-        if (namedFacet != null) {
-            label.setEscapeModelStrings(namedFacet.escaped());
-        }
-
+        label.setEscapeModelStrings(true);
         header.add(label);
     }
 
diff --git a/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/propertyheader/PropertyEditPromptHeaderPanel.java b/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/propertyheader/PropertyEditPromptHeaderPanel.java
index 807f1c4..6016dd3 100644
--- a/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/propertyheader/PropertyEditPromptHeaderPanel.java
+++ b/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/propertyheader/PropertyEditPromptHeaderPanel.java
@@ -21,7 +21,6 @@ package org.apache.isis.viewer.wicket.ui.components.propertyheader;
 import org.apache.wicket.markup.html.basic.Label;
 import org.apache.wicket.model.IModel;
 
-import org.apache.isis.core.metamodel.facets.all.named.NamedFacet;
 import org.apache.isis.core.metamodel.spec.ManagedObject;
 import org.apache.isis.viewer.wicket.model.models.EntityModel;
 import org.apache.isis.viewer.wicket.model.models.ScalarPropertyModel;
@@ -36,7 +35,7 @@ extends PanelAbstract<ManagedObject, ScalarPropertyModel> {
     private static final long serialVersionUID = 1L;
     private static final String ID_PROPERTY_NAME = "propertyName";
 
-    public PropertyEditPromptHeaderPanel(String id, final ScalarPropertyModel model) {
+    public PropertyEditPromptHeaderPanel(final String id, final ScalarPropertyModel model) {
         super(id, model);
 
         val targetAdapter = model.getParentUiModel().getManagedObject();
@@ -54,10 +53,8 @@ extends PanelAbstract<ManagedObject, ScalarPropertyModel> {
                 return model.getName();
             }
         });
-        val namedFacet = model.getMetaModel().getFacet(NamedFacet.class);
-        if(namedFacet != null) {
-            label.setEscapeModelStrings(namedFacet.escaped());
-        }
+
+        label.setEscapeModelStrings(true);
         add(label);
     }
 
diff --git a/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/ScalarPanelAbstract.java b/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/ScalarPanelAbstract.java
index 411bc45..de66983 100644
--- a/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/ScalarPanelAbstract.java
+++ b/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/ScalarPanelAbstract.java
@@ -48,7 +48,6 @@ import org.apache.isis.commons.internal.base._Strings;
 import org.apache.isis.commons.internal.collections._Lists;
 import org.apache.isis.commons.internal.debug._Probe;
 import org.apache.isis.commons.internal.debug._Probe.EntryPoint;
-import org.apache.isis.core.metamodel.facets.all.named.NamedFacet;
 import org.apache.isis.core.metamodel.facets.members.cssclass.CssClassFacet;
 import org.apache.isis.core.metamodel.facets.objectvalue.labelat.LabelAtFacet;
 import org.apache.isis.core.metamodel.spec.ManagedObject;
@@ -439,7 +438,7 @@ implements ScalarModelSubscriber {
     /**
      * The widget starts off read-only, and CANNOT be activated into edit mode.
      */
-    protected void onInitializeReadonly(String disableReason) {
+    protected void onInitializeReadonly(final String disableReason) {
     }
 
     /**
@@ -518,7 +517,7 @@ implements ScalarModelSubscriber {
         }
 
         @Override
-        protected void onUpdate(AjaxRequestTarget target) {
+        protected void onUpdate(final AjaxRequestTarget target) {
 
             _Probe.entryPoint(EntryPoint.USER_INTERACTION, "Wicket Ajax Request, "
                     + "originating from User either having changed a Property value during inline editing "
@@ -530,7 +529,7 @@ implements ScalarModelSubscriber {
         }
 
         @Override
-        protected void onError(AjaxRequestTarget target, RuntimeException e) {
+        protected void onError(final AjaxRequestTarget target, final RuntimeException e) {
             super.onError(target, e);
             for (ScalarModelSubscriber subscriber : scalarPanel.subscribers) {
                 subscriber.onError(target, scalarPanel);
@@ -614,7 +613,7 @@ implements ScalarModelSubscriber {
 
         public abstract void buildGui(ScalarPanelAbstract panel);
 
-        private static Rendering renderingFor(EntityModel.RenderingHint renderingHint) {
+        private static Rendering renderingFor(final EntityModel.RenderingHint renderingHint) {
             return renderingHint.isRegular()? Rendering.REGULAR :Rendering.COMPACT;
         }
     }
@@ -658,10 +657,8 @@ implements ScalarModelSubscriber {
                 scalarName.add(new CssClassAppender("mandatory"));
             }
         }
-        NamedFacet namedFacet = model.getFacet(NamedFacet.class);
-        if (namedFacet != null) {
-            scalarName.setEscapeModelStrings(namedFacet.escaped());
-        }
+
+        scalarName.setEscapeModelStrings(true);
         return scalarName;
     }
 
@@ -824,7 +821,7 @@ implements ScalarModelSubscriber {
                 private static final long serialVersionUID = -3561635292986591682L;
 
                 @Override
-                protected void onEvent(AjaxRequestTarget target) {
+                protected void onEvent(final AjaxRequestTarget target) {
 
                     final ObjectSpecification specification = scalarModel.getTypeOfSpecification();
                     final MetaModelService metaModelService = getServiceRegistry()
@@ -895,7 +892,7 @@ implements ScalarModelSubscriber {
         CssClassAppender.appendCssClassTo(markupContainer, determineActionLayoutPositioningCss(actionLinks));
     }
 
-    private static String determinePropParamLayoutCss(ScalarModel model) {
+    private static String determinePropParamLayoutCss(final ScalarModel model) {
         final LabelAtFacet facet = model.getFacet(LabelAtFacet.class);
         if (facet != null) {
             switch (facet.label()) {
@@ -916,7 +913,7 @@ implements ScalarModelSubscriber {
         return "label-left";
     }
 
-    private static String determineActionLayoutPositioningCss(Can<LinkAndLabel> entityActionLinks) {
+    private static String determineActionLayoutPositioningCss(final Can<LinkAndLabel> entityActionLinks) {
         boolean actionsPositionedOnRight = hasActionsPositionedOn(entityActionLinks, ActionLayout.Position.RIGHT);
         return actionsPositionedOnRight ? "actions-right" : null;
     }
@@ -937,7 +934,7 @@ implements ScalarModelSubscriber {
      *
      * @param target The Ajax request handler
      */
-    public void repaint(AjaxRequestTarget target) {
+    public void repaint(final AjaxRequestTarget target) {
         target.add(this);
     }