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/09/16 08:32:00 UTC

[isis] branch master updated: ISIS-2871: factor out rendering from Parser into Renderer

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 f088327  ISIS-2871: factor out rendering from Parser<T> into Renderer<T>
f088327 is described below

commit f0883279085aee84f57e49458e6f12c56f6e5c56
Author: Andi Huber <ah...@apache.org>
AuthorDate: Thu Sep 16 10:31:24 2021 +0200

    ISIS-2871: factor out rendering from Parser<T> into Renderer<T>
---
 .../adapters/AbstractValueSemanticsProvider.java   | 37 ++++++------
 .../org/apache/isis/applib/adapters/Parser.java    | 20 +------
 .../org/apache/isis/applib/adapters/Renderer.java  |  9 ++-
 .../applib/adapters/ValueSemanticsProvider.java    | 13 +++++
 .../core/metamodel/IsisModuleCoreMetamodel.java    |  8 +--
 .../choices/enums/EnumValueSemanticsProvider.java  |  4 +-
 .../parser/ParseableFacetUsingParser.java          |  5 +-
 ...ingParser.java => TitleFacetUsingRenderer.java} | 27 ++++-----
 .../metamodel/facets/object/value/ValueFacet.java  |  3 +
 .../facets/object/value/ValueFacetAbstract.java    |  6 ++
 .../facets/object/value/ValueFacetSimple.java      | 14 ++---
 ...ionOrAnyMatchingValueSemanticsFacetFactory.java |  6 ++
 .../ValueFacetUsingSemanticsProviderFactory.java   | 15 +++--
 .../ValueSemanticsProviderAndFacetAbstract.java    | 18 ++++--
 .../chg/v2/ChangesDtoValueSemanticsProvider.java   |  4 +-
 .../cmd/v2/CommandDtoValueSemanticsProvider.java   |  4 +-
 .../v2/InteractionDtoValueSemanticsProvider.java   |  4 +-
 .../ValueSemanticsProviderAbstractTemporal.java    |  4 +-
 .../value/bigdecimal/BigDecimalValueSemantics.java | 20 ++++---
 .../BigIntegerValueSemanticsProvider.java          |  4 +-
 ...lobValueFacetUsingSemanticsProviderFactory.java | 46 ---------------
 ...anticsProvider.java => BlobValueSemantics.java} | 66 +++++-----------------
 .../value/booleans/BooleanValueSemantics.java      | 35 +++++++-----
 .../bytes/ByteValueSemanticsProviderAbstract.java  |  4 +-
 .../chars/CharValueSemanticsProviderAbstract.java  |  4 +-
 .../facets/value/clobs/ClobValueFacet.java         | 25 --------
 ...lobValueFacetUsingSemanticsProviderFactory.java | 46 ---------------
 ...anticsProvider.java => ClobValueSemantics.java} | 64 +++++----------------
 .../JodaLocalDateValueSemanticsProvider.java       |  4 +-
 .../JodaLocalDateTimeValueSemanticsProvider.java   |  4 +-
 .../DoubleValueSemanticsProviderAbstract.java      |  4 +-
 .../FloatValueSemanticsProviderAbstract.java       |  4 +-
 .../image/ImageValueSemanticsProviderAbstract.java |  3 +-
 .../integer/IntValueSemanticsProviderAbstract.java |  4 +-
 .../LocalResourcePathValueSemanticsProvider.java   |  4 +-
 .../longs/LongValueSemanticsProviderAbstract.java  |  4 +-
 .../facets/value/markup/MarkupValueSemantics.java  | 15 +++--
 .../password/PasswordValueSemanticsProvider.java   |  4 +-
 .../ShortValueSemanticsProviderAbstract.java       |  4 +-
 .../value/string/StringValueSemanticsProvider.java |  4 +-
 .../TemporalValueSemanticsProviderAbstract.java    |  4 +-
 .../treenode/TreeNodeValueSemanticsProvider.java   |  3 +-
 .../facets/value/url/URLValueSemantics.java        | 15 +++--
 .../facets/value/uuid/UUIDValueSemantics.java      | 15 +++--
 .../dflt/ProgrammingModelFacetsJava11.java         |  4 --
 .../parseable/ParseableFacetUsingParserTest.java   | 10 +---
 ...eFacetAnnotationOrConfigurationFactoryTest.java | 19 ++-----
 .../facets/param/name/ParameterNameFacetTest.java  |  2 +-
 .../value/BlobValueSemanticsProviderTest.java      | 11 +---
 .../value/BooleanValueSemanticsProviderTest.java   |  4 +-
 .../value/ClobValueSemanticsProviderTest.java      | 10 +---
 .../ValueSemanticsProviderAbstractTestCase.java    |  4 +-
 .../other/embedded/EmbeddedTypeVm-description.adoc | 21 ++++---
 .../jdo/ComplexNumberJdoValueSemantics.java        | 30 +++++++---
 .../jpa/ComplexNumberJpaValueSemantics.java        | 28 ++++++---
 .../value/CalendarEventSemanticsProvider.java      | 25 +++-----
 .../ui/components/blob/BlobFieldFactory.java       |  3 +-
 .../ui/components/clob/ClobFieldFactory.java       |  3 +-
 .../semantics/AsciiDocValueSemanticsProvider.java  | 17 +++---
 .../facets/MarkdownValueSemanticsProvider.java     |  4 +-
 .../model/components/UiComponentFactory.java       | 14 ++++-
 61 files changed, 342 insertions(+), 477 deletions(-)

diff --git a/api/applib/src/main/java/org/apache/isis/applib/adapters/AbstractValueSemanticsProvider.java b/api/applib/src/main/java/org/apache/isis/applib/adapters/AbstractValueSemanticsProvider.java
index b64ff21..f55f3a7 100644
--- a/api/applib/src/main/java/org/apache/isis/applib/adapters/AbstractValueSemanticsProvider.java
+++ b/api/applib/src/main/java/org/apache/isis/applib/adapters/AbstractValueSemanticsProvider.java
@@ -18,48 +18,55 @@
  */
 package org.apache.isis.applib.adapters;
 
-import java.net.URL;
 import java.text.DecimalFormat;
 import java.text.NumberFormat;
 import java.util.Locale;
 import java.util.Optional;
+import java.util.function.Function;
 
 import org.springframework.lang.Nullable;
 
-import org.apache.isis.applib.adapters.Parser.Context;
 import org.apache.isis.applib.services.iactnlayer.InteractionContext;
 
 /**
- * @since 1.x {@index}
+ * @since 2.x {@index}
  */
 public abstract class AbstractValueSemanticsProvider<T>
 implements ValueSemanticsProvider<T> {
 
+    public static final String NULL_REPRESENTATION = "[none]";
+
+    @SuppressWarnings("unchecked")
+    @Override
+    public Renderer<T> getRenderer() {
+        return this instanceof Renderer ? (Renderer<T>)this : null;
+    }
+
     @SuppressWarnings("unchecked")
     @Override
     public EncoderDecoder<T> getEncoderDecoder() {
-        return (EncoderDecoder<T>) (this instanceof EncoderDecoder ? this : null);
+        return this instanceof EncoderDecoder ? (EncoderDecoder<T>)this : null;
     }
 
     @SuppressWarnings("unchecked")
     @Override
     public Parser<T> getParser() {
-        return (Parser<T>) (this instanceof Parser ? this : null);
+        return this instanceof Parser ? (Parser<T>)this : null;
     }
 
     @SuppressWarnings("unchecked")
     @Override
     public DefaultsProvider<T> getDefaultsProvider() {
-        return (DefaultsProvider<T>) (this instanceof DefaultsProvider ? this : null);
+        return this instanceof DefaultsProvider ? (DefaultsProvider<T>)this : null;
     }
 
     /**
      * @param context - nullable in support of JUnit testing
      * @return {@link Locale} from given context or else system's default
      */
-    protected Locale getLocale(final @Nullable Context context) {
+    protected Locale getLocale(final @Nullable ValueSemanticsProvider.Context context) {
         return Optional.ofNullable(context)
-        .map(Context::getInteractionContext)
+        .map(ValueSemanticsProvider.Context::getInteractionContext)
         .map(InteractionContext::getLocale)
         .orElseGet(Locale::getDefault);
     }
@@ -69,20 +76,12 @@ implements ValueSemanticsProvider<T> {
      * @return {@link NumberFormat} the default from from given context's locale
      * or else system's default locale
      */
-    protected DecimalFormat getNumberFormat(final @Nullable Context context) {
+    protected DecimalFormat getNumberFormat(final @Nullable ValueSemanticsProvider.Context context) {
         return (DecimalFormat)NumberFormat.getNumberInstance(getLocale(context));
     }
 
-    @Deprecated
-    protected final URL doParse(final Context context, final String entry) {
-        // TODO Auto-generated method stub
-        return null;
-    }
-
-    @Deprecated
-    protected final String titleString(final Object object) {
-        // TODO Auto-generated method stub
-        return null;
+    protected String render(final T value, final Function<T, String> toString) {
+        return value != null ? toString.apply(value) : NULL_REPRESENTATION;
     }
 
 }
diff --git a/api/applib/src/main/java/org/apache/isis/applib/adapters/Parser.java b/api/applib/src/main/java/org/apache/isis/applib/adapters/Parser.java
index 21865e6..cbca4ab 100644
--- a/api/applib/src/main/java/org/apache/isis/applib/adapters/Parser.java
+++ b/api/applib/src/main/java/org/apache/isis/applib/adapters/Parser.java
@@ -18,11 +18,6 @@
  */
 package org.apache.isis.applib.adapters;
 
-import org.apache.isis.applib.Identifier;
-import org.apache.isis.applib.services.iactnlayer.InteractionContext;
-
-import lombok.Value;
-
 /**
  * Provides a mechanism for parsing and rendering string representations of
  * objects.
@@ -74,17 +69,6 @@ import lombok.Value;
  */
 public interface Parser<T> {
 
-    @Value(staticConstructor = "of")
-    static class Context {
-        Identifier identifier;
-        InteractionContext interactionContext;
-    }
-
-    /**
-     * The value in its read-only presentation form, eg. html. (irreversible)
-     */
-    String presentationValue(Context context, T value);
-
     /**
      * A title for the object that is valid but which may be easier to edit than
      * the title provided by a <code>TitleFacet</code>. (bijective)
@@ -95,12 +79,12 @@ public interface Parser<T> {
      * field. So, a date might be rendered via a <code>TitleFacet</code> as
      * <tt>May 2, 2007</tt>, but its editable form might be <tt>20070502</tt>.
      */
-    String parseableTextRepresentation(Context context, T value);
+    String parseableTextRepresentation(ValueSemanticsProvider.Context context, T value);
 
     /**
      * Parses a string to an instance of the object. (bijective)
      */
-    T parseTextRepresentation(Context context, String text);
+    T parseTextRepresentation(ValueSemanticsProvider.Context context, String text);
 
     /**
      * The typical length of objects that can be parsed.
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/blobs/BlobValueFacet.java b/api/applib/src/main/java/org/apache/isis/applib/adapters/Renderer.java
similarity index 77%
rename from core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/blobs/BlobValueFacet.java
rename to api/applib/src/main/java/org/apache/isis/applib/adapters/Renderer.java
index 61bbe03..6acf062 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/blobs/BlobValueFacet.java
+++ b/api/applib/src/main/java/org/apache/isis/applib/adapters/Renderer.java
@@ -16,10 +16,13 @@
  *  specific language governing permissions and limitations
  *  under the License.
  */
-package org.apache.isis.core.metamodel.facets.value.blobs;
+package org.apache.isis.applib.adapters;
 
-import org.apache.isis.core.metamodel.facetapi.Facet;
+public interface Renderer<T> {
 
-public interface BlobValueFacet extends Facet {
+    /**
+     * The value in its read-only presentation form, eg. html. (irreversible)
+     */
+    String presentationValue(ValueSemanticsProvider.Context context, T value);
 
 }
diff --git a/api/applib/src/main/java/org/apache/isis/applib/adapters/ValueSemanticsProvider.java b/api/applib/src/main/java/org/apache/isis/applib/adapters/ValueSemanticsProvider.java
index 520800e..a1e3e72 100644
--- a/api/applib/src/main/java/org/apache/isis/applib/adapters/ValueSemanticsProvider.java
+++ b/api/applib/src/main/java/org/apache/isis/applib/adapters/ValueSemanticsProvider.java
@@ -19,7 +19,9 @@
 
 package org.apache.isis.applib.adapters;
 
+import org.apache.isis.applib.Identifier;
 import org.apache.isis.applib.annotation.Value;
+import org.apache.isis.applib.services.iactnlayer.InteractionContext;
 
 /**
  * Provides a mechanism for providing a set of value semantics.
@@ -42,6 +44,17 @@ import org.apache.isis.applib.annotation.Value;
  */
 public interface ValueSemanticsProvider<T> {
 
+    @lombok.Value(staticConstructor = "of")
+    class Context {
+        Identifier identifier;
+        InteractionContext interactionContext;
+    }
+
+    /**
+     * The {@link Renderer}, if any.
+     */
+    Renderer<T> getRenderer();
+
     /**
      * The {@link Parser}, if any.
      */
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/IsisModuleCoreMetamodel.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/IsisModuleCoreMetamodel.java
index c09cbbd..ed661d3 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/IsisModuleCoreMetamodel.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/IsisModuleCoreMetamodel.java
@@ -28,9 +28,9 @@ import org.apache.isis.core.metamodel.facets.object.logicaltype.LogicalTypeMalfo
 import org.apache.isis.core.metamodel.facets.schema.IsisSchemaMetaModelRefiner;
 import org.apache.isis.core.metamodel.facets.schema.IsisSchemaValueTypeProvider;
 import org.apache.isis.core.metamodel.facets.value.bigdecimal.BigDecimalValueSemantics;
-import org.apache.isis.core.metamodel.facets.value.blobs.BlobValueSemanticsProvider;
+import org.apache.isis.core.metamodel.facets.value.blobs.BlobValueSemantics;
 import org.apache.isis.core.metamodel.facets.value.booleans.BooleanValueSemantics;
-import org.apache.isis.core.metamodel.facets.value.clobs.ClobValueSemanticsProvider;
+import org.apache.isis.core.metamodel.facets.value.clobs.ClobValueSemantics;
 import org.apache.isis.core.metamodel.facets.value.localrespath.LocalResourcePathValueSemanticsProvider;
 import org.apache.isis.core.metamodel.facets.value.markup.MarkupValueSemantics;
 import org.apache.isis.core.metamodel.facets.value.password.PasswordValueSemanticsProvider;
@@ -91,12 +91,12 @@ import org.apache.isis.core.security.IsisModuleCoreSecurity;
         // Value Semantics (built-in defaults)
         BooleanValueSemantics.class,
         BigDecimalValueSemantics.class,
+        BlobValueSemantics.class,
+        ClobValueSemantics.class,
         MarkupValueSemantics.class,
         URLValueSemantics.class,
         UUIDValueSemantics.class,
         //TODO convert to non-facets ...
-        BlobValueSemanticsProvider.class,
-        ClobValueSemanticsProvider.class,
         LocalResourcePathValueSemanticsProvider.class,
         PasswordValueSemanticsProvider.class,
         TreeNodeValueSemanticsProvider.class,
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/choices/enums/EnumValueSemanticsProvider.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/choices/enums/EnumValueSemanticsProvider.java
index f1c8b18..ca3c2e9 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/choices/enums/EnumValueSemanticsProvider.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/choices/enums/EnumValueSemanticsProvider.java
@@ -21,7 +21,7 @@ package org.apache.isis.core.metamodel.facets.object.choices.enums;
 import java.lang.reflect.Method;
 import java.util.function.BiConsumer;
 
-import org.apache.isis.applib.adapters.Parser;
+import org.apache.isis.applib.adapters.ValueSemanticsProvider;
 import org.apache.isis.applib.annotation.Introspection.IntrospectionPolicy;
 import org.apache.isis.applib.exceptions.recoverable.TextEntryParseException;
 import org.apache.isis.applib.services.i18n.TranslatableString;
@@ -88,7 +88,7 @@ implements EnumFacet {
     }
 
     @Override
-    protected T doParse(final Parser.Context context, final String entry) {
+    protected T doParse(final ValueSemanticsProvider.Context context, final String entry) {
         final T[] enumConstants = getAdaptedClass().getEnumConstants();
         for (final T enumConstant : enumConstants) {
             if (toEncodedString(enumConstant).equals(entry)) {
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/parseable/parser/ParseableFacetUsingParser.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/parseable/parser/ParseableFacetUsingParser.java
index 21fcad4..8f75265 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/parseable/parser/ParseableFacetUsingParser.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/parseable/parser/ParseableFacetUsingParser.java
@@ -26,6 +26,7 @@ import org.springframework.lang.Nullable;
 import org.apache.isis.applib.Identifier;
 import org.apache.isis.applib.adapters.Parser;
 import org.apache.isis.applib.adapters.ParsingException;
+import org.apache.isis.applib.adapters.ValueSemanticsProvider;
 import org.apache.isis.applib.exceptions.recoverable.TextEntryParseException;
 import org.apache.isis.core.metamodel.consent.InteractionInitiatedBy;
 import org.apache.isis.core.metamodel.consent.InteractionResultSet;
@@ -145,12 +146,12 @@ implements ParseableFacet {
         return ((Parser)parser).parseableTextRepresentation(parserContext(), pojo);
     }
 
-    private Parser.Context parserContext() {
+    private ValueSemanticsProvider.Context parserContext() {
         val iaProvider = super.getInteractionProvider();
         if(iaProvider==null) {
             return null; // JUnit context
         }
-        return Parser.Context.of(
+        return ValueSemanticsProvider.Context.of(
                 ((FacetHolderAbstract)getFacetHolder()).getFeatureIdentifier(),
                 iaProvider.currentInteractionContext().orElse(null));
     }
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/title/parser/TitleFacetUsingParser.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/title/parser/TitleFacetUsingRenderer.java
similarity index 71%
rename from core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/title/parser/TitleFacetUsingParser.java
rename to core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/title/parser/TitleFacetUsingRenderer.java
index e9e7f98..56cb416 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/title/parser/TitleFacetUsingParser.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/title/parser/TitleFacetUsingRenderer.java
@@ -20,7 +20,8 @@ package org.apache.isis.core.metamodel.facets.object.title.parser;
 
 import java.util.function.BiConsumer;
 
-import org.apache.isis.applib.adapters.Parser;
+import org.apache.isis.applib.adapters.Renderer;
+import org.apache.isis.applib.adapters.ValueSemanticsProvider;
 import org.apache.isis.commons.internal.base._Casts;
 import org.apache.isis.core.metamodel.facetapi.Facet;
 import org.apache.isis.core.metamodel.facetapi.FacetAbstract;
@@ -32,25 +33,25 @@ import org.apache.isis.core.metamodel.spec.ManagedObject;
 import lombok.NonNull;
 import lombok.val;
 
-public final class TitleFacetUsingParser
+public final class TitleFacetUsingRenderer
 extends FacetAbstract
 implements TitleFacet {
 
-    private final @NonNull Parser<?> parser;
+    private final @NonNull Renderer<?> renderer;
 
-    public static TitleFacetUsingParser create(final Parser<?> parser, final FacetHolder holder) {
-        return new TitleFacetUsingParser(parser, holder);
+    public static TitleFacetUsingRenderer create(final Renderer<?> parser, final FacetHolder holder) {
+        return new TitleFacetUsingRenderer(parser, holder);
     }
 
-    private TitleFacetUsingParser(final Parser<?> parser, final FacetHolder holder) {
+    private TitleFacetUsingRenderer(final Renderer<?> parser, final FacetHolder holder) {
         super(TitleFacet.class, holder, Precedence.LOW);
-        this.parser = parser;
+        this.renderer = parser;
     }
 
     @Override
     public boolean semanticEquals(final @NonNull Facet other) {
-        return other instanceof TitleFacetUsingParser
-                ? this.parser.getClass() == ((TitleFacetUsingParser)other).parser.getClass()
+        return other instanceof TitleFacetUsingRenderer
+                ? this.renderer.getClass() == ((TitleFacetUsingRenderer)other).renderer.getClass()
                 : false;
     }
 
@@ -63,21 +64,21 @@ implements TitleFacet {
         if (object == null) {
             return null;
         }
-        return parser.presentationValue(parserContext(), _Casts.uncheckedCast(object));
+        return renderer.presentationValue(valueSemanticsContext(), _Casts.uncheckedCast(object));
     }
 
     @Override
     public void visitAttributes(final BiConsumer<String, Object> visitor) {
         super.visitAttributes(visitor);
-        visitor.accept("parser", parser.toString());
+        visitor.accept("parser", renderer.toString());
     }
 
-    private Parser.Context parserContext() {
+    private ValueSemanticsProvider.Context valueSemanticsContext() {
         val iaProvider = super.getInteractionProvider();
         if(iaProvider==null) {
             return null; // JUnit context
         }
-        return Parser.Context.of(
+        return ValueSemanticsProvider.Context.of(
                 ((FacetHolderAbstract)getFacetHolder()).getFeatureIdentifier(),
                 iaProvider.currentInteractionContext().orElse(null));
     }
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/value/ValueFacet.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/value/ValueFacet.java
index c855a28..b4cf352 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/value/ValueFacet.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/value/ValueFacet.java
@@ -18,6 +18,7 @@
  */
 package org.apache.isis.core.metamodel.facets.object.value;
 
+import org.apache.isis.applib.id.LogicalType;
 import org.apache.isis.core.metamodel.facetapi.Facet;
 
 /**
@@ -31,4 +32,6 @@ import org.apache.isis.core.metamodel.facetapi.Facet;
  */
 public interface ValueFacet extends Facet {
 
+    LogicalType getValueType();
+
 }
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/value/ValueFacetAbstract.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/value/ValueFacetAbstract.java
index caba1fd..85c9118 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/value/ValueFacetAbstract.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/value/ValueFacetAbstract.java
@@ -19,6 +19,7 @@
 package org.apache.isis.core.metamodel.facets.object.value;
 
 import org.apache.isis.applib.adapters.ValueSemanticsProvider;
+import org.apache.isis.applib.id.LogicalType;
 import org.apache.isis.commons.collections.Can;
 import org.apache.isis.core.metamodel.facetapi.Facet;
 import org.apache.isis.core.metamodel.facetapi.FacetAbstract;
@@ -57,4 +58,9 @@ implements ValueFacet {
         return !this.semanticsProviders.isEmpty();
     }
 
+    @Override
+    public final LogicalType getValueType() {
+        return getFacetHolder().getFeatureIdentifier().getLogicalType();
+    }
+
 }
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/value/ValueFacetSimple.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/value/ValueFacetSimple.java
index 6186b98..39bfcdc 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/value/ValueFacetSimple.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/value/ValueFacetSimple.java
@@ -18,18 +18,14 @@
  */
 package org.apache.isis.core.metamodel.facets.object.value;
 
-import org.apache.isis.core.metamodel.facetapi.Facet;
-import org.apache.isis.core.metamodel.facetapi.FacetAbstract;
+import org.apache.isis.commons.collections.Can;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
 
-public class ValueFacetSimple extends FacetAbstract implements ValueFacet {
+public class ValueFacetSimple
+extends ValueFacetAbstract {
 
-    private static final Class<? extends Facet> type() {
-        return ValueFacet.class;
-    }
-
-    public ValueFacetSimple(FacetHolder holder) {
-        super(type(), holder);
+    public ValueFacetSimple(final FacetHolder holder) {
+        super(Can.empty(), holder, Precedence.LOW);
     }
 
 }
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/value/annotcfg/ValueFacetForValueAnnotationOrAnyMatchingValueSemanticsFacetFactory.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/value/annotcfg/ValueFacetForValueAnnotationOrAnyMatchingValueSemanticsFacetFactory.java
index e84c9b6..6b39527 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/value/annotcfg/ValueFacetForValueAnnotationOrAnyMatchingValueSemanticsFacetFactory.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/value/annotcfg/ValueFacetForValueAnnotationOrAnyMatchingValueSemanticsFacetFactory.java
@@ -26,6 +26,7 @@ import org.springframework.util.ClassUtils;
 import org.apache.isis.applib.adapters.DefaultsProvider;
 import org.apache.isis.applib.adapters.EncoderDecoder;
 import org.apache.isis.applib.adapters.Parser;
+import org.apache.isis.applib.adapters.Renderer;
 import org.apache.isis.applib.adapters.ValueSemanticsProvider;
 import org.apache.isis.applib.annotation.Value;
 import org.apache.isis.commons.collections.Can;
@@ -118,6 +119,11 @@ extends ValueFacetUsingSemanticsProviderFactory {
     private static class NoopValueSemantics implements ValueSemanticsProvider<Object> {
 
         @Override
+        public Renderer<Object> getRenderer() {
+            return null;
+        }
+
+        @Override
         public Parser<Object> getParser() {
             return null;
         }
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/value/vsp/ValueFacetUsingSemanticsProviderFactory.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/value/vsp/ValueFacetUsingSemanticsProviderFactory.java
index 50f5aee..8a3387d 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/value/vsp/ValueFacetUsingSemanticsProviderFactory.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/value/vsp/ValueFacetUsingSemanticsProviderFactory.java
@@ -21,6 +21,7 @@ package org.apache.isis.core.metamodel.facets.object.value.vsp;
 import org.apache.isis.applib.adapters.DefaultsProvider;
 import org.apache.isis.applib.adapters.EncoderDecoder;
 import org.apache.isis.applib.adapters.Parser;
+import org.apache.isis.applib.adapters.Renderer;
 import org.apache.isis.applib.adapters.ValueSemanticsProvider;
 import org.apache.isis.commons.collections.Can;
 import org.apache.isis.core.metamodel.context.MetaModelContext;
@@ -32,7 +33,7 @@ import org.apache.isis.core.metamodel.facets.FacetFactoryAbstract;
 import org.apache.isis.core.metamodel.facets.object.defaults.DefaultedFacetUsingDefaultsProvider;
 import org.apache.isis.core.metamodel.facets.object.encodeable.encoder.EncodableFacetUsingEncoderDecoder;
 import org.apache.isis.core.metamodel.facets.object.parseable.parser.ParseableFacetUsingParser;
-import org.apache.isis.core.metamodel.facets.object.title.parser.TitleFacetUsingParser;
+import org.apache.isis.core.metamodel.facets.object.title.parser.TitleFacetUsingRenderer;
 import org.apache.isis.core.metamodel.facets.object.value.ImmutableFacetViaValueSemantics;
 import org.apache.isis.core.metamodel.facets.object.value.MaxLengthFacetUsingParser;
 import org.apache.isis.core.metamodel.facets.object.value.TypicalLengthFacetUsingParser;
@@ -72,19 +73,23 @@ extends FacetFactoryAbstract {
             // install the EncodeableFacet if we've been given an EncoderDecoder
             final EncoderDecoder<?> encoderDecoder = semanticsProvider.getEncoderDecoder();
             if (encoderDecoder != null) {
-                getServiceInjector().injectServicesInto(encoderDecoder);
+                //getServiceInjector().injectServicesInto(encoderDecoder);
                 FacetUtil.addFacet(new EncodableFacetUsingEncoderDecoder(encoderDecoder, holder));
             }
 
+            final Renderer<?> renderer = semanticsProvider.getRenderer();
+            if (renderer != null) {
+                holder.addFacet(TitleFacetUsingRenderer.create(renderer, holder));
+            }
+
             // install the ParseableFacet and other facets if we've been given a
             // Parser
             final Parser<?> parser = semanticsProvider.getParser();
             if (parser != null) {
 
-                holder.getServiceInjector().injectServicesInto(parser);
+                //holder.getServiceInjector().injectServicesInto(parser);
 
                 holder.addFacet(ParseableFacetUsingParser.create(parser, holder));
-                holder.addFacet(TitleFacetUsingParser.create(parser, holder));
                 holder.addFacet(new TypicalLengthFacetUsingParser(parser, holder));
                 final int maxLength = parser.maxLength();
                 if(maxLength >=0) {
@@ -95,7 +100,7 @@ extends FacetFactoryAbstract {
             // install the DefaultedFacet if we've been given a DefaultsProvider
             final DefaultsProvider<?> defaultsProvider = semanticsProvider.getDefaultsProvider();
             if (defaultsProvider != null) {
-                holder.getServiceInjector().injectServicesInto(defaultsProvider);
+                //holder.getServiceInjector().injectServicesInto(defaultsProvider);
                 holder.addFacet(new DefaultedFacetUsingDefaultsProvider(defaultsProvider, holder));
             }
 
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/value/vsp/ValueSemanticsProviderAndFacetAbstract.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/value/vsp/ValueSemanticsProviderAndFacetAbstract.java
index 515b7d9..e1ff842 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/value/vsp/ValueSemanticsProviderAndFacetAbstract.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/value/vsp/ValueSemanticsProviderAndFacetAbstract.java
@@ -25,6 +25,7 @@ import java.util.function.BiConsumer;
 import org.apache.isis.applib.adapters.DefaultsProvider;
 import org.apache.isis.applib.adapters.EncoderDecoder;
 import org.apache.isis.applib.adapters.Parser;
+import org.apache.isis.applib.adapters.Renderer;
 import org.apache.isis.applib.adapters.ValueSemanticsProvider;
 import org.apache.isis.applib.exceptions.recoverable.InvalidEntryException;
 import org.apache.isis.applib.exceptions.unrecoverable.UnknownTypeException;
@@ -37,7 +38,7 @@ import org.apache.isis.core.metamodel.spec.ObjectSpecification;
 @Deprecated
 public abstract class ValueSemanticsProviderAndFacetAbstract<T>
 extends FacetAbstract
-implements ValueSemanticsProvider<T>, EncoderDecoder<T>, Parser<T>, DefaultsProvider<T> {
+implements ValueSemanticsProvider<T>, Renderer<T>, EncoderDecoder<T>, Parser<T>, DefaultsProvider<T> {
 
     private final Class<T> adaptedClass;
     private final int typicalLength;
@@ -124,6 +125,11 @@ implements ValueSemanticsProvider<T>, EncoderDecoder<T>, Parser<T>, DefaultsProv
     }
 
     @Override
+    public Renderer<T> getRenderer() {
+        return this;
+    }
+
+    @Override
     public Parser<T> getParser() {
         return this;
     }
@@ -138,7 +144,7 @@ implements ValueSemanticsProvider<T>, EncoderDecoder<T>, Parser<T>, DefaultsProv
     // ///////////////////////////////////////////////////////////////////////////
 
     @Override
-    public T parseTextRepresentation(final Parser.Context context, final String entry) {
+    public T parseTextRepresentation(final ValueSemanticsProvider.Context context, final String entry) {
         if (entry == null) {
             throw new IllegalArgumentException();
         }
@@ -152,7 +158,7 @@ implements ValueSemanticsProvider<T>, EncoderDecoder<T>, Parser<T>, DefaultsProv
         return doParse(context, entry);
     }
 
-    public Optional<Exception> tryParseTextEntry(final Parser.Context context, final String entry) {
+    public Optional<Exception> tryParseTextEntry(final ValueSemanticsProvider.Context context, final String entry) {
         try {
             parseTextRepresentation(context, entry);
         } catch (Exception e) {
@@ -168,7 +174,7 @@ implements ValueSemanticsProvider<T>, EncoderDecoder<T>, Parser<T>, DefaultsProv
      *            - the proposed new object, as a string representation to be
      *            parsed
      */
-    protected abstract T doParse(final Parser.Context context, final String entry);
+    protected abstract T doParse(final ValueSemanticsProvider.Context context, final String entry);
 
 
     /**
@@ -182,7 +188,7 @@ implements ValueSemanticsProvider<T>, EncoderDecoder<T>, Parser<T>, DefaultsProv
     }
 
     @Override
-    public String presentationValue(final Parser.Context context, final Object object) {
+    public String presentationValue(final ValueSemanticsProvider.Context context, final Object object) {
         if (object == null) {
             return "";
         }
@@ -193,7 +199,7 @@ implements ValueSemanticsProvider<T>, EncoderDecoder<T>, Parser<T>, DefaultsProv
      * Defaults to {@link Parser#presentationValue(org.apache.isis.applib.adapters.Parser.Context, Object)}.
      */
     @Override
-    public String parseableTextRepresentation(final Parser.Context context, final Object existing) {
+    public String parseableTextRepresentation(final ValueSemanticsProvider.Context context, final Object existing) {
         return presentationValue(context, existing);
     }
 
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/schema/chg/v2/ChangesDtoValueSemanticsProvider.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/schema/chg/v2/ChangesDtoValueSemanticsProvider.java
index 818a2ab..35b3acf 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/schema/chg/v2/ChangesDtoValueSemanticsProvider.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/schema/chg/v2/ChangesDtoValueSemanticsProvider.java
@@ -18,7 +18,7 @@
  */
 package org.apache.isis.core.metamodel.facets.schema.chg.v2;
 
-import org.apache.isis.applib.adapters.Parser;
+import org.apache.isis.applib.adapters.ValueSemanticsProvider;
 import org.apache.isis.applib.util.schema.ChangesDtoUtils;
 import org.apache.isis.core.metamodel.facetapi.Facet;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
@@ -47,7 +47,7 @@ implements ChangesDtoValueFacet {
 
 
     @Override
-    protected ChangesDto doParse(final Parser.Context context, final String str) {
+    protected ChangesDto doParse(final ValueSemanticsProvider.Context context, final String str) {
         return fromEncodedString(str);
     }
 
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/schema/cmd/v2/CommandDtoValueSemanticsProvider.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/schema/cmd/v2/CommandDtoValueSemanticsProvider.java
index c20c0f2..2d706d2 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/schema/cmd/v2/CommandDtoValueSemanticsProvider.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/schema/cmd/v2/CommandDtoValueSemanticsProvider.java
@@ -18,7 +18,7 @@
  */
 package org.apache.isis.core.metamodel.facets.schema.cmd.v2;
 
-import org.apache.isis.applib.adapters.Parser;
+import org.apache.isis.applib.adapters.ValueSemanticsProvider;
 import org.apache.isis.applib.util.schema.CommandDtoUtils;
 import org.apache.isis.core.metamodel.facetapi.Facet;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
@@ -46,7 +46,7 @@ implements CommandDtoValueFacet {
     }
 
     @Override
-    protected CommandDto doParse(final Parser.Context context, final String str) {
+    protected CommandDto doParse(final ValueSemanticsProvider.Context context, final String str) {
         return fromEncodedString(str);
     }
 
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/schema/ixn/v2/InteractionDtoValueSemanticsProvider.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/schema/ixn/v2/InteractionDtoValueSemanticsProvider.java
index 4f56f1b..401bf8f 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/schema/ixn/v2/InteractionDtoValueSemanticsProvider.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/schema/ixn/v2/InteractionDtoValueSemanticsProvider.java
@@ -18,7 +18,7 @@
  */
 package org.apache.isis.core.metamodel.facets.schema.ixn.v2;
 
-import org.apache.isis.applib.adapters.Parser;
+import org.apache.isis.applib.adapters.ValueSemanticsProvider;
 import org.apache.isis.applib.util.schema.InteractionDtoUtils;
 import org.apache.isis.core.metamodel.facetapi.Facet;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
@@ -46,7 +46,7 @@ implements InteractionDtoValueFacet {
     }
 
     @Override
-    protected InteractionDto doParse(final Parser.Context context, final String str) {
+    protected InteractionDto doParse(final ValueSemanticsProvider.Context context, final String str) {
         return fromEncodedString(str);
     }
 
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/ValueSemanticsProviderAbstractTemporal.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/ValueSemanticsProviderAbstractTemporal.java
index 106a8b7..c3813f0 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/ValueSemanticsProviderAbstractTemporal.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/ValueSemanticsProviderAbstractTemporal.java
@@ -31,7 +31,7 @@ import java.util.TimeZone;
 import java.util.function.BiConsumer;
 
 import org.apache.isis.applib.adapters.EncodingException;
-import org.apache.isis.applib.adapters.Parser;
+import org.apache.isis.applib.adapters.ValueSemanticsProvider;
 import org.apache.isis.applib.exceptions.recoverable.TextEntryParseException;
 import org.apache.isis.commons.internal.base._Casts;
 import org.apache.isis.core.metamodel.facetapi.Facet;
@@ -125,7 +125,7 @@ implements DateValueFacet {
 
     @Override
     protected T doParse(
-            final Parser.Context context,
+            final ValueSemanticsProvider.Context context,
             final String entry) {
 
         buildDefaultFormatIfRequired();
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/bigdecimal/BigDecimalValueSemantics.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/bigdecimal/BigDecimalValueSemantics.java
index 6ba29d6..9bf1be3 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/bigdecimal/BigDecimalValueSemantics.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/bigdecimal/BigDecimalValueSemantics.java
@@ -28,6 +28,8 @@ import org.apache.isis.applib.adapters.AbstractValueSemanticsProvider;
 import org.apache.isis.applib.adapters.DefaultsProvider;
 import org.apache.isis.applib.adapters.EncoderDecoder;
 import org.apache.isis.applib.adapters.Parser;
+import org.apache.isis.applib.adapters.Renderer;
+import org.apache.isis.applib.adapters.ValueSemanticsProvider;
 import org.apache.isis.applib.exceptions.UnrecoverableException;
 import org.apache.isis.applib.exceptions.recoverable.TextEntryParseException;
 import org.apache.isis.commons.internal.base._Strings;
@@ -38,7 +40,8 @@ extends AbstractValueSemanticsProvider<BigDecimal>
 implements
     DefaultsProvider<BigDecimal>,
     EncoderDecoder<BigDecimal>,
-    Parser<BigDecimal> {
+    Parser<BigDecimal>,
+    Renderer<BigDecimal> {
 
     public static final int DEFAULT_LENGTH = 18;
     public static final int DEFAULT_SCALE = 2;
@@ -64,18 +67,17 @@ implements
         return new BigDecimal(data);
     }
 
-    // -- PARSER
+    // -- RENDERER
 
     @Override
-    public String presentationValue(final Context context, final BigDecimal value) {
-        return value==null
-            ? ""
-            : getNumberFormat(context)
-                .format(value);
+    public String presentationValue(final ValueSemanticsProvider.Context context, final BigDecimal value) {
+        return render(value, getNumberFormat(context)::format);
     }
 
+    // -- PARSER
+
     @Override
-    public String parseableTextRepresentation(final Context context, final BigDecimal value) {
+    public String parseableTextRepresentation(final ValueSemanticsProvider.Context context, final BigDecimal value) {
         return value==null
                 ? null
                 : getNumberFormat(context)
@@ -83,7 +85,7 @@ implements
     }
 
     @Override
-    public BigDecimal parseTextRepresentation(final Context context, final String text) {
+    public BigDecimal parseTextRepresentation(final ValueSemanticsProvider.Context context, final String text) {
         final var input = _Strings.blankToNullOrTrim(text);
         if(input==null) {
             return null;
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/biginteger/BigIntegerValueSemanticsProvider.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/biginteger/BigIntegerValueSemanticsProvider.java
index 966c4e1..53c56b8 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/biginteger/BigIntegerValueSemanticsProvider.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/biginteger/BigIntegerValueSemanticsProvider.java
@@ -24,7 +24,7 @@ import java.text.NumberFormat;
 import java.util.Locale;
 import java.util.function.BiConsumer;
 
-import org.apache.isis.applib.adapters.Parser;
+import org.apache.isis.applib.adapters.ValueSemanticsProvider;
 import org.apache.isis.applib.exceptions.recoverable.TextEntryParseException;
 import org.apache.isis.core.metamodel.commons.LocaleUtil;
 import org.apache.isis.core.metamodel.facetapi.Facet;
@@ -66,7 +66,7 @@ implements BigIntegerValueFacet {
     // //////////////////////////////////////////////////////////////////
 
     @Override
-    protected BigInteger doParse(final Parser.Context context, final String entry) {
+    protected BigInteger doParse(final ValueSemanticsProvider.Context context, final String entry) {
         try {
             return new BigInteger(entry);
         } catch (final NumberFormatException e) {
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/blobs/BlobValueFacetUsingSemanticsProviderFactory.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/blobs/BlobValueFacetUsingSemanticsProviderFactory.java
deleted file mode 100644
index df0f848..0000000
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/blobs/BlobValueFacetUsingSemanticsProviderFactory.java
+++ /dev/null
@@ -1,46 +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.value.blobs;
-
-import javax.inject.Inject;
-
-import org.apache.isis.applib.value.Blob;
-import org.apache.isis.core.metamodel.context.MetaModelContext;
-import org.apache.isis.core.metamodel.facetapi.FacetHolder;
-import org.apache.isis.core.metamodel.facets.object.value.vsp.ValueFacetUsingSemanticsProviderFactory;
-
-public class BlobValueFacetUsingSemanticsProviderFactory
-extends ValueFacetUsingSemanticsProviderFactory<Blob> {
-
-    @Inject
-    public BlobValueFacetUsingSemanticsProviderFactory(final MetaModelContext mmc) {
-        super(mmc);
-    }
-
-    @Override
-    public void process(final ProcessClassContext processClassContext) {
-        final Class<?> type = processClassContext.getCls();
-        final FacetHolder holder = processClassContext.getFacetHolder();
-        if (type != Blob.class) {
-            return;
-        }
-        addValueFacet(new BlobValueSemanticsProvider(holder));
-    }
-
-}
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/blobs/BlobValueSemanticsProvider.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/blobs/BlobValueSemantics.java
similarity index 54%
rename from core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/blobs/BlobValueSemanticsProvider.java
rename to core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/blobs/BlobValueSemantics.java
index 1469543..2e3d816 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/blobs/BlobValueSemanticsProvider.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/blobs/BlobValueSemantics.java
@@ -26,67 +26,30 @@ import javax.activation.MimeTypeParseException;
 
 import org.springframework.stereotype.Component;
 
-import org.apache.isis.applib.adapters.DefaultsProvider;
-import org.apache.isis.applib.adapters.Parser;
+import org.apache.isis.applib.adapters.AbstractValueSemanticsProvider;
+import org.apache.isis.applib.adapters.EncoderDecoder;
+import org.apache.isis.applib.adapters.Renderer;
+import org.apache.isis.applib.adapters.ValueSemanticsProvider;
+import org.apache.isis.applib.adapters.ValueSemanticsProvider.Context;
 import org.apache.isis.applib.value.Blob;
 import org.apache.isis.commons.internal.base._Bytes;
 import org.apache.isis.commons.internal.base._Strings;
-import org.apache.isis.core.metamodel.facetapi.Facet;
-import org.apache.isis.core.metamodel.facetapi.FacetHolder;
-import org.apache.isis.core.metamodel.facets.object.value.vsp.ValueSemanticsProviderAndFacetAbstract;
 
 @Component
-public class BlobValueSemanticsProvider
-extends ValueSemanticsProviderAndFacetAbstract<Blob>
-implements BlobValueFacet {
+public class BlobValueSemantics
+extends AbstractValueSemanticsProvider<Blob>
+implements
+    EncoderDecoder<Blob>,
+    Renderer<Blob> {
 
-    private static final int TYPICAL_LENGTH = 0;
-
-    private static Class<? extends Facet> type() {
-        return BlobValueFacet.class;
-    }
-
-    private static final Blob DEFAULT_VALUE = null;
-
-    public BlobValueSemanticsProvider() {
-        this(null);
-    }
-
-    public BlobValueSemanticsProvider(final FacetHolder holder) {
-        super(type(), holder, Blob.class, TYPICAL_LENGTH, -1, Immutability.IMMUTABLE, EqualByContent.NOT_HONOURED, DEFAULT_VALUE);
-    }
+    // RENDERER
 
     @Override
-    public String titleString(final Object object) {
-        return object != null? ((Blob)object).getName(): "[null]";
+    public String presentationValue(final ValueSemanticsProvider.Context context, final Blob value) {
+        return render(value, Blob::getName);
     }
 
-    // //////////////////////////////////////////////////////////////////
-    // Parser
-    // //////////////////////////////////////////////////////////////////
-
-    @Override
-    public Parser<Blob> getParser() {
-        return null;
-    }
-
-    @Override
-    protected Blob doParse(final Context context, final String entry) {
-        return null;
-    }
-
-    // //////////////////////////////////////////////////////////////////
-    // DefaultsProvider
-    // //////////////////////////////////////////////////////////////////
-
-    @Override
-    public DefaultsProvider<Blob> getDefaultsProvider() {
-        return null;
-    }
-
-    // //////////////////////////////////////////////////////////////////
-    // EncoderDecoder
-    // //////////////////////////////////////////////////////////////////
+    // -- ENCODER DECODER
 
     @Override
     public String toEncodedString(final Blob blob) {
@@ -109,5 +72,4 @@ implements BlobValueFacet {
         }
     }
 
-
 }
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/booleans/BooleanValueSemantics.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/booleans/BooleanValueSemantics.java
index dacf62d..286ccae 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/booleans/BooleanValueSemantics.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/booleans/BooleanValueSemantics.java
@@ -24,6 +24,8 @@ import org.apache.isis.applib.adapters.AbstractValueSemanticsProvider;
 import org.apache.isis.applib.adapters.DefaultsProvider;
 import org.apache.isis.applib.adapters.EncoderDecoder;
 import org.apache.isis.applib.adapters.Parser;
+import org.apache.isis.applib.adapters.Renderer;
+import org.apache.isis.applib.adapters.ValueSemanticsProvider;
 import org.apache.isis.applib.exceptions.UnrecoverableException;
 import org.apache.isis.applib.exceptions.recoverable.TextEntryParseException;
 import org.apache.isis.commons.internal.base._Strings;
@@ -37,22 +39,29 @@ extends AbstractValueSemanticsProvider<Boolean>
 implements
     DefaultsProvider<Boolean>,
     EncoderDecoder<Boolean>,
-    Parser<Boolean> {
+    Parser<Boolean>,
+    Renderer<Boolean> {
 
     @Override
     public Boolean getDefaultValue() {
-        return Boolean.TRUE;
+        return Boolean.FALSE;
     }
 
     // -- ENCODER DECODER
 
     @Override
-    public String toEncodedString(final Boolean object) {
-        return isSet(object) ? "T" : "F";
+    public String toEncodedString(final Boolean value) {
+        if(value==null) {
+            return null;
+        }
+        return value.booleanValue() ? "T" : "F";
     }
 
     @Override
     public Boolean fromEncodedString(final String data) {
+        if(data==null) {
+            return null;
+        }
         final int dataLength = data.length();
         if (dataLength == 1) {
             switch (data.charAt(0)) {
@@ -76,20 +85,22 @@ implements
         throw new UnrecoverableException("Invalid data for logical, expected 1, 4 or 5 bytes, got " + dataLength + ": " + data);
     }
 
-    // -- PARSER
+    // -- RENDERER
 
     @Override
-    public String presentationValue(final Context context, final Boolean value) {
-        return value == null ? "" : isSet(value) ? "True" : "False";
+    public String presentationValue(final ValueSemanticsProvider.Context context, final Boolean value) {
+        return render(value, v->v.booleanValue() ? "True" : "False");
     }
 
+    // -- PARSER
+
     @Override
-    public String parseableTextRepresentation(final Context context, final Boolean value) {
+    public String parseableTextRepresentation(final ValueSemanticsProvider.Context context, final Boolean value) {
         return value != null ? value.toString(): null;
     }
 
     @Override
-    public Boolean parseTextRepresentation(final Context context, final String text) {
+    public Boolean parseTextRepresentation(final ValueSemanticsProvider.Context context, final String text) {
         final var input = _Strings.blankToNullOrTrim(text);
         if(input==null) {
             return null;
@@ -113,10 +124,4 @@ implements
         return 6;
     }
 
-    // -- HELPER
-
-    private boolean isSet(final Boolean value) {
-        return value.booleanValue();
-    }
-
 }
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/bytes/ByteValueSemanticsProviderAbstract.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/bytes/ByteValueSemanticsProviderAbstract.java
index 9f9c147..eac566f 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/bytes/ByteValueSemanticsProviderAbstract.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/bytes/ByteValueSemanticsProviderAbstract.java
@@ -24,7 +24,7 @@ import java.text.ParseException;
 import java.util.Locale;
 import java.util.function.BiConsumer;
 
-import org.apache.isis.applib.adapters.Parser;
+import org.apache.isis.applib.adapters.ValueSemanticsProvider;
 import org.apache.isis.applib.exceptions.recoverable.TextEntryParseException;
 import org.apache.isis.core.metamodel.commons.LocaleUtil;
 import org.apache.isis.core.metamodel.facetapi.Facet;
@@ -60,7 +60,7 @@ implements ByteValueFacet {
     // //////////////////////////////////////////////////////////////////
 
     @Override
-    protected Byte doParse(final Parser.Context context, final String entry) {
+    protected Byte doParse(final ValueSemanticsProvider.Context context, final String entry) {
         try {
             return Byte.valueOf(format.parse(entry).byteValue());
         } catch (final ParseException e) {
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/chars/CharValueSemanticsProviderAbstract.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/chars/CharValueSemanticsProviderAbstract.java
index 9a3dd15..71ef2b7 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/chars/CharValueSemanticsProviderAbstract.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/chars/CharValueSemanticsProviderAbstract.java
@@ -18,7 +18,7 @@
  */
 package org.apache.isis.core.metamodel.facets.value.chars;
 
-import org.apache.isis.applib.adapters.Parser;
+import org.apache.isis.applib.adapters.ValueSemanticsProvider;
 import org.apache.isis.applib.exceptions.recoverable.InvalidEntryException;
 import org.apache.isis.core.metamodel.facetapi.Facet;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
@@ -46,7 +46,7 @@ implements CharValueFacet {
     // //////////////////////////////////////////////////////////////////
 
     @Override
-    public Character doParse(final Parser.Context context, final String entry) {
+    public Character doParse(final ValueSemanticsProvider.Context context, final String entry) {
         if (entry.length() > 1) {
             throw new InvalidEntryException("Only a single character is required");
         } else {
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/clobs/ClobValueFacet.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/clobs/ClobValueFacet.java
deleted file mode 100644
index c0bcf3d..0000000
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/clobs/ClobValueFacet.java
+++ /dev/null
@@ -1,25 +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.value.clobs;
-
-import org.apache.isis.core.metamodel.facetapi.Facet;
-
-public interface ClobValueFacet extends Facet {
-
-}
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/clobs/ClobValueFacetUsingSemanticsProviderFactory.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/clobs/ClobValueFacetUsingSemanticsProviderFactory.java
deleted file mode 100644
index 5b445d4..0000000
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/clobs/ClobValueFacetUsingSemanticsProviderFactory.java
+++ /dev/null
@@ -1,46 +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.value.clobs;
-
-import javax.inject.Inject;
-
-import org.apache.isis.applib.value.Clob;
-import org.apache.isis.core.metamodel.context.MetaModelContext;
-import org.apache.isis.core.metamodel.facetapi.FacetHolder;
-import org.apache.isis.core.metamodel.facets.object.value.vsp.ValueFacetUsingSemanticsProviderFactory;
-
-public class ClobValueFacetUsingSemanticsProviderFactory
-extends ValueFacetUsingSemanticsProviderFactory<Clob> {
-
-    @Inject
-    public ClobValueFacetUsingSemanticsProviderFactory(final MetaModelContext mmc) {
-        super(mmc);
-    }
-
-    @Override
-    public void process(final ProcessClassContext processClassContext) {
-        final Class<?> type = processClassContext.getCls();
-        final FacetHolder holder = processClassContext.getFacetHolder();
-        if (type != Clob.class) {
-            return;
-        }
-        addValueFacet(new ClobValueSemanticsProvider(holder));
-    }
-
-}
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/clobs/ClobValueSemanticsProvider.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/clobs/ClobValueSemantics.java
similarity index 50%
rename from core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/clobs/ClobValueSemanticsProvider.java
rename to core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/clobs/ClobValueSemantics.java
index 3c8bb1c..d8f0718 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/clobs/ClobValueSemanticsProvider.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/clobs/ClobValueSemantics.java
@@ -23,65 +23,27 @@ import javax.activation.MimeTypeParseException;
 
 import org.springframework.stereotype.Component;
 
-import org.apache.isis.applib.adapters.DefaultsProvider;
-import org.apache.isis.applib.adapters.Parser;
+import org.apache.isis.applib.adapters.AbstractValueSemanticsProvider;
+import org.apache.isis.applib.adapters.EncoderDecoder;
+import org.apache.isis.applib.adapters.Renderer;
+import org.apache.isis.applib.adapters.ValueSemanticsProvider;
 import org.apache.isis.applib.value.Clob;
-import org.apache.isis.core.metamodel.facetapi.Facet;
-import org.apache.isis.core.metamodel.facetapi.FacetHolder;
-import org.apache.isis.core.metamodel.facets.object.value.vsp.ValueSemanticsProviderAndFacetAbstract;
 
 @Component
-public class ClobValueSemanticsProvider
-extends ValueSemanticsProviderAndFacetAbstract<Clob>
-implements ClobValueFacet {
+public class ClobValueSemantics
+extends AbstractValueSemanticsProvider<Clob>
+implements
+    EncoderDecoder<Clob>,
+    Renderer<Clob> {
 
-    private static final int TYPICAL_LENGTH = 0;
-
-    private static Class<? extends Facet> type() {
-        return ClobValueFacet.class;
-    }
-
-    private static final Clob DEFAULT_VALUE = null;
-
-    public ClobValueSemanticsProvider() {
-        this(null);
-    }
-
-    public ClobValueSemanticsProvider(final FacetHolder holder) {
-        super(type(), holder, Clob.class, TYPICAL_LENGTH, -1, Immutability.IMMUTABLE, EqualByContent.NOT_HONOURED, DEFAULT_VALUE);
-    }
-
-    @Override
-    public String titleString(final Object object) {
-        return object != null? ((Clob)object).getName(): "[null]";
-    }
-
-    // //////////////////////////////////////////////////////////////////
-    // Parser
-    // //////////////////////////////////////////////////////////////////
-
-    @Override
-    public Parser<Clob> getParser() {
-        return null;
-    }
-
-    @Override
-    protected Clob doParse(final Context context, final String entry) {
-        return null;
-    }
-
-    // //////////////////////////////////////////////////////////////////
-    // DefaultsProvider
-    // //////////////////////////////////////////////////////////////////
+    // RENDERER
 
     @Override
-    public DefaultsProvider<Clob> getDefaultsProvider() {
-        return null;
+    public String presentationValue(final ValueSemanticsProvider.Context context, final Clob value) {
+        return render(value, Clob::getName);
     }
 
-    // //////////////////////////////////////////////////////////////////
-    // EncoderDecoder
-    // //////////////////////////////////////////////////////////////////
+    // -- ENCODER DECODER
 
     @Override
     public String toEncodedString(final Clob clob) {
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/datejodalocal/JodaLocalDateValueSemanticsProvider.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/datejodalocal/JodaLocalDateValueSemanticsProvider.java
index c47f019..5aee141 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/datejodalocal/JodaLocalDateValueSemanticsProvider.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/datejodalocal/JodaLocalDateValueSemanticsProvider.java
@@ -27,7 +27,7 @@ import org.joda.time.format.DateTimeFormat;
 import org.joda.time.format.DateTimeFormatter;
 
 import org.apache.isis.applib.adapters.EncodingException;
-import org.apache.isis.applib.adapters.Parser;
+import org.apache.isis.applib.adapters.ValueSemanticsProvider;
 import org.apache.isis.commons.internal.collections._Lists;
 import org.apache.isis.commons.internal.collections._Maps;
 import org.apache.isis.core.metamodel.facetapi.Facet;
@@ -137,7 +137,7 @@ implements JodaLocalDateValueFacet {
 
     @Override
     protected LocalDate doParse(
-            final Parser.Context context,
+            final ValueSemanticsProvider.Context context,
             final String entry) {
 
         updateTitleStringFormatterIfOverridden();
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/datetimejodalocal/JodaLocalDateTimeValueSemanticsProvider.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/datetimejodalocal/JodaLocalDateTimeValueSemanticsProvider.java
index 3454447..7a7619f 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/datetimejodalocal/JodaLocalDateTimeValueSemanticsProvider.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/datetimejodalocal/JodaLocalDateTimeValueSemanticsProvider.java
@@ -28,7 +28,7 @@ import org.joda.time.format.DateTimeFormatter;
 import org.joda.time.format.ISODateTimeFormat;
 
 import org.apache.isis.applib.adapters.EncodingException;
-import org.apache.isis.applib.adapters.Parser;
+import org.apache.isis.applib.adapters.ValueSemanticsProvider;
 import org.apache.isis.commons.internal.collections._Lists;
 import org.apache.isis.commons.internal.collections._Maps;
 import org.apache.isis.core.metamodel.facetapi.Facet;
@@ -139,7 +139,7 @@ implements JodaLocalDateTimeValueFacet {
 
     @Override
     protected LocalDateTime doParse(
-            final Parser.Context context,
+            final ValueSemanticsProvider.Context context,
             final String entry) {
 
         updateTitleStringFormatterIfOverridden();
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/doubles/DoubleValueSemanticsProviderAbstract.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/doubles/DoubleValueSemanticsProviderAbstract.java
index ec8a867..63c36fa 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/doubles/DoubleValueSemanticsProviderAbstract.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/doubles/DoubleValueSemanticsProviderAbstract.java
@@ -24,7 +24,7 @@ import java.text.ParseException;
 import java.util.Locale;
 import java.util.function.BiConsumer;
 
-import org.apache.isis.applib.adapters.Parser;
+import org.apache.isis.applib.adapters.ValueSemanticsProvider;
 import org.apache.isis.applib.exceptions.recoverable.TextEntryParseException;
 import org.apache.isis.core.metamodel.commons.LocaleUtil;
 import org.apache.isis.core.metamodel.facetapi.Facet;
@@ -60,7 +60,7 @@ implements DoubleFloatingPointValueFacet {
     // //////////////////////////////////////////////////////////////////
 
     @Override
-    protected Double doParse(final Parser.Context context, final String entry) {
+    protected Double doParse(final ValueSemanticsProvider.Context context, final String entry) {
         try {
             return Double.valueOf(format.parse(entry).doubleValue());
         } catch (final ParseException e) {
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/floats/FloatValueSemanticsProviderAbstract.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/floats/FloatValueSemanticsProviderAbstract.java
index 97449d8..20c4719 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/floats/FloatValueSemanticsProviderAbstract.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/floats/FloatValueSemanticsProviderAbstract.java
@@ -24,7 +24,7 @@ import java.text.ParseException;
 import java.util.Locale;
 import java.util.function.BiConsumer;
 
-import org.apache.isis.applib.adapters.Parser;
+import org.apache.isis.applib.adapters.ValueSemanticsProvider;
 import org.apache.isis.applib.exceptions.recoverable.TextEntryParseException;
 import org.apache.isis.core.metamodel.commons.LocaleUtil;
 import org.apache.isis.core.metamodel.facetapi.Facet;
@@ -61,7 +61,7 @@ implements FloatingPointValueFacet {
     // //////////////////////////////////////////////////////////////////
 
     @Override
-    protected Float doParse(final Parser.Context context, final String entry) {
+    protected Float doParse(final ValueSemanticsProvider.Context context, final String entry) {
         try {
             return Float.valueOf(format.parse(entry).floatValue());
         } catch (final ParseException e) {
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/image/ImageValueSemanticsProviderAbstract.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/image/ImageValueSemanticsProviderAbstract.java
index 4f0466e..9c17a8e 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/image/ImageValueSemanticsProviderAbstract.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/image/ImageValueSemanticsProviderAbstract.java
@@ -19,6 +19,7 @@
 package org.apache.isis.core.metamodel.facets.value.image;
 
 import org.apache.isis.applib.adapters.Parser;
+import org.apache.isis.applib.adapters.ValueSemanticsProvider;
 import org.apache.isis.applib.exceptions.unrecoverable.UnexpectedCallException;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
 import org.apache.isis.core.metamodel.facets.object.value.vsp.ValueSemanticsProviderAndFacetAbstract;
@@ -44,7 +45,7 @@ implements ImageValueFacet {
     }
 
     @Override
-    protected T doParse(final Parser.Context context, final String entry) {
+    protected T doParse(final ValueSemanticsProvider.Context context, final String entry) {
         throw new UnexpectedCallException();
     }
 
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/integer/IntValueSemanticsProviderAbstract.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/integer/IntValueSemanticsProviderAbstract.java
index 7d80a88..73e4651 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/integer/IntValueSemanticsProviderAbstract.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/integer/IntValueSemanticsProviderAbstract.java
@@ -24,7 +24,7 @@ import java.text.ParseException;
 import java.util.Locale;
 import java.util.function.BiConsumer;
 
-import org.apache.isis.applib.adapters.Parser;
+import org.apache.isis.applib.adapters.ValueSemanticsProvider;
 import org.apache.isis.applib.exceptions.recoverable.TextEntryParseException;
 import org.apache.isis.core.metamodel.commons.LocaleUtil;
 import org.apache.isis.core.metamodel.facetapi.Facet;
@@ -65,7 +65,7 @@ implements IntegerValueFacet {
     // //////////////////////////////////////////////////////////////////
 
     @Override
-    protected Integer doParse(final Parser.Context context, final String entry) {
+    protected Integer doParse(final ValueSemanticsProvider.Context context, final String entry) {
         try {
             return Integer.valueOf(format.parse(entry).intValue());
         } catch (final ParseException e) {
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/localrespath/LocalResourcePathValueSemanticsProvider.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/localrespath/LocalResourcePathValueSemanticsProvider.java
index 91a3b00..f5ee443 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/localrespath/LocalResourcePathValueSemanticsProvider.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/localrespath/LocalResourcePathValueSemanticsProvider.java
@@ -22,7 +22,7 @@ import java.nio.file.InvalidPathException;
 
 import org.springframework.stereotype.Component;
 
-import org.apache.isis.applib.adapters.Parser;
+import org.apache.isis.applib.adapters.ValueSemanticsProvider;
 import org.apache.isis.applib.value.LocalResourcePath;
 import org.apache.isis.core.metamodel.facetapi.Facet;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
@@ -57,7 +57,7 @@ implements LocalResourcePathValueFacet {
     // //////////////////////////////////////////////////////////////////
 
     @Override
-    protected LocalResourcePath doParse(final Parser.Context context, final String entry) {
+    protected LocalResourcePath doParse(final ValueSemanticsProvider.Context context, final String entry) {
         if (entry.trim().equals("")) {
             return null;
         }
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/longs/LongValueSemanticsProviderAbstract.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/longs/LongValueSemanticsProviderAbstract.java
index 69e9323..478972a 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/longs/LongValueSemanticsProviderAbstract.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/longs/LongValueSemanticsProviderAbstract.java
@@ -24,7 +24,7 @@ import java.text.ParseException;
 import java.util.Locale;
 import java.util.function.BiConsumer;
 
-import org.apache.isis.applib.adapters.Parser;
+import org.apache.isis.applib.adapters.ValueSemanticsProvider;
 import org.apache.isis.applib.exceptions.recoverable.TextEntryParseException;
 import org.apache.isis.core.metamodel.commons.LocaleUtil;
 import org.apache.isis.core.metamodel.facetapi.Facet;
@@ -61,7 +61,7 @@ implements LongValueFacet {
     // //////////////////////////////////////////////////////////////////
 
     @Override
-    protected Long doParse(final Parser.Context context, final String entry) {
+    protected Long doParse(final ValueSemanticsProvider.Context context, final String entry) {
         try {
             return Long.valueOf(format.parse(entry).longValue());
         } catch (final ParseException e) {
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/markup/MarkupValueSemantics.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/markup/MarkupValueSemantics.java
index ff662a3..7439df8 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/markup/MarkupValueSemantics.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/markup/MarkupValueSemantics.java
@@ -23,6 +23,8 @@ import org.springframework.stereotype.Component;
 import org.apache.isis.applib.adapters.AbstractValueSemanticsProvider;
 import org.apache.isis.applib.adapters.EncoderDecoder;
 import org.apache.isis.applib.adapters.Parser;
+import org.apache.isis.applib.adapters.Renderer;
+import org.apache.isis.applib.adapters.ValueSemanticsProvider;
 import org.apache.isis.applib.value.Markup;
 
 @Component
@@ -30,7 +32,8 @@ public class MarkupValueSemantics
 extends AbstractValueSemanticsProvider<Markup>
 implements
     EncoderDecoder<Markup>,
-    Parser<Markup> {
+    Parser<Markup>,
+    Renderer<Markup>{
 
     // -- ENCODER DECODER
 
@@ -44,20 +47,22 @@ implements
         return new Markup(html);
     }
 
-    // -- PARSER
+    // -- RENDERER
 
     @Override
-    public String presentationValue(final Context context, final Markup value) {
+    public String presentationValue(final ValueSemanticsProvider.Context context, final Markup value) {
         return value != null? value.asHtml(): "[null]";
     }
 
+    // -- PARSER
+
     @Override
-    public String parseableTextRepresentation(final Context context, final Markup value) {
+    public String parseableTextRepresentation(final ValueSemanticsProvider.Context context, final Markup value) {
         return toEncodedString(value);
     }
 
     @Override
-    public Markup parseTextRepresentation(final Context context, final String text) {
+    public Markup parseTextRepresentation(final ValueSemanticsProvider.Context context, final String text) {
         return fromEncodedString(text);
     }
 
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/password/PasswordValueSemanticsProvider.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/password/PasswordValueSemanticsProvider.java
index 3970d32..52ae32c 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/password/PasswordValueSemanticsProvider.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/password/PasswordValueSemanticsProvider.java
@@ -20,7 +20,7 @@ package org.apache.isis.core.metamodel.facets.value.password;
 
 import org.springframework.stereotype.Component;
 
-import org.apache.isis.applib.adapters.Parser;
+import org.apache.isis.applib.adapters.ValueSemanticsProvider;
 import org.apache.isis.applib.value.Password;
 import org.apache.isis.core.metamodel.facetapi.Facet;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
@@ -52,7 +52,7 @@ implements PasswordValueFacet {
     // //////////////////////////////////////////////////////////////////
 
     @Override
-    protected Password doParse(final Parser.Context context, final String text) {
+    protected Password doParse(final ValueSemanticsProvider.Context context, final String text) {
         return new Password(text);
     }
 
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/shortint/ShortValueSemanticsProviderAbstract.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/shortint/ShortValueSemanticsProviderAbstract.java
index e97bf0b..087ae92 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/shortint/ShortValueSemanticsProviderAbstract.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/shortint/ShortValueSemanticsProviderAbstract.java
@@ -24,7 +24,7 @@ import java.text.ParseException;
 import java.util.Locale;
 import java.util.function.BiConsumer;
 
-import org.apache.isis.applib.adapters.Parser;
+import org.apache.isis.applib.adapters.ValueSemanticsProvider;
 import org.apache.isis.applib.exceptions.recoverable.TextEntryParseException;
 import org.apache.isis.core.metamodel.commons.LocaleUtil;
 import org.apache.isis.core.metamodel.facetapi.Facet;
@@ -63,7 +63,7 @@ implements ShortValueFacet {
     // //////////////////////////////////////////////////////////////////
 
     @Override
-    protected Short doParse(final Parser.Context context, final String entry) {
+    protected Short doParse(final ValueSemanticsProvider.Context context, final String entry) {
         try {
             return Short.valueOf(format.parse(entry).shortValue());
         } catch (final ParseException e) {
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/string/StringValueSemanticsProvider.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/string/StringValueSemanticsProvider.java
index 550ce3d..8ce7540 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/string/StringValueSemanticsProvider.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/string/StringValueSemanticsProvider.java
@@ -18,7 +18,7 @@
  */
 package org.apache.isis.core.metamodel.facets.value.string;
 
-import org.apache.isis.applib.adapters.Parser;
+import org.apache.isis.applib.adapters.ValueSemanticsProvider;
 import org.apache.isis.core.metamodel.facetapi.Facet;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
 import org.apache.isis.core.metamodel.facets.object.value.vsp.ValueSemanticsProviderAndFacetAbstract;
@@ -43,7 +43,7 @@ implements StringValueFacet {
     // //////////////////////////////////////////////////////////////////
 
     @Override
-    protected String doParse(final Parser.Context context, final String entry) {
+    protected String doParse(final ValueSemanticsProvider.Context context, final String entry) {
         if (entry.trim().equals("")) {
             return null;
         } else {
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/temporal/TemporalValueSemanticsProviderAbstract.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/temporal/TemporalValueSemanticsProviderAbstract.java
index 3e531ee..680261f 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/temporal/TemporalValueSemanticsProviderAbstract.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/temporal/TemporalValueSemanticsProviderAbstract.java
@@ -34,7 +34,7 @@ import java.util.stream.Stream;
 import org.springframework.lang.Nullable;
 
 import org.apache.isis.applib.adapters.EncodingException;
-import org.apache.isis.applib.adapters.Parser;
+import org.apache.isis.applib.adapters.ValueSemanticsProvider;
 import org.apache.isis.applib.exceptions.recoverable.TextEntryParseException;
 import org.apache.isis.commons.collections.Can;
 import org.apache.isis.commons.internal.base._Casts;
@@ -195,7 +195,7 @@ implements TemporalValueFacet<T> {
 
     @Override
     protected T doParse(
-            final Parser.Context context,
+            final ValueSemanticsProvider.Context context,
             final String entry) {
 
         T contextTemporal = _Casts.uncheckedCast(context);
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/treenode/TreeNodeValueSemanticsProvider.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/treenode/TreeNodeValueSemanticsProvider.java
index 5475759..160054d 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/treenode/TreeNodeValueSemanticsProvider.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/treenode/TreeNodeValueSemanticsProvider.java
@@ -22,6 +22,7 @@ import org.springframework.stereotype.Component;
 
 import org.apache.isis.applib.adapters.DefaultsProvider;
 import org.apache.isis.applib.adapters.Parser;
+import org.apache.isis.applib.adapters.ValueSemanticsProvider;
 import org.apache.isis.applib.graph.tree.TreeNode;
 import org.apache.isis.applib.graph.tree.TreeState;
 import org.apache.isis.applib.services.urlencoding.UrlEncodingService;
@@ -71,7 +72,7 @@ implements TreeNodeValueFacet {
     }
 
     @Override
-    protected TreeNode doParse(final Context context, final String entry) {
+    protected TreeNode doParse(final ValueSemanticsProvider.Context context, final String entry) {
         return null;
     }
 
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/url/URLValueSemantics.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/url/URLValueSemantics.java
index 81c9ddc..328f85a 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/url/URLValueSemantics.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/url/URLValueSemantics.java
@@ -26,6 +26,8 @@ import org.springframework.stereotype.Component;
 import org.apache.isis.applib.adapters.AbstractValueSemanticsProvider;
 import org.apache.isis.applib.adapters.EncoderDecoder;
 import org.apache.isis.applib.adapters.Parser;
+import org.apache.isis.applib.adapters.Renderer;
+import org.apache.isis.applib.adapters.ValueSemanticsProvider;
 import org.apache.isis.commons.internal.base._Strings;
 
 @Component
@@ -33,7 +35,8 @@ public class URLValueSemantics
 extends AbstractValueSemanticsProvider<java.net.URL>
 implements
     EncoderDecoder<java.net.URL>,
-    Parser<java.net.URL> {
+    Parser<java.net.URL>,
+    Renderer<java.net.URL> {
 
     // -- ENCODER DECODER
 
@@ -54,20 +57,22 @@ implements
         }
     }
 
-    // -- PARSER
+    // -- RENDERER
 
     @Override
-    public String presentationValue(final Context context, final URL value) {
+    public String presentationValue(final ValueSemanticsProvider.Context context, final URL value) {
         return value != null ? value.toString(): "";
     }
 
+    // -- PARSER
+
     @Override
-    public String parseableTextRepresentation(final Context context, final URL value) {
+    public String parseableTextRepresentation(final ValueSemanticsProvider.Context context, final URL value) {
         return value != null ? value.toString(): null;
     }
 
     @Override
-    public URL parseTextRepresentation(final Context context, final String text) {
+    public URL parseTextRepresentation(final ValueSemanticsProvider.Context context, final String text) {
         final var input = _Strings.blankToNullOrTrim(text);
         if(input==null) {
             return null;
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/uuid/UUIDValueSemantics.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/uuid/UUIDValueSemantics.java
index 393f89f..45ee560 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/uuid/UUIDValueSemantics.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/uuid/UUIDValueSemantics.java
@@ -23,13 +23,16 @@ import java.util.UUID;
 import org.apache.isis.applib.adapters.AbstractValueSemanticsProvider;
 import org.apache.isis.applib.adapters.EncoderDecoder;
 import org.apache.isis.applib.adapters.Parser;
+import org.apache.isis.applib.adapters.Renderer;
+import org.apache.isis.applib.adapters.ValueSemanticsProvider;
 import org.apache.isis.commons.internal.base._Strings;
 
 public class UUIDValueSemantics
 extends AbstractValueSemanticsProvider<UUID>
 implements
     EncoderDecoder<UUID>,
-    Parser<UUID> {
+    Parser<UUID>,
+    Renderer<UUID> {
 
     // -- ENCODER DECODER
 
@@ -43,20 +46,22 @@ implements
         return UUID.fromString(data);
     }
 
-    // -- PARSER
+    // -- RENDERER
 
     @Override
-    public String presentationValue(final Context context, final UUID value) {
+    public String presentationValue(final ValueSemanticsProvider.Context context, final UUID value) {
         return value == null ? "" : value.toString();
     }
 
+    // -- PARSER
+
     @Override
-    public String parseableTextRepresentation(final Context context, final UUID value) {
+    public String parseableTextRepresentation(final ValueSemanticsProvider.Context context, final UUID value) {
         return value == null ? null : value.toString();
     }
 
     @Override
-    public UUID parseTextRepresentation(final Context context, final String text) {
+    public UUID parseTextRepresentation(final ValueSemanticsProvider.Context context, final String text) {
         final var input = _Strings.blankToNullOrTrim(text);
         return input!=null
                 ? UUID.fromString(input)
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/progmodels/dflt/ProgrammingModelFacetsJava11.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/progmodels/dflt/ProgrammingModelFacetsJava11.java
index 6da7efd..8406168 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/progmodels/dflt/ProgrammingModelFacetsJava11.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/progmodels/dflt/ProgrammingModelFacetsJava11.java
@@ -85,12 +85,10 @@ import org.apache.isis.core.metamodel.facets.properties.update.PropertySetterFac
 import org.apache.isis.core.metamodel.facets.properties.validating.dflt.PropertyValidateFacetDefaultFactory;
 import org.apache.isis.core.metamodel.facets.properties.validating.method.PropertyValidateFacetViaMethodFactory;
 import org.apache.isis.core.metamodel.facets.value.biginteger.BigIntegerValueFacetUsingSemanticsProviderFactory;
-import org.apache.isis.core.metamodel.facets.value.blobs.BlobValueFacetUsingSemanticsProviderFactory;
 import org.apache.isis.core.metamodel.facets.value.bytes.BytePrimitiveValueFacetUsingSemanticsProviderFactory;
 import org.apache.isis.core.metamodel.facets.value.bytes.ByteWrapperValueFacetUsingSemanticsProviderFactory;
 import org.apache.isis.core.metamodel.facets.value.chars.CharPrimitiveValueFacetUsingSemanticsProviderFactory;
 import org.apache.isis.core.metamodel.facets.value.chars.CharWrapperValueFacetUsingSemanticsProviderFactory;
-import org.apache.isis.core.metamodel.facets.value.clobs.ClobValueFacetUsingSemanticsProviderFactory;
 import org.apache.isis.core.metamodel.facets.value.datejodalocal.JodaLocalDateValueFacetUsingSemanticsProviderFactory;
 import org.apache.isis.core.metamodel.facets.value.datesql.JavaSqlDateValueFacetUsingSemanticsProviderFactory;
 import org.apache.isis.core.metamodel.facets.value.datetimejoda.JodaDateTimeValueFacetUsingSemanticsProviderFactory;
@@ -296,8 +294,6 @@ extends ProgrammingModelAbstract {
         addFactory(FacetProcessingOrder.G1_VALUE_TYPES, new JavaAwtImageValueFacetUsingSemanticsProviderFactory(mmc));
 
         // applib values
-        addFactory(FacetProcessingOrder.G1_VALUE_TYPES, new BlobValueFacetUsingSemanticsProviderFactory(mmc));
-        addFactory(FacetProcessingOrder.G1_VALUE_TYPES, new ClobValueFacetUsingSemanticsProviderFactory(mmc));
         addFactory(FacetProcessingOrder.G1_VALUE_TYPES, new PasswordValueFacetUsingSemanticsProviderFactory(mmc));
 
         // jodatime values
diff --git a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/object/parseable/ParseableFacetUsingParserTest.java b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/object/parseable/ParseableFacetUsingParserTest.java
index 1b19776..563e969 100644
--- a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/object/parseable/ParseableFacetUsingParserTest.java
+++ b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/object/parseable/ParseableFacetUsingParserTest.java
@@ -28,6 +28,7 @@ import org.junit.Test;
 
 import org.apache.isis.applib.adapters.Parser;
 import org.apache.isis.applib.adapters.ParsingException;
+import org.apache.isis.applib.adapters.ValueSemanticsProvider;
 import org.apache.isis.applib.exceptions.recoverable.TextEntryParseException;
 import org.apache.isis.applib.services.iactn.InteractionProvider;
 import org.apache.isis.applib.services.inject.ServiceInjector;
@@ -81,7 +82,7 @@ public class ParseableFacetUsingParserTest {
 
         final Parser<String> parser = new Parser<String>() {
             @Override
-            public String parseTextRepresentation(final Parser.Context context, final String entry) {
+            public String parseTextRepresentation(final ValueSemanticsProvider.Context context, final String entry) {
                 if (entry.equals("invalid")) {
                     throw new ParsingException();
                 }
@@ -100,12 +101,7 @@ public class ParseableFacetUsingParserTest {
             }
 
             @Override
-            public String presentationValue(final Parser.Context context, final String object) {
-                return null;
-            }
-
-            @Override
-            public String parseableTextRepresentation(final Parser.Context context, final String existing) {
+            public String parseableTextRepresentation(final ValueSemanticsProvider.Context context, final String existing) {
                 return null;
             }
         };
diff --git a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/object/value/ValueFacetAnnotationOrConfigurationFactoryTest.java b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/object/value/ValueFacetAnnotationOrConfigurationFactoryTest.java
index d8b78eb..1eae4a9 100644
--- a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/object/value/ValueFacetAnnotationOrConfigurationFactoryTest.java
+++ b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/object/value/ValueFacetAnnotationOrConfigurationFactoryTest.java
@@ -20,6 +20,7 @@ package org.apache.isis.core.metamodel.facets.object.value;
 
 import org.apache.isis.applib.adapters.AbstractValueSemanticsProvider;
 import org.apache.isis.applib.adapters.Parser;
+import org.apache.isis.applib.adapters.ValueSemanticsProvider;
 import org.apache.isis.applib.annotation.Value;
 import org.apache.isis.core.metamodel.facets.AbstractFacetFactoryTest;
 import org.apache.isis.core.metamodel.facets.FacetFactory.ProcessClassContext;
@@ -61,18 +62,13 @@ public class ValueFacetAnnotationOrConfigurationFactoryTest extends AbstractFace
 
         @Override
         public MyValueWithSemanticsProviderSpecifiedUsingConfiguration parseTextRepresentation(
-                final Parser.Context context,
+                final ValueSemanticsProvider.Context context,
                 final String entry) {
             return null;
         }
 
         @Override
-        public String presentationValue(final Parser.Context context, final MyValueWithSemanticsProviderSpecifiedUsingConfiguration object) {
-            return null;
-        }
-
-        @Override
-        public String parseableTextRepresentation(final Parser.Context context, final MyValueWithSemanticsProviderSpecifiedUsingConfiguration existing) {
+        public String parseableTextRepresentation(final ValueSemanticsProvider.Context context, final MyValueWithSemanticsProviderSpecifiedUsingConfiguration existing) {
             return null;
         }
 
@@ -91,18 +87,13 @@ public class ValueFacetAnnotationOrConfigurationFactoryTest extends AbstractFace
 
         @Override
         public NonAnnotatedValueSemanticsProviderSpecifiedUsingConfiguration parseTextRepresentation(
-                final Parser.Context context,
+                final ValueSemanticsProvider.Context context,
                 final String entry) {
             return null;
         }
 
         @Override
-        public String presentationValue(final Parser.Context context, final NonAnnotatedValueSemanticsProviderSpecifiedUsingConfiguration object) {
-            return null;
-        }
-
-        @Override
-        public String parseableTextRepresentation(final Parser.Context context, final NonAnnotatedValueSemanticsProviderSpecifiedUsingConfiguration existing) {
+        public String parseableTextRepresentation(final ValueSemanticsProvider.Context context, final NonAnnotatedValueSemanticsProviderSpecifiedUsingConfiguration existing) {
             return null;
         }
 
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 7b2710d..3e69903 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
@@ -67,7 +67,7 @@ extends AbstractFacetFactoryJUnit4TestCase {
 
     @Test
     public void verifyProgrammingModelNumberOfFactories() {
-        assertEquals(100, programmingModel.streamFactories().count());
+        assertEquals(98, programmingModel.streamFactories().count());
     }
 
     @Test //verify we have the javac -parameter flag set when compiling this class
diff --git a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/value/BlobValueSemanticsProviderTest.java b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/value/BlobValueSemanticsProviderTest.java
index 831f762..3bbc705 100644
--- a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/value/BlobValueSemanticsProviderTest.java
+++ b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/value/BlobValueSemanticsProviderTest.java
@@ -26,24 +26,19 @@ import static org.hamcrest.MatcherAssert.assertThat;
 import static org.junit.Assert.assertEquals;
 
 import org.apache.isis.applib.value.Blob;
-import org.apache.isis.core.metamodel.facetapi.FacetHolder;
-import org.apache.isis.core.metamodel.facetapi.FacetHolderAbstract;
-import org.apache.isis.core.metamodel.facets.value.blobs.BlobValueSemanticsProvider;
+import org.apache.isis.core.metamodel.facets.value.blobs.BlobValueSemantics;
 
 public class BlobValueSemanticsProviderTest
 extends ValueSemanticsProviderAbstractTestCase {
 
-    private BlobValueSemanticsProvider value;
+    private BlobValueSemantics value;
     private Blob blob;
-    private FacetHolder holder;
 
     @Before
     public void setUpObjects() throws Exception {
         blob = new Blob("myfile1.docx", "application", "vnd.ms-word", new byte[]{1,2,3,4});
         allowMockAdapterToReturn(blob);
-        holder = FacetHolderAbstract.forTesting(metaModelContext);
-
-        setValue(value = new BlobValueSemanticsProvider(holder));
+        setSemanitcs(value = new BlobValueSemantics());
     }
 
     @Test
diff --git a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/value/BooleanValueSemanticsProviderTest.java b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/value/BooleanValueSemanticsProviderTest.java
index 5f3b18d..07ccde4 100644
--- a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/value/BooleanValueSemanticsProviderTest.java
+++ b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/value/BooleanValueSemanticsProviderTest.java
@@ -24,6 +24,7 @@ import org.junit.Test;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.fail;
 
+import org.apache.isis.applib.adapters.AbstractValueSemanticsProvider;
 import org.apache.isis.applib.exceptions.recoverable.TextEntryParseException;
 import org.apache.isis.core.metamodel.facets.value.booleans.BooleanValueSemantics;
 
@@ -80,7 +81,8 @@ extends ValueSemanticsProviderAbstractTestCase {
 
     @Test
     public void testTitleWhenNotSet() throws Exception {
-        assertEquals("", value.presentationValue(null, null));
+        assertEquals(AbstractValueSemanticsProvider.NULL_REPRESENTATION,
+                value.presentationValue(null, null));
     }
 
     @Test
diff --git a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/value/ClobValueSemanticsProviderTest.java b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/value/ClobValueSemanticsProviderTest.java
index 41c524e..a82da5f 100644
--- a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/value/ClobValueSemanticsProviderTest.java
+++ b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/value/ClobValueSemanticsProviderTest.java
@@ -26,24 +26,20 @@ import static org.hamcrest.MatcherAssert.assertThat;
 import static org.junit.Assert.assertEquals;
 
 import org.apache.isis.applib.value.Clob;
-import org.apache.isis.core.metamodel.facetapi.FacetHolder;
-import org.apache.isis.core.metamodel.facetapi.FacetHolderAbstract;
-import org.apache.isis.core.metamodel.facets.value.clobs.ClobValueSemanticsProvider;
+import org.apache.isis.core.metamodel.facets.value.clobs.ClobValueSemantics;
 
 public class ClobValueSemanticsProviderTest
 extends ValueSemanticsProviderAbstractTestCase {
 
-    private ClobValueSemanticsProvider value;
+    private ClobValueSemantics value;
     private Clob clob;
-    private FacetHolder holder;
 
     @Before
     public void setUpObjects() throws Exception {
         clob = new Clob("myfile1.xml", "application", "xml", "abcdef");
         allowMockAdapterToReturn(clob);
-        holder = FacetHolderAbstract.forTesting(metaModelContext);
 
-        setValue(value = new ClobValueSemanticsProvider(holder));
+        setSemanitcs(value = new ClobValueSemantics());
     }
 
     @Test
diff --git a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/value/ValueSemanticsProviderAbstractTestCase.java b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/value/ValueSemanticsProviderAbstractTestCase.java
index 9c459e0..cda6e78 100644
--- a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/value/ValueSemanticsProviderAbstractTestCase.java
+++ b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/value/ValueSemanticsProviderAbstractTestCase.java
@@ -36,6 +36,7 @@ import static org.junit.Assert.assertNull;
 import static org.junit.Assert.fail;
 
 import org.apache.isis.applib.adapters.AbstractValueSemanticsProvider;
+import org.apache.isis.applib.adapters.Renderer;
 import org.apache.isis.applib.adapters.ValueSemanticsProvider;
 import org.apache.isis.applib.services.iactn.InteractionProvider;
 import org.apache.isis.commons.internal.base._Casts;
@@ -183,7 +184,8 @@ public abstract class ValueSemanticsProviderAbstractTestCase {
                     ((ValueSemanticsProviderAndFacetAbstract<?>)valueSemanticsProvider)
                     .presentationValue(null, null));
         } else {
-            assertEquals("", valueSemanticsProvider.getParser().presentationValue(null, null));
+            assertEquals(AbstractValueSemanticsProvider.NULL_REPRESENTATION,
+                    valueSemanticsProvider.getRenderer().presentationValue(null, null));
         }
 
     }
diff --git a/examples/demo/domain/src/main/java/demoapp/dom/domain/objects/other/embedded/EmbeddedTypeVm-description.adoc b/examples/demo/domain/src/main/java/demoapp/dom/domain/objects/other/embedded/EmbeddedTypeVm-description.adoc
index b2933b4..ad12a2c 100644
--- a/examples/demo/domain/src/main/java/demoapp/dom/domain/objects/other/embedded/EmbeddedTypeVm-description.adoc
+++ b/examples/demo/domain/src/main/java/demoapp/dom/domain/objects/other/embedded/EmbeddedTypeVm-description.adoc
@@ -55,14 +55,14 @@ This class defines some behaviour:
 +
 [source,java,indent=0]
 ----
-include::ComplexNumberJdo.java[tags=title]
+include::jdo/ComplexNumberJdo.java[tags=title]
 ----
 
 * how to parse a string:
 +
 [source,java]
 ----
-include::ComplexNumberJdo.java[tags=parse,indent=0]
+include::jdo/ComplexNumberJdo.java[tags=parse,indent=0]
 ----
 +
 This is used by the "value semantics provider", discussed in the next section.
@@ -73,7 +73,7 @@ The `NumberConstantJdo_updateNumber` mixin allows the value of the complex numbe
 [source,java]
 .NumberConstantJdo_updateNumber.java
 ----
-include::NumberConstantJdo_updateNumber.java[tags=class]
+include::jdo/NumberConstantJdo_updateNumber.java[tags=class]
 ----
 
 
@@ -84,16 +84,23 @@ As mentioned in the previous section, the framework uses an implementation of `V
 [source,java]
 .ComplexNumberJdoValueSemantics.java
 ----
-include::ComplexNumberJdoValueSemantics.java[tags=class]
+include::jdo/ComplexNumberJdoValueSemantics.java[tags=class]
 ----
 
 where:
 
+* `getRenderer()` is responsible for rendering the value:
++
+[source,java,indent=0]
+----
+include::jdo/ComplexNumberJdoValueSemantics.java[tags=getRenderer]
+----
+
 * `getParser()` is responsible for parsing the entered string (for either an editable property or a parameter):
 +
 [source,java,indent=0]
 ----
-include::ComplexNumberJdoValueSemantics.java[tags=getParser]
+include::jdo/ComplexNumberJdoValueSemantics.java[tags=getParser]
 ----
 +
 In this case the implementation just delegates to the `ComplexNumberJdo` class itself.
@@ -102,13 +109,13 @@ In this case the implementation just delegates to the `ComplexNumberJdo` class i
 +
 [source,java,indent=0]
 ----
-include::ComplexNumberJdoValueSemantics.java[tags=getEncoderDecoder]
+include::jdo/ComplexNumberJdoValueSemantics.java[tags=getEncoderDecoder]
 ----
 
 * `getDefaultsProvider()` returns the default value to be used for non-optional parameters and properties:
 +
 [source,java,indent=0]
 ----
-include::ComplexNumberJdoValueSemantics.java[tags=getDefaultsProvider]
+include::jdo/ComplexNumberJdoValueSemantics.java[tags=getDefaultsProvider]
 ----
 
diff --git a/examples/demo/domain/src/main/java/demoapp/dom/domain/objects/other/embedded/jdo/ComplexNumberJdoValueSemantics.java b/examples/demo/domain/src/main/java/demoapp/dom/domain/objects/other/embedded/jdo/ComplexNumberJdoValueSemantics.java
index 4ba49e3..c699102 100644
--- a/examples/demo/domain/src/main/java/demoapp/dom/domain/objects/other/embedded/jdo/ComplexNumberJdoValueSemantics.java
+++ b/examples/demo/domain/src/main/java/demoapp/dom/domain/objects/other/embedded/jdo/ComplexNumberJdoValueSemantics.java
@@ -22,9 +22,11 @@ import java.util.stream.Collectors;
 
 import org.springframework.stereotype.Component;
 
+import org.apache.isis.applib.adapters.AbstractValueSemanticsProvider;
 import org.apache.isis.applib.adapters.DefaultsProvider;
 import org.apache.isis.applib.adapters.EncoderDecoder;
 import org.apache.isis.applib.adapters.Parser;
+import org.apache.isis.applib.adapters.Renderer;
 import org.apache.isis.applib.adapters.ValueSemanticsProvider;
 import org.apache.isis.commons.internal.base._NullSafe;
 import org.apache.isis.commons.internal.base._Strings;
@@ -34,9 +36,23 @@ import lombok.val;
 // tag::class[]
 @Component
 public class ComplexNumberJdoValueSemantics
-        implements ValueSemanticsProvider<ComplexNumberJdo>{
+        extends AbstractValueSemanticsProvider<ComplexNumberJdo>{
 
-// end::class[]
+ // end::class[]
+ // tag::getRenderer[]
+     @Override
+     public Renderer<ComplexNumberJdo> getRenderer() {
+ // end::getRenderer[]
+         // ...
+ // tag::getRenderer[]
+         return new Renderer<ComplexNumberJdo>() {
+             @Override
+             public String presentationValue(final ValueSemanticsProvider.Context context, final ComplexNumberJdo object) {
+                 return object!=null ? object.title() : "NaN";
+             }
+         };
+     }
+ // end::getRenderer[]
 // tag::getParser[]
     @Override
     public Parser<ComplexNumberJdo> getParser() {
@@ -45,7 +61,7 @@ public class ComplexNumberJdoValueSemantics
 // tag::getParser[]
         return new Parser<ComplexNumberJdo>() {
             @Override
-            public ComplexNumberJdo parseTextRepresentation(final Parser.Context context, final String entry) {
+            public ComplexNumberJdo parseTextRepresentation(final ValueSemanticsProvider.Context context, final String entry) {
                 return ComplexNumberJdo.parse(entry).orElse(null);
             }
             @Override
@@ -53,12 +69,8 @@ public class ComplexNumberJdoValueSemantics
                 return 30;
             }
             @Override
-            public String presentationValue(final Parser.Context context, final ComplexNumberJdo object) {
-                return object!=null ? object.title() : "NaN";
-            }
-            @Override
-            public String parseableTextRepresentation(final Parser.Context context, final ComplexNumberJdo existing) {
-                return presentationValue(context, existing);
+            public String parseableTextRepresentation(final ValueSemanticsProvider.Context context, final ComplexNumberJdo existing) {
+                return existing!=null ? existing.title() : null;
             }
         };
     }
diff --git a/examples/demo/domain/src/main/java/demoapp/dom/domain/objects/other/embedded/jpa/ComplexNumberJpaValueSemantics.java b/examples/demo/domain/src/main/java/demoapp/dom/domain/objects/other/embedded/jpa/ComplexNumberJpaValueSemantics.java
index d2c7ada..e5c3360 100644
--- a/examples/demo/domain/src/main/java/demoapp/dom/domain/objects/other/embedded/jpa/ComplexNumberJpaValueSemantics.java
+++ b/examples/demo/domain/src/main/java/demoapp/dom/domain/objects/other/embedded/jpa/ComplexNumberJpaValueSemantics.java
@@ -23,9 +23,11 @@ import java.util.stream.Collectors;
 import org.springframework.context.annotation.Profile;
 import org.springframework.stereotype.Component;
 
+import org.apache.isis.applib.adapters.AbstractValueSemanticsProvider;
 import org.apache.isis.applib.adapters.DefaultsProvider;
 import org.apache.isis.applib.adapters.EncoderDecoder;
 import org.apache.isis.applib.adapters.Parser;
+import org.apache.isis.applib.adapters.Renderer;
 import org.apache.isis.applib.adapters.ValueSemanticsProvider;
 import org.apache.isis.commons.internal.base._NullSafe;
 import org.apache.isis.commons.internal.base._Strings;
@@ -36,9 +38,23 @@ import lombok.val;
 // tag::class[]
 @Component
 public class ComplexNumberJpaValueSemantics
-        implements ValueSemanticsProvider<ComplexNumberJpa>{
+        extends AbstractValueSemanticsProvider<ComplexNumberJpa>{
 
 // end::class[]
+// tag::getRenderer[]
+    @Override
+    public Renderer<ComplexNumberJpa> getRenderer() {
+// end::getRenderer[]
+        // ...
+// tag::getRenderer[]
+        return new Renderer<ComplexNumberJpa>() {
+            @Override
+            public String presentationValue(final ValueSemanticsProvider.Context context, final ComplexNumberJpa object) {
+                return object!=null ? object.title() : "NaN";
+            }
+        };
+    }
+// end::getRenderer[]
 // tag::getParser[]
     @Override
     public Parser<ComplexNumberJpa> getParser() {
@@ -47,7 +63,7 @@ public class ComplexNumberJpaValueSemantics
 // tag::getParser[]
         return new Parser<ComplexNumberJpa>() {
             @Override
-            public ComplexNumberJpa parseTextRepresentation(final Parser.Context context, final String entry) {
+            public ComplexNumberJpa parseTextRepresentation(final ValueSemanticsProvider.Context context, final String entry) {
                 return ComplexNumberJpa.parse(entry).orElse(null);
             }
             @Override
@@ -55,12 +71,8 @@ public class ComplexNumberJpaValueSemantics
                 return 30;
             }
             @Override
-            public String presentationValue(final Parser.Context context, final ComplexNumberJpa object) {
-                return object!=null ? object.title() : "NaN";
-            }
-            @Override
-            public String parseableTextRepresentation(final Parser.Context context, final ComplexNumberJpa existing) {
-                return presentationValue(context, existing);
+            public String parseableTextRepresentation(final ValueSemanticsProvider.Context context, final ComplexNumberJpa existing) {
+                return existing!=null ? existing.title() : null;
             }
         };
     }
diff --git a/extensions/vw/fullcalendar/applib/src/main/java/org/apache/isis/extensions/fullcalendar/applib/value/CalendarEventSemanticsProvider.java b/extensions/vw/fullcalendar/applib/src/main/java/org/apache/isis/extensions/fullcalendar/applib/value/CalendarEventSemanticsProvider.java
index a74160c..c6c27f3 100644
--- a/extensions/vw/fullcalendar/applib/src/main/java/org/apache/isis/extensions/fullcalendar/applib/value/CalendarEventSemanticsProvider.java
+++ b/extensions/vw/fullcalendar/applib/src/main/java/org/apache/isis/extensions/fullcalendar/applib/value/CalendarEventSemanticsProvider.java
@@ -22,29 +22,18 @@ import java.time.Instant;
 
 import org.springframework.stereotype.Component;
 
+import org.apache.isis.applib.adapters.AbstractValueSemanticsProvider;
 import org.apache.isis.applib.adapters.DefaultsProvider;
-import org.apache.isis.applib.adapters.EncoderDecoder;
-import org.apache.isis.applib.adapters.Parser;
-import org.apache.isis.applib.adapters.ValueSemanticsProvider;
 
 @Component
 public class CalendarEventSemanticsProvider
-implements ValueSemanticsProvider<CalendarEvent> {
+extends AbstractValueSemanticsProvider<CalendarEvent>
+implements DefaultsProvider<CalendarEvent>{
 
     @Override
-	public DefaultsProvider<CalendarEvent> getDefaultsProvider() {
-		return ()->new CalendarEvent(
-		        Instant.now().toEpochMilli(), "Default Calendar", "New Event", "empty");
-	}
-
-	@Override
-	public EncoderDecoder<CalendarEvent> getEncoderDecoder() {
-	    return null;
-	}
-
-	@Override
-	public Parser<CalendarEvent> getParser() {
-	    return null;
-	}
+    public CalendarEvent getDefaultValue() {
+        return new CalendarEvent(
+                Instant.now().toEpochMilli(), "Default Calendar", "New Event", "empty");
+    }
 
 }
diff --git a/incubator/viewers/vaadin/ui/src/main/java/org/apache/isis/incubator/viewer/vaadin/ui/components/blob/BlobFieldFactory.java b/incubator/viewers/vaadin/ui/src/main/java/org/apache/isis/incubator/viewer/vaadin/ui/components/blob/BlobFieldFactory.java
index ede9934..d6a9cb3 100644
--- a/incubator/viewers/vaadin/ui/src/main/java/org/apache/isis/incubator/viewer/vaadin/ui/components/blob/BlobFieldFactory.java
+++ b/incubator/viewers/vaadin/ui/src/main/java/org/apache/isis/incubator/viewer/vaadin/ui/components/blob/BlobFieldFactory.java
@@ -22,7 +22,6 @@ import com.vaadin.flow.component.Component;
 
 import org.apache.isis.applib.annotation.PriorityPrecedence;
 import org.apache.isis.applib.value.Blob;
-import org.apache.isis.core.metamodel.facets.value.blobs.BlobValueFacet;
 import org.apache.isis.incubator.viewer.vaadin.ui.components.UiComponentHandlerVaa;
 import org.apache.isis.viewer.common.model.components.UiComponentFactory.ComponentRequest;
 
@@ -34,7 +33,7 @@ public class BlobFieldFactory implements UiComponentHandlerVaa {
 
     @Override
     public boolean isHandling(final ComponentRequest request) {
-        return request.hasFeatureTypeFacet(BlobValueFacet.class);
+        return request.hasValueFacet(Blob.class);
     }
 
     @Override
diff --git a/incubator/viewers/vaadin/ui/src/main/java/org/apache/isis/incubator/viewer/vaadin/ui/components/clob/ClobFieldFactory.java b/incubator/viewers/vaadin/ui/src/main/java/org/apache/isis/incubator/viewer/vaadin/ui/components/clob/ClobFieldFactory.java
index 551e895..4913a86 100644
--- a/incubator/viewers/vaadin/ui/src/main/java/org/apache/isis/incubator/viewer/vaadin/ui/components/clob/ClobFieldFactory.java
+++ b/incubator/viewers/vaadin/ui/src/main/java/org/apache/isis/incubator/viewer/vaadin/ui/components/clob/ClobFieldFactory.java
@@ -22,7 +22,6 @@ import com.vaadin.flow.component.Component;
 
 import org.apache.isis.applib.annotation.PriorityPrecedence;
 import org.apache.isis.applib.value.Clob;
-import org.apache.isis.core.metamodel.facets.value.clobs.ClobValueFacet;
 import org.apache.isis.incubator.viewer.vaadin.ui.components.UiComponentHandlerVaa;
 import org.apache.isis.viewer.common.model.components.UiComponentFactory.ComponentRequest;
 
@@ -34,7 +33,7 @@ public class ClobFieldFactory implements UiComponentHandlerVaa {
 
     @Override
     public boolean isHandling(final ComponentRequest request) {
-        return request.hasFeatureTypeFacet(ClobValueFacet.class);
+        return request.hasValueFacet(Clob.class);
     }
 
     @Override
diff --git a/valuetypes/asciidoc/metamodel/src/main/java/org/apache/isis/valuetypes/asciidoc/metamodel/semantics/AsciiDocValueSemanticsProvider.java b/valuetypes/asciidoc/metamodel/src/main/java/org/apache/isis/valuetypes/asciidoc/metamodel/semantics/AsciiDocValueSemanticsProvider.java
index 5c819ec..66523af 100644
--- a/valuetypes/asciidoc/metamodel/src/main/java/org/apache/isis/valuetypes/asciidoc/metamodel/semantics/AsciiDocValueSemanticsProvider.java
+++ b/valuetypes/asciidoc/metamodel/src/main/java/org/apache/isis/valuetypes/asciidoc/metamodel/semantics/AsciiDocValueSemanticsProvider.java
@@ -22,33 +22,36 @@ import javax.inject.Named;
 
 import org.springframework.stereotype.Component;
 
+import org.apache.isis.applib.adapters.AbstractValueSemanticsProvider;
 import org.apache.isis.applib.adapters.DefaultsProvider;
 import org.apache.isis.applib.adapters.EncoderDecoder;
 import org.apache.isis.applib.adapters.Parser;
+import org.apache.isis.applib.adapters.Renderer;
 import org.apache.isis.applib.adapters.ValueSemanticsProvider;
 import org.apache.isis.valuetypes.asciidoc.applib.value.AsciiDoc;
 
 @Component
 @Named("isis.val.AsciiDocValueSemanticsProvider")
 public class AsciiDocValueSemanticsProvider
+extends AbstractValueSemanticsProvider<AsciiDoc>
 implements
-    ValueSemanticsProvider<AsciiDoc>,
     //EncoderDecoder<AsciiDoc>,
+    Renderer<AsciiDoc>,
     Parser<AsciiDoc> {
 
     @Override
-    public String parseableTextRepresentation(final Parser.Context context, final AsciiDoc adoc) {
-        return adoc!=null ? adoc.getAdoc() : null;
+    public String presentationValue(final ValueSemanticsProvider.Context context, final AsciiDoc adoc) {
+        return adoc != null? adoc.asHtml(): "[null]";
     }
 
     @Override
-    public AsciiDoc parseTextRepresentation(final Parser.Context context, final String adoc) {
-        return adoc!=null ? AsciiDoc.valueOf(adoc) : null;
+    public String parseableTextRepresentation(final ValueSemanticsProvider.Context context, final AsciiDoc adoc) {
+        return adoc!=null ? adoc.getAdoc() : null;
     }
 
     @Override
-    public String presentationValue(final Parser.Context context, final AsciiDoc adoc) {
-        return adoc != null? adoc.asHtml(): "[null]";
+    public AsciiDoc parseTextRepresentation(final ValueSemanticsProvider.Context context, final String adoc) {
+        return adoc!=null ? AsciiDoc.valueOf(adoc) : null;
     }
 
     @Override
diff --git a/valuetypes/markdown/metamodel/src/main/java/org/apache/isis/valuetypes/markdown/metamodel/facets/MarkdownValueSemanticsProvider.java b/valuetypes/markdown/metamodel/src/main/java/org/apache/isis/valuetypes/markdown/metamodel/facets/MarkdownValueSemanticsProvider.java
index e2c8a5d..19bff4a 100644
--- a/valuetypes/markdown/metamodel/src/main/java/org/apache/isis/valuetypes/markdown/metamodel/facets/MarkdownValueSemanticsProvider.java
+++ b/valuetypes/markdown/metamodel/src/main/java/org/apache/isis/valuetypes/markdown/metamodel/facets/MarkdownValueSemanticsProvider.java
@@ -19,7 +19,7 @@
 package org.apache.isis.valuetypes.markdown.metamodel.facets;
 
 import org.apache.isis.applib.adapters.EncoderDecoder;
-import org.apache.isis.applib.adapters.Parser;
+import org.apache.isis.applib.adapters.ValueSemanticsProvider;
 import org.apache.isis.core.metamodel.facetapi.Facet;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
 import org.apache.isis.core.metamodel.facets.object.value.vsp.ValueSemanticsProviderAndFacetAbstract;
@@ -44,7 +44,7 @@ implements MarkdownValueFacet {
 
 
     @Override
-    protected Markdown doParse(final Parser.Context context, final String html) {
+    protected Markdown doParse(final ValueSemanticsProvider.Context context, final String html) {
         return fromEncodedString(html);
     }
 
diff --git a/viewers/common/src/main/java/org/apache/isis/viewer/common/model/components/UiComponentFactory.java b/viewers/common/src/main/java/org/apache/isis/viewer/common/model/components/UiComponentFactory.java
index 2cb725e..e5fbcd2 100644
--- a/viewers/common/src/main/java/org/apache/isis/viewer/common/model/components/UiComponentFactory.java
+++ b/viewers/common/src/main/java/org/apache/isis/viewer/common/model/components/UiComponentFactory.java
@@ -24,11 +24,13 @@ import java.util.function.Consumer;
 import org.springframework.lang.Nullable;
 
 import org.apache.isis.applib.annotation.LabelPosition;
+import org.apache.isis.applib.id.LogicalType;
 import org.apache.isis.commons.collections.Can;
 import org.apache.isis.commons.handler.ChainOfResponsibility;
 import org.apache.isis.commons.internal.base._NullSafe;
 import org.apache.isis.commons.internal.functions._Predicates;
 import org.apache.isis.core.metamodel.facetapi.Facet;
+import org.apache.isis.core.metamodel.facets.object.value.ValueFacet;
 import org.apache.isis.core.metamodel.interactions.managed.InteractionVeto;
 import org.apache.isis.core.metamodel.interactions.managed.ManagedAction;
 import org.apache.isis.core.metamodel.interactions.managed.ManagedFeature;
@@ -109,7 +111,17 @@ public interface UiComponentFactory<B, C> {
          */
         public <T extends Facet> boolean hasFeatureTypeFacet(final @Nullable Class<T> facetType) {
             return facetType!=null
-                    ? getFeatureTypeSpec().getFacet(facetType)!=null
+                    ? getFeatureTypeSpec().containsFacet(facetType)
+                    : false;
+        }
+
+        public boolean hasValueFacet(final @Nullable Class<?> valueType) {
+            return valueType!=null
+                    ? getFeatureTypeSpec().lookupFacet(ValueFacet.class)
+                            .map(ValueFacet::getValueType)
+                            .map(LogicalType::getCorrespondingClass)
+                            .map(valueType::equals)
+                            .orElse(false)
                     : false;
         }