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/15 13:26:26 UTC

[isis] branch master updated: ISIS-2871: UUID and BigDecimal ValueSemantics rewritten from scratch

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 211b0b3  ISIS-2871: UUID and BigDecimal ValueSemantics rewritten from scratch
211b0b3 is described below

commit 211b0b36939fe0f0dcaf4780cbf7abc49f4c5697
Author: Andi Huber <ah...@apache.org>
AuthorDate: Wed Sep 15 15:26:12 2021 +0200

    ISIS-2871: UUID and BigDecimal ValueSemantics rewritten from scratch
    
    so can be reused stand-alone, also supporting inheritance
    
    more to come
---
 .../adapters/AbstractValueSemanticsProvider.java   |  29 ++++++
 .../isis/commons/internal/base/_Strings.java       |  15 +++
 ...ingValueFacetUsingSemanticsProviderFactory.java |   2 +-
 .../ValueFacetUsingSemanticsProviderFactory.java   |  11 +-
 .../value/vsp/ValueSemanticsFacetAbstract.java     |  71 +++++++++++++
 .../maxlen/MaxFractionalDigitsFacet.java           |  31 ++++--
 .../maxlen/MaxFractionalDigitsFacetAbstract.java}  |  46 +++++----
 .../objectvalue/maxlen/MaxLengthFacetAbstract.java |   4 +-
 .../maxlen/MaxTotalDigitsFacet.java}               |  26 +++--
 .../maxlen/MaxTotalDigitsFacetAbstract.java}       |  46 +++++----
 ...ameterFromJavaxValidationAnnotationFactory.java |   5 +-
 ...ameterFromJavaxValidationDigitsAnnotation.java} |  23 ++---
 ...ameterFromJavaxValidationDigitsAnnotation.java} |  44 ++++----
 ...FromJavaxValidationDigitsAnnotationFactory.java |   8 +-
 ...opertyFromJavaxValidationDigitsAnnotation.java} |  25 ++---
 ...opertyFromJavaxValidationDigitsAnnotation.java} |  35 +++----
 ...DtoValueFacetUsingSemanticsProviderFactory.java |   2 +-
 ...DtoValueFacetUsingSemanticsProviderFactory.java |   2 +-
 ...DtoValueFacetUsingSemanticsProviderFactory.java |   2 +-
 .../value/bigdecimal/BigDecimalValueFacet.java     |  51 ---------
 ...malValueFacetUsingSemanticsProviderFactory.java |   3 +-
 .../value/bigdecimal/BigDecimalValueSemantics.java | 110 ++++++++++++++++++++
 .../BigDecimalValueSemanticsProvider.java          | 115 ---------------------
 ...gerValueFacetUsingSemanticsProviderFactory.java |   2 +-
 ...lobValueFacetUsingSemanticsProviderFactory.java |   2 +-
 ...iveValueFacetUsingSemanticsProviderFactory.java |   2 +-
 ...perValueFacetUsingSemanticsProviderFactory.java |   2 +-
 ...iveValueFacetUsingSemanticsProviderFactory.java |   2 +-
 ...perValueFacetUsingSemanticsProviderFactory.java |   2 +-
 ...iveValueFacetUsingSemanticsProviderFactory.java |   2 +-
 ...perValueFacetUsingSemanticsProviderFactory.java |   2 +-
 ...lobValueFacetUsingSemanticsProviderFactory.java |   2 +-
 ...ateValueFacetUsingSemanticsProviderFactory.java |   2 +-
 ...ateValueFacetUsingSemanticsProviderFactory.java |   2 +-
 ...imeValueFacetUsingSemanticsProviderFactory.java |   2 +-
 ...imeValueFacetUsingSemanticsProviderFactory.java |   2 +-
 ...ateValueFacetUsingSemanticsProviderFactory.java |   2 +-
 ...iveValueFacetUsingSemanticsProviderFactory.java |   2 +-
 ...perValueFacetUsingSemanticsProviderFactory.java |   2 +-
 ...iveValueFacetUsingSemanticsProviderFactory.java |   2 +-
 ...perValueFacetUsingSemanticsProviderFactory.java |   2 +-
 ...ageValueFacetUsingSemanticsProviderFactory.java |   2 +-
 ...iveValueFacetUsingSemanticsProviderFactory.java |   2 +-
 ...perValueFacetUsingSemanticsProviderFactory.java |   2 +-
 ...athValueFacetUsingSemanticsProviderFactory.java |   2 +-
 ...iveValueFacetUsingSemanticsProviderFactory.java |   2 +-
 ...perValueFacetUsingSemanticsProviderFactory.java |   2 +-
 ...kupValueFacetUsingSemanticsProviderFactory.java |   2 +-
 ...ordValueFacetUsingSemanticsProviderFactory.java |   2 +-
 ...iveValueFacetUsingSemanticsProviderFactory.java |   2 +-
 ...perValueFacetUsingSemanticsProviderFactory.java |   2 +-
 ...ingValueFacetUsingSemanticsProviderFactory.java |   2 +-
 ...ralValueFacetUsingSemanticsProviderFactory.java |   2 +-
 ...imeValueFacetUsingSemanticsProviderFactory.java |   2 +-
 ...ampValueFacetUsingSemanticsProviderFactory.java |   2 +-
 ...odeValueFacetUsingSemanticsProviderFactory.java |   2 +-
 ...URLValueFacetUsingSemanticsProviderFactory.java |   2 +-
 .../value/url/URLValueSemanticsProvider.java       |   2 +-
 ...UIDValueFacetUsingSemanticsProviderFactory.java |   2 +-
 .../facets/value/uuid/UUIDValueSemantics.java      |  76 ++++++++++++++
 .../value/uuid/UUIDValueSemanticsProvider.java     |  91 ----------------
 ...ValidationDigitsAnnotationFacetFactoryTest.java |  52 ++++++----
 .../BigDecimalValueSemanticsProviderTest.java      |  12 +--
 .../ValueSemanticsProviderAbstractTestCase.java    |  41 ++++++--
 .../ui/components/number/NumberFieldFactory.java   |  17 +--
 ...nferredFromJdoColumnAnnotationFacetFactory.java |  77 +++++---------
 ...ractionalDigitsFacetInferredFromJdoColumn.java} |  26 ++++-
 ...DerivedFromJdoColumnAnnotationFacetFactory.java |  20 +---
 .../column/MaxLengthFacetDerivedFromJdoColumn.java |  23 ++++-
 ... MaxTotalDigitsFacetInferredFromJdoColumn.java} |  32 ++++--
 ...vedFromJdoColumnAnnotationFacetFactoryTest.java |  56 +++++-----
 .../common/model/binding/BindingConverter.java     |   8 +-
 .../binding/NumberConverterForStringComponent.java |  48 +++------
 .../viewer/common/model/feature/ScalarUiModel.java |  13 ++-
 .../rendering/domainobjects/JsonValueEncoder.java  |   4 -
 .../domainobjects/ObjectAndActionInvocation.java   |  19 ++--
 .../domainobjects/ObjectPropertyReprRenderer.java  |  57 +++++-----
 .../domainobjects/ScalarValueReprRenderer.java     |   3 +-
 .../CollectionContentsAsSummaryFactory.java        |  11 +-
 .../components/scalars/IsisConverterLocator.java   |  11 +-
 .../jdkmath/BigDecimalConverterWithScale.java      |  13 ++-
 .../viewer/wicket/ui/pages/entity/EntityPage.java  |  23 +++--
 82 files changed, 826 insertions(+), 685 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 f576fc8..6cdd9fb 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,6 +18,16 @@
  */
 package org.apache.isis.applib.adapters;
 
+import java.text.DecimalFormat;
+import java.text.NumberFormat;
+import java.util.Locale;
+import java.util.Optional;
+
+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}
  */
@@ -42,5 +52,24 @@ implements ValueSemanticsProvider<T> {
         return (DefaultsProvider<T>) (this instanceof DefaultsProvider ? 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) {
+        return Optional.ofNullable(context)
+        .map(Context::getInteractionContext)
+        .map(InteractionContext::getLocale)
+        .orElseGet(Locale::getDefault);
+    }
+
+    /**
+     * @param context - nullable in support of JUnit testing
+     * @return {@link NumberFormat} the default from from given context's locale
+     * or else system's default locale
+     */
+    protected DecimalFormat getNumberFormat(final @Nullable Context context) {
+        return (DecimalFormat)NumberFormat.getNumberInstance(getLocale(context));
+    }
 
 }
diff --git a/commons/src/main/java/org/apache/isis/commons/internal/base/_Strings.java b/commons/src/main/java/org/apache/isis/commons/internal/base/_Strings.java
index 547d4a8..40e9bd4 100644
--- a/commons/src/main/java/org/apache/isis/commons/internal/base/_Strings.java
+++ b/commons/src/main/java/org/apache/isis/commons/internal/base/_Strings.java
@@ -218,6 +218,19 @@ public final class _Strings {
 
     /**
      * @param input
+     * @return null if the {@code input} is null or blank, the trimmed {@code input} otherwise
+     */
+    public static @Nullable String blankToNullOrTrim(final @Nullable String input) {
+        if(isEmpty(input)) {
+            return null;
+        }
+        return input.isBlank()
+                ? null
+                : input.trim();
+    }
+
+    /**
+     * @param input
      * @return the empty string if the {@code input} is null, the {@code input} otherwise
      */
     public static String nullToEmpty(final @Nullable String input) {
@@ -757,4 +770,6 @@ public final class _Strings {
                 StringBuilder::toString);
     }
 
+
+
 }
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/choices/enums/EnumFacetUsingValueFacetUsingSemanticsProviderFactory.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/choices/enums/EnumFacetUsingValueFacetUsingSemanticsProviderFactory.java
index d8c5287..f9772d9 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/choices/enums/EnumFacetUsingValueFacetUsingSemanticsProviderFactory.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/choices/enums/EnumFacetUsingValueFacetUsingSemanticsProviderFactory.java
@@ -43,7 +43,7 @@ extends ValueFacetUsingSemanticsProviderFactory<Enum<?>> {
             return;
         }
 
-        addFacets(_Casts.uncheckedCast(
+        addValueFacet(_Casts.uncheckedCast(
                 new EnumValueSemanticsProvider<>(
                         processClassContext.getIntrospectionPolicy(),
                         facetHolder,
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 6331427..624b5d6 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
@@ -18,7 +18,9 @@
  */
 package org.apache.isis.core.metamodel.facets.object.value.vsp;
 
+import org.apache.isis.applib.adapters.ValueSemanticsProvider;
 import org.apache.isis.core.metamodel.context.MetaModelContext;
+import org.apache.isis.core.metamodel.facetapi.FacetHolder;
 import org.apache.isis.core.metamodel.facetapi.FacetUtil;
 import org.apache.isis.core.metamodel.facetapi.FeatureType;
 import org.apache.isis.core.metamodel.facets.FacetFactoryAbstract;
@@ -30,9 +32,16 @@ extends FacetFactoryAbstract {
         super(mmc, FeatureType.OBJECTS_ONLY);
     }
 
-    protected void addFacets(final ValueSemanticsProviderAndFacetAbstract<T> adapter) {
+    protected final void addValueFacet(final ValueSemanticsProviderAndFacetAbstract<T> adapter) {
         FacetUtil.addFacet(
                 new ValueFacetUsingSemanticsProvider(adapter, adapter.getFacetHolder()));
     }
 
+    protected final void addAllFacetsForValueSemantics(
+            final ValueSemanticsProvider<?> valueSemantics,
+            final FacetHolder holder) {
+        FacetUtil.addFacet(
+                new ValueFacetUsingSemanticsProvider(valueSemantics, holder));
+    }
+
 }
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/value/vsp/ValueSemanticsFacetAbstract.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/value/vsp/ValueSemanticsFacetAbstract.java
new file mode 100644
index 0000000..c61b21e
--- /dev/null
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/object/value/vsp/ValueSemanticsFacetAbstract.java
@@ -0,0 +1,71 @@
+/*
+ *  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.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.ValueSemanticsProvider;
+import org.apache.isis.core.metamodel.facetapi.Facet;
+import org.apache.isis.core.metamodel.facetapi.FacetAbstract;
+import org.apache.isis.core.metamodel.facetapi.FacetHolder;
+
+import lombok.Getter;
+import lombok.NonNull;
+
+public abstract class ValueSemanticsFacetAbstract<T>
+extends FacetAbstract
+implements ValueSemanticsProvider<T> {
+
+    @Getter
+    final @NonNull ValueSemanticsProvider<T> valueSemantics;
+
+    protected ValueSemanticsFacetAbstract(
+            final Class<? extends Facet> facetType,
+            final ValueSemanticsProvider<T> valueSemantics,
+            final FacetHolder facetHolder) {
+        super(facetType, facetHolder);
+        this.valueSemantics = valueSemantics;
+    }
+
+    protected ValueSemanticsFacetAbstract(
+            final Class<? extends Facet> facetType,
+            final ValueSemanticsProvider<T> valueSemantics,
+            final FacetHolder facetHolder,
+            final Precedence precedence) {
+        super(facetType, facetHolder, precedence);
+        this.valueSemantics = valueSemantics;
+    }
+
+    @Override
+    public final Parser<T> getParser() {
+        return valueSemantics.getParser();
+    }
+
+    @Override
+    public final EncoderDecoder<T> getEncoderDecoder() {
+        return valueSemantics.getEncoderDecoder();
+    }
+
+    @Override
+    public final DefaultsProvider<T> getDefaultsProvider() {
+        return valueSemantics.getDefaultsProvider();
+    }
+
+}
diff --git a/persistence/jdo/metamodel/src/main/java/org/apache/isis/persistence/jdo/metamodel/facets/prop/column/BigDecimalFacetInferredFromJdoColumn.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/objectvalue/maxlen/MaxFractionalDigitsFacet.java
similarity index 56%
rename from persistence/jdo/metamodel/src/main/java/org/apache/isis/persistence/jdo/metamodel/facets/prop/column/BigDecimalFacetInferredFromJdoColumn.java
rename to core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/objectvalue/maxlen/MaxFractionalDigitsFacet.java
index 03b703f..c0ead20 100644
--- a/persistence/jdo/metamodel/src/main/java/org/apache/isis/persistence/jdo/metamodel/facets/prop/column/BigDecimalFacetInferredFromJdoColumn.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/objectvalue/maxlen/MaxFractionalDigitsFacet.java
@@ -16,17 +16,30 @@
  *  specific language governing permissions and limitations
  *  under the License.
  */
-package org.apache.isis.persistence.jdo.metamodel.facets.prop.column;
+package org.apache.isis.core.metamodel.facets.objectvalue.maxlen;
 
-import org.apache.isis.core.metamodel.facetapi.FacetHolder;
-import org.apache.isis.core.metamodel.facets.value.bigdecimal.BigDecimalValueFacetAbstract;
+import javax.validation.constraints.Digits;
 
-public class BigDecimalFacetInferredFromJdoColumn
-extends BigDecimalValueFacetAbstract {
+import org.apache.isis.core.metamodel.facetapi.Facet;
 
-    public BigDecimalFacetInferredFromJdoColumn(
-            final FacetHolder holder, final int precision, final int scale) {
-        super(precision, scale, holder, Precedence.INFERRED);
-    }
+/**
+ * The number of digits to the right of the decimal place (fractional part)
+ * for this decimal.
+ *
+ * <p>
+ * For example:
+ * <ul>
+ * <li><tt>12345.789</tt> has 3 fractional digits</li>
+ * <li><tt>12345</tt> has 0 fractional digits</li>
+ * <li><tt>12345.0</tt> has 1 fractional digit</li>
+ * </ul>
+ */
+public interface MaxFractionalDigitsFacet
+extends Facet {
+
+    /**
+     * eg. as provided by {@link Digits#fraction()}
+     */
+    int maxFractionalDigits();
 
 }
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/bigdecimal/BigDecimalValueFacetAbstract.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/objectvalue/maxlen/MaxFractionalDigitsFacetAbstract.java
similarity index 53%
copy from core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/bigdecimal/BigDecimalValueFacetAbstract.java
copy to core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/objectvalue/maxlen/MaxFractionalDigitsFacetAbstract.java
index 51743c4..6e0aa27 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/bigdecimal/BigDecimalValueFacetAbstract.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/objectvalue/maxlen/MaxFractionalDigitsFacetAbstract.java
@@ -16,7 +16,7 @@
  *  specific language governing permissions and limitations
  *  under the License.
  */
-package org.apache.isis.core.metamodel.facets.value.bigdecimal;
+package org.apache.isis.core.metamodel.facets.objectvalue.maxlen;
 
 import java.util.function.BiConsumer;
 
@@ -25,42 +25,50 @@ import org.apache.isis.core.metamodel.facetapi.FacetAbstract;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
 
 import lombok.Getter;
+import lombok.NonNull;
+import lombok.experimental.Accessors;
 
-public abstract class BigDecimalValueFacetAbstract
+public abstract class MaxFractionalDigitsFacetAbstract
 extends FacetAbstract
-implements BigDecimalValueFacet {
+implements MaxFractionalDigitsFacet {
 
     private static final Class<? extends Facet> type() {
-        return BigDecimalValueFacet.class;
+        return MaxFractionalDigitsFacet.class;
     }
 
-    @Getter(onMethod_ = {@Override}) private final int precision;
-    @Getter(onMethod_ = {@Override}) private final int scale;
+    @Getter(onMethod_ = {@Override}) @Accessors(fluent = true)
+    private final int maxFractionalDigits;
 
-    public BigDecimalValueFacetAbstract(
-            final int precision,
-            final int scale,
+    protected MaxFractionalDigitsFacetAbstract(
+            final int maxFractionalDigits,
             final FacetHolder holder) {
         super(type(), holder);
-        this.precision = precision;
-        this.scale = scale;
+        this.maxFractionalDigits= maxFractionalDigits;
     }
 
-    public BigDecimalValueFacetAbstract(
-            final int precision,
-            final int scale,
+    protected MaxFractionalDigitsFacetAbstract(
+            final int maxFractionalDigits,
             final FacetHolder holder,
             final Facet.Precedence precedence) {
         super(type(), holder, precedence);
-        this.precision = precision;
-        this.scale = scale;
+        this.maxFractionalDigits= maxFractionalDigits;
     }
 
     @Override
-    public final void visitAttributes(final BiConsumer<String, Object> visitor) {
+    public boolean semanticEquals(@NonNull final Facet other) {
+        return other instanceof MaxFractionalDigitsFacet
+                ? Integer.compare(
+                        this.maxFractionalDigits(),
+                        ((MaxFractionalDigitsFacet)other).maxFractionalDigits()) == 0
+                : false;
+    }
+
+    @Override
+    public void visitAttributes(final BiConsumer<String, Object> visitor) {
         super.visitAttributes(visitor);
-        visitor.accept("precision", precision);
-        visitor.accept("scale", scale);
+        visitor.accept("maxFractionalDigits", maxFractionalDigits <0
+                ? "unlimited"
+                : String.valueOf(maxFractionalDigits));
     }
 
 }
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/objectvalue/maxlen/MaxLengthFacetAbstract.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/objectvalue/maxlen/MaxLengthFacetAbstract.java
index 7c920fb..6dc9b33 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/objectvalue/maxlen/MaxLengthFacetAbstract.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/objectvalue/maxlen/MaxLengthFacetAbstract.java
@@ -38,13 +38,13 @@ implements MaxLengthFacet {
         return MaxLengthFacet.class;
     }
 
-    public MaxLengthFacetAbstract(
+    protected MaxLengthFacetAbstract(
             final int maxLength,
             final FacetHolder holder) {
         super(type(), holder, maxLength);
     }
 
-    public MaxLengthFacetAbstract(
+    protected MaxLengthFacetAbstract(
             final int maxLength,
             final FacetHolder holder,
             final Facet.Precedence precedence) {
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/uuid/UUIDValueFacet.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/objectvalue/maxlen/MaxTotalDigitsFacet.java
similarity index 64%
rename from core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/uuid/UUIDValueFacet.java
rename to core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/objectvalue/maxlen/MaxTotalDigitsFacet.java
index f2f558c..d3920ac 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/uuid/UUIDValueFacet.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/objectvalue/maxlen/MaxTotalDigitsFacet.java
@@ -16,17 +16,29 @@
  *  specific language governing permissions and limitations
  *  under the License.
  */
-package org.apache.isis.core.metamodel.facets.value.uuid;
+package org.apache.isis.core.metamodel.facets.objectvalue.maxlen;
 
-import java.util.UUID;
+import javax.validation.constraints.Digits;
 
 import org.apache.isis.core.metamodel.facetapi.Facet;
-import org.apache.isis.core.metamodel.spec.ManagedObject;
 
-public interface UUIDValueFacet extends Facet {
-
-    UUID uuidValue(ManagedObject object);
+/**
+ * Maximum length of digits for this decimal.
+ *
+ * <p>
+ * For example:
+ * <ul>
+ * <li><tt>12345.789</tt> has a total of 8</li>
+ * <li><tt>12345</tt> has a total of 5</li>
+ * <li><tt>12345.0</tt> has a total of 6</li>
+ * </ul>
+ */
+public interface MaxTotalDigitsFacet
+extends Facet {
 
-    ManagedObject createValue(UUID value);
+    /**
+     * eg. as provided by {@link Digits#fraction()}
+     */
+    int maxTotalDigits();
 
 }
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/bigdecimal/BigDecimalValueFacetAbstract.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/objectvalue/maxlen/MaxTotalDigitsFacetAbstract.java
similarity index 55%
rename from core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/bigdecimal/BigDecimalValueFacetAbstract.java
rename to core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/objectvalue/maxlen/MaxTotalDigitsFacetAbstract.java
index 51743c4..184d57d 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/bigdecimal/BigDecimalValueFacetAbstract.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/objectvalue/maxlen/MaxTotalDigitsFacetAbstract.java
@@ -16,7 +16,7 @@
  *  specific language governing permissions and limitations
  *  under the License.
  */
-package org.apache.isis.core.metamodel.facets.value.bigdecimal;
+package org.apache.isis.core.metamodel.facets.objectvalue.maxlen;
 
 import java.util.function.BiConsumer;
 
@@ -25,42 +25,50 @@ import org.apache.isis.core.metamodel.facetapi.FacetAbstract;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
 
 import lombok.Getter;
+import lombok.NonNull;
+import lombok.experimental.Accessors;
 
-public abstract class BigDecimalValueFacetAbstract
+public abstract class MaxTotalDigitsFacetAbstract
 extends FacetAbstract
-implements BigDecimalValueFacet {
+implements MaxTotalDigitsFacet {
 
     private static final Class<? extends Facet> type() {
-        return BigDecimalValueFacet.class;
+        return MaxTotalDigitsFacet.class;
     }
 
-    @Getter(onMethod_ = {@Override}) private final int precision;
-    @Getter(onMethod_ = {@Override}) private final int scale;
+    @Getter(onMethod_ = {@Override}) @Accessors(fluent = true)
+    private final int maxTotalDigits;
 
-    public BigDecimalValueFacetAbstract(
-            final int precision,
-            final int scale,
+    protected MaxTotalDigitsFacetAbstract(
+            final int maxTotalDigits,
             final FacetHolder holder) {
         super(type(), holder);
-        this.precision = precision;
-        this.scale = scale;
+        this.maxTotalDigits = maxTotalDigits;
     }
 
-    public BigDecimalValueFacetAbstract(
-            final int precision,
-            final int scale,
+    protected MaxTotalDigitsFacetAbstract(
+            final int maxTotalDigits,
             final FacetHolder holder,
             final Facet.Precedence precedence) {
         super(type(), holder, precedence);
-        this.precision = precision;
-        this.scale = scale;
+        this.maxTotalDigits = maxTotalDigits;
     }
 
     @Override
-    public final void visitAttributes(final BiConsumer<String, Object> visitor) {
+    public boolean semanticEquals(@NonNull final Facet other) {
+        return other instanceof MaxTotalDigitsFacet
+                ? Integer.compare(
+                        this.maxTotalDigits(),
+                        ((MaxTotalDigitsFacet)other).maxTotalDigits()) == 0
+                : false;
+    }
+
+    @Override
+    public void visitAttributes(final BiConsumer<String, Object> visitor) {
         super.visitAttributes(visitor);
-        visitor.accept("precision", precision);
-        visitor.accept("scale", scale);
+        visitor.accept("maxTotalDigits", maxTotalDigits <0
+                ? "unlimited"
+                : String.valueOf(maxTotalDigits));
     }
 
 }
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/param/bigdecimal/javaxvaldigits/BigDecimalFacetOnParameterFromJavaxValidationAnnotationFactory.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/param/bigdecimal/javaxvaldigits/BigDecimalFacetOnParameterFromJavaxValidationAnnotationFactory.java
index f3e6110..4a8970a 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/param/bigdecimal/javaxvaldigits/BigDecimalFacetOnParameterFromJavaxValidationAnnotationFactory.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/param/bigdecimal/javaxvaldigits/BigDecimalFacetOnParameterFromJavaxValidationAnnotationFactory.java
@@ -47,9 +47,12 @@ extends FacetFactoryAbstract {
         val digitsIfAny = processParameterContext.synthesizeOnParameter(Digits.class);
 
         addFacetIfPresent(
-                BigDecimalFacetOnParameterFromJavaxValidationDigitsAnnotation
+                MaxTotalDigitsFacetOnParameterFromJavaxValidationDigitsAnnotation
                 .create(digitsIfAny, processParameterContext.getFacetHolder()));
 
+        addFacetIfPresent(
+                MaxFractionalDigitsFacetOnParameterFromJavaxValidationDigitsAnnotation
+                .create(digitsIfAny, processParameterContext.getFacetHolder()));
     }
 
 }
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/param/bigdecimal/javaxvaldigits/BigDecimalFacetOnParameterFromJavaxValidationDigitsAnnotation.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/param/bigdecimal/javaxvaldigits/MaxFractionalDigitsFacetOnParameterFromJavaxValidationDigitsAnnotation.java
similarity index 61%
copy from core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/param/bigdecimal/javaxvaldigits/BigDecimalFacetOnParameterFromJavaxValidationDigitsAnnotation.java
copy to core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/param/bigdecimal/javaxvaldigits/MaxFractionalDigitsFacetOnParameterFromJavaxValidationDigitsAnnotation.java
index 65499d3..ea6aedf 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/param/bigdecimal/javaxvaldigits/BigDecimalFacetOnParameterFromJavaxValidationDigitsAnnotation.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/param/bigdecimal/javaxvaldigits/MaxFractionalDigitsFacetOnParameterFromJavaxValidationDigitsAnnotation.java
@@ -23,29 +23,26 @@ import java.util.Optional;
 import javax.validation.constraints.Digits;
 
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
-import org.apache.isis.core.metamodel.facets.value.bigdecimal.BigDecimalValueFacet;
-import org.apache.isis.core.metamodel.facets.value.bigdecimal.BigDecimalValueFacetAbstract;
+import org.apache.isis.core.metamodel.facets.objectvalue.maxlen.MaxFractionalDigitsFacet;
+import org.apache.isis.core.metamodel.facets.objectvalue.maxlen.MaxFractionalDigitsFacetAbstract;
 
-public class BigDecimalFacetOnParameterFromJavaxValidationDigitsAnnotation
-extends BigDecimalValueFacetAbstract {
+public class MaxFractionalDigitsFacetOnParameterFromJavaxValidationDigitsAnnotation
+extends MaxFractionalDigitsFacetAbstract {
 
-     public static Optional<BigDecimalValueFacet> create(
+     public static Optional<MaxFractionalDigitsFacet> create(
              final Optional<Digits> digitsIfAny,
              final FacetHolder holder) {
 
          return digitsIfAny
          .map(digits->{
-             final int length = digits.integer() + digits.fraction();
-             final int scale = digits.fraction();
-             return new BigDecimalFacetOnParameterFromJavaxValidationDigitsAnnotation(holder, length, scale);
+             return new MaxFractionalDigitsFacetOnParameterFromJavaxValidationDigitsAnnotation(
+                     digits.fraction(), holder);
          });
     }
 
-    private BigDecimalFacetOnParameterFromJavaxValidationDigitsAnnotation(
-            final FacetHolder holder, final int precision, final int scale) {
-        super(precision, scale, holder);
+    private MaxFractionalDigitsFacetOnParameterFromJavaxValidationDigitsAnnotation(
+            final int maxFractionalDigits, final FacetHolder holder) {
+        super(maxFractionalDigits, holder);
     }
 
-
-
 }
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/param/bigdecimal/javaxvaldigits/BigDecimalFacetOnParameterFromJavaxValidationDigitsAnnotation.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/param/bigdecimal/javaxvaldigits/MaxTotalDigitsFacetOnParameterFromJavaxValidationDigitsAnnotation.java
similarity index 52%
copy from core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/param/bigdecimal/javaxvaldigits/BigDecimalFacetOnParameterFromJavaxValidationDigitsAnnotation.java
copy to core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/param/bigdecimal/javaxvaldigits/MaxTotalDigitsFacetOnParameterFromJavaxValidationDigitsAnnotation.java
index 65499d3..1025f9c 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/param/bigdecimal/javaxvaldigits/BigDecimalFacetOnParameterFromJavaxValidationDigitsAnnotation.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/param/bigdecimal/javaxvaldigits/MaxTotalDigitsFacetOnParameterFromJavaxValidationDigitsAnnotation.java
@@ -23,29 +23,27 @@ import java.util.Optional;
 import javax.validation.constraints.Digits;
 
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
-import org.apache.isis.core.metamodel.facets.value.bigdecimal.BigDecimalValueFacet;
-import org.apache.isis.core.metamodel.facets.value.bigdecimal.BigDecimalValueFacetAbstract;
-
-public class BigDecimalFacetOnParameterFromJavaxValidationDigitsAnnotation
-extends BigDecimalValueFacetAbstract {
-
-     public static Optional<BigDecimalValueFacet> create(
-             final Optional<Digits> digitsIfAny,
-             final FacetHolder holder) {
-
-         return digitsIfAny
-         .map(digits->{
-             final int length = digits.integer() + digits.fraction();
-             final int scale = digits.fraction();
-             return new BigDecimalFacetOnParameterFromJavaxValidationDigitsAnnotation(holder, length, scale);
-         });
-    }
-
-    private BigDecimalFacetOnParameterFromJavaxValidationDigitsAnnotation(
-            final FacetHolder holder, final int precision, final int scale) {
-        super(precision, scale, holder);
-    }
-
+import org.apache.isis.core.metamodel.facets.objectvalue.maxlen.MaxTotalDigitsFacet;
+import org.apache.isis.core.metamodel.facets.objectvalue.maxlen.MaxTotalDigitsFacetAbstract;
+
+public class MaxTotalDigitsFacetOnParameterFromJavaxValidationDigitsAnnotation
+extends MaxTotalDigitsFacetAbstract {
+
+    public static Optional<MaxTotalDigitsFacet> create(
+            final Optional<Digits> digitsIfAny,
+            final FacetHolder holder) {
+
+        return digitsIfAny
+        .map(digits->{
+            return new MaxTotalDigitsFacetOnParameterFromJavaxValidationDigitsAnnotation(
+                    digits.integer() + digits.fraction(), holder);
+        });
+   }
+
+   private MaxTotalDigitsFacetOnParameterFromJavaxValidationDigitsAnnotation(
+           final int maxTotalDigits, final FacetHolder holder) {
+       super(maxTotalDigits, holder);
+   }
 
 
 }
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/bigdecimal/javaxvaldigits/BigDecimalFacetOnPropertyFromJavaxValidationDigitsAnnotationFactory.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/bigdecimal/javaxvaldigits/BigDecimalFacetOnPropertyFromJavaxValidationDigitsAnnotationFactory.java
index 28a5d2f..4edb66e 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/bigdecimal/javaxvaldigits/BigDecimalFacetOnPropertyFromJavaxValidationDigitsAnnotationFactory.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/bigdecimal/javaxvaldigits/BigDecimalFacetOnPropertyFromJavaxValidationDigitsAnnotationFactory.java
@@ -47,8 +47,12 @@ extends FacetFactoryAbstract {
         val digitsIfAny = processMethodContext.synthesizeOnMethod(Digits.class);
 
         addFacetIfPresent(
-                BigDecimalFacetOnPropertyFromJavaxValidationDigitsAnnotation
-                .create(processMethodContext.getFacetHolder(), digitsIfAny));
+                MaxTotalDigitsFacetOnPropertyFromJavaxValidationDigitsAnnotation
+                .create(digitsIfAny, processMethodContext.getFacetHolder()));
+
+        addFacetIfPresent(
+                MaxFractionalDigitsFacetOnPropertyFromJavaxValidationDigitsAnnotation
+                .create(digitsIfAny, processMethodContext.getFacetHolder()));
     }
 
 }
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/param/bigdecimal/javaxvaldigits/BigDecimalFacetOnParameterFromJavaxValidationDigitsAnnotation.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/bigdecimal/javaxvaldigits/MaxFractionalDigitsFacetOnPropertyFromJavaxValidationDigitsAnnotation.java
similarity index 57%
rename from core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/param/bigdecimal/javaxvaldigits/BigDecimalFacetOnParameterFromJavaxValidationDigitsAnnotation.java
rename to core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/bigdecimal/javaxvaldigits/MaxFractionalDigitsFacetOnPropertyFromJavaxValidationDigitsAnnotation.java
index 65499d3..a2d4124 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/param/bigdecimal/javaxvaldigits/BigDecimalFacetOnParameterFromJavaxValidationDigitsAnnotation.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/bigdecimal/javaxvaldigits/MaxFractionalDigitsFacetOnPropertyFromJavaxValidationDigitsAnnotation.java
@@ -16,36 +16,33 @@
  *  specific language governing permissions and limitations
  *  under the License.
  */
-package org.apache.isis.core.metamodel.facets.param.bigdecimal.javaxvaldigits;
+package org.apache.isis.core.metamodel.facets.properties.bigdecimal.javaxvaldigits;
 
 import java.util.Optional;
 
 import javax.validation.constraints.Digits;
 
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
-import org.apache.isis.core.metamodel.facets.value.bigdecimal.BigDecimalValueFacet;
-import org.apache.isis.core.metamodel.facets.value.bigdecimal.BigDecimalValueFacetAbstract;
+import org.apache.isis.core.metamodel.facets.objectvalue.maxlen.MaxFractionalDigitsFacet;
+import org.apache.isis.core.metamodel.facets.objectvalue.maxlen.MaxFractionalDigitsFacetAbstract;
 
-public class BigDecimalFacetOnParameterFromJavaxValidationDigitsAnnotation
-extends BigDecimalValueFacetAbstract {
+public class MaxFractionalDigitsFacetOnPropertyFromJavaxValidationDigitsAnnotation
+extends MaxFractionalDigitsFacetAbstract {
 
-     public static Optional<BigDecimalValueFacet> create(
+     public static Optional<MaxFractionalDigitsFacet> create(
              final Optional<Digits> digitsIfAny,
              final FacetHolder holder) {
 
          return digitsIfAny
          .map(digits->{
-             final int length = digits.integer() + digits.fraction();
-             final int scale = digits.fraction();
-             return new BigDecimalFacetOnParameterFromJavaxValidationDigitsAnnotation(holder, length, scale);
+             return new MaxFractionalDigitsFacetOnPropertyFromJavaxValidationDigitsAnnotation(
+                     digits.fraction(), holder);
          });
     }
 
-    private BigDecimalFacetOnParameterFromJavaxValidationDigitsAnnotation(
-            final FacetHolder holder, final int precision, final int scale) {
-        super(precision, scale, holder);
+    private MaxFractionalDigitsFacetOnPropertyFromJavaxValidationDigitsAnnotation(
+            final int maxFractionalDigits, final FacetHolder holder) {
+        super(maxFractionalDigits, holder);
     }
 
-
-
 }
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/bigdecimal/javaxvaldigits/BigDecimalFacetOnPropertyFromJavaxValidationDigitsAnnotation.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/bigdecimal/javaxvaldigits/MaxTotalDigitsFacetOnPropertyFromJavaxValidationDigitsAnnotation.java
similarity index 55%
rename from core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/bigdecimal/javaxvaldigits/BigDecimalFacetOnPropertyFromJavaxValidationDigitsAnnotation.java
rename to core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/bigdecimal/javaxvaldigits/MaxTotalDigitsFacetOnPropertyFromJavaxValidationDigitsAnnotation.java
index 2cb8f57..a628418 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/bigdecimal/javaxvaldigits/BigDecimalFacetOnPropertyFromJavaxValidationDigitsAnnotation.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/properties/bigdecimal/javaxvaldigits/MaxTotalDigitsFacetOnPropertyFromJavaxValidationDigitsAnnotation.java
@@ -23,30 +23,27 @@ import java.util.Optional;
 import javax.validation.constraints.Digits;
 
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
-import org.apache.isis.core.metamodel.facets.value.bigdecimal.BigDecimalValueFacet;
-import org.apache.isis.core.metamodel.facets.value.bigdecimal.BigDecimalValueFacetAbstract;
+import org.apache.isis.core.metamodel.facets.objectvalue.maxlen.MaxTotalDigitsFacet;
+import org.apache.isis.core.metamodel.facets.objectvalue.maxlen.MaxTotalDigitsFacetAbstract;
 
+public class MaxTotalDigitsFacetOnPropertyFromJavaxValidationDigitsAnnotation
+extends MaxTotalDigitsFacetAbstract {
 
-public class BigDecimalFacetOnPropertyFromJavaxValidationDigitsAnnotation
-extends BigDecimalValueFacetAbstract {
-
-    public static Optional<BigDecimalValueFacet> create(
-            final FacetHolder facetHolder,
-            final Optional<Digits> digitsIfAny) {
+    public static Optional<MaxTotalDigitsFacet> create(
+            final Optional<Digits> digitsIfAny,
+            final FacetHolder holder) {
 
         return digitsIfAny
         .map(digits->{
-            final int length = digits.integer() + digits.fraction();
-            final int scale = digits.fraction();
-            return new BigDecimalFacetOnPropertyFromJavaxValidationDigitsAnnotation(facetHolder, length, scale);
+            return new MaxTotalDigitsFacetOnPropertyFromJavaxValidationDigitsAnnotation(
+                    digits.integer() + digits.fraction(), holder);
         });
-    }
-
-    private BigDecimalFacetOnPropertyFromJavaxValidationDigitsAnnotation(
-            final FacetHolder holder,
-            final int precision,
-            final int scale) {
-        super(precision, scale, holder);
-    }
+   }
+
+   private MaxTotalDigitsFacetOnPropertyFromJavaxValidationDigitsAnnotation(
+           final int maxTotalDigits, final FacetHolder holder) {
+       super(maxTotalDigits, holder);
+   }
+
 
 }
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/schema/chg/v2/ChangesDtoValueFacetUsingSemanticsProviderFactory.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/schema/chg/v2/ChangesDtoValueFacetUsingSemanticsProviderFactory.java
index 5c08a99..42f9b2a 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/schema/chg/v2/ChangesDtoValueFacetUsingSemanticsProviderFactory.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/schema/chg/v2/ChangesDtoValueFacetUsingSemanticsProviderFactory.java
@@ -44,6 +44,6 @@ extends ValueFacetUsingSemanticsProviderFactory<ChangesDto> {
             return;
         }
         val provider = new ChangesDtoValueSemanticsProvider(holder);
-        addFacets(provider);
+        addValueFacet(provider);
     }
 }
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/schema/cmd/v2/CommandDtoValueFacetUsingSemanticsProviderFactory.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/schema/cmd/v2/CommandDtoValueFacetUsingSemanticsProviderFactory.java
index 21b98d7..f108e69 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/schema/cmd/v2/CommandDtoValueFacetUsingSemanticsProviderFactory.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/schema/cmd/v2/CommandDtoValueFacetUsingSemanticsProviderFactory.java
@@ -44,6 +44,6 @@ extends ValueFacetUsingSemanticsProviderFactory<CommandDto> {
             return;
         }
         val provider = new CommandDtoValueSemanticsProvider(holder);
-        addFacets(provider);
+        addValueFacet(provider);
     }
 }
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/schema/ixn/v2/InteractionDtoValueFacetUsingSemanticsProviderFactory.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/schema/ixn/v2/InteractionDtoValueFacetUsingSemanticsProviderFactory.java
index 6bfbe26..b752191 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/schema/ixn/v2/InteractionDtoValueFacetUsingSemanticsProviderFactory.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/schema/ixn/v2/InteractionDtoValueFacetUsingSemanticsProviderFactory.java
@@ -44,6 +44,6 @@ extends ValueFacetUsingSemanticsProviderFactory<InteractionDto> {
             return;
         }
         val provider = new InteractionDtoValueSemanticsProvider(holder);
-        addFacets(provider);
+        addValueFacet(provider);
     }
 }
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/bigdecimal/BigDecimalValueFacet.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/bigdecimal/BigDecimalValueFacet.java
deleted file mode 100644
index 97b9fa9..0000000
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/bigdecimal/BigDecimalValueFacet.java
+++ /dev/null
@@ -1,51 +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.bigdecimal;
-
-import org.apache.isis.core.metamodel.facetapi.Facet;
-
-public interface BigDecimalValueFacet extends Facet {
-
-    /**
-     * Maximum length of digits for this decimal (in other words, its precision).
-     *
-     * <p>
-     * For example:
-     * <ul>
-     * <li><tt>12345.789</tt> has a length of 8 (and a {@link #getScale() scale} of 3)</li>
-     * <li><tt>12345</tt> has a length of 5 (and {@link #getScale() scale} of 0)</li>
-     * <li><tt>12345.0</tt> has a length of 6 (and {@link #getScale() scale} of 1)</li>
-     * </ul>
-     */
-    int getPrecision();
-
-    /**
-     * The number of digits to the right of the decimal place (fractional part) for this decimal.
-     *
-     * <p>
-     * For example:
-     * <ul>
-     * <li><tt>12345.789</tt> has scale of 3 (and a {@link #getPrecision() precision} of 8)</li>
-     * <li><tt>12345</tt> has a scale of 0 (and a {@link #getPrecision() precision} of 5)</li>
-     * <li><tt>12345.0</tt> has a scale of 1 (and a {@link #getPrecision() precision} of 6)</li>
-     * </ul>
-     */
-    int getScale();
-
-}
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/bigdecimal/BigDecimalValueFacetUsingSemanticsProviderFactory.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/bigdecimal/BigDecimalValueFacetUsingSemanticsProviderFactory.java
index 9be17a0..e9ce3c88 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/bigdecimal/BigDecimalValueFacetUsingSemanticsProviderFactory.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/bigdecimal/BigDecimalValueFacetUsingSemanticsProviderFactory.java
@@ -41,8 +41,7 @@ extends ValueFacetUsingSemanticsProviderFactory<BigDecimal> {
         if (type != BigDecimal.class) {
             return;
         }
-        addFacets(new BigDecimalValueSemanticsProvider(holder));
-        return;
+        addAllFacetsForValueSemantics(new BigDecimalValueSemantics(), holder);
     }
 
 }
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
new file mode 100644
index 0000000..158590d
--- /dev/null
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/bigdecimal/BigDecimalValueSemantics.java
@@ -0,0 +1,110 @@
+/*
+ *  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.bigdecimal;
+
+import java.math.BigDecimal;
+import java.text.ParseException;
+import java.text.ParsePosition;
+
+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.exceptions.UnrecoverableException;
+import org.apache.isis.applib.exceptions.recoverable.TextEntryParseException;
+import org.apache.isis.commons.internal.base._Strings;
+
+public class BigDecimalValueSemantics
+extends AbstractValueSemanticsProvider<BigDecimal>
+implements
+    DefaultsProvider<BigDecimal>,
+    EncoderDecoder<BigDecimal>,
+    Parser<BigDecimal> {
+
+    public static final int DEFAULT_LENGTH = 18;
+    public static final int DEFAULT_SCALE = 2;
+
+    @Override
+    public BigDecimal getDefaultValue() {
+        return BigDecimal.ZERO;
+    }
+
+    // -- ENCODER DECODER
+
+    @Override
+    public String toEncodedString(final BigDecimal value) {
+        try {
+            return value.toPlainString();
+        } catch (final Exception e) {
+            throw new UnrecoverableException(e);
+        }
+    }
+
+    @Override
+    public BigDecimal fromEncodedString(final String data) {
+        return new BigDecimal(data);
+    }
+
+    // -- PARSER
+
+    @Override
+    public String presentationValue(final Context context, final BigDecimal value) {
+        return value==null
+            ? ""
+            : getNumberFormat(context)
+                .format(value);
+    }
+
+    @Override
+    public String parseableTextRepresentation(final Context context, final BigDecimal value) {
+        return value==null
+                ? null
+                : getNumberFormat(context)
+                    .format(value);
+    }
+
+    @Override
+    public BigDecimal parseTextRepresentation(final Context context, final String text) {
+        final var input = _Strings.blankToNullOrTrim(text);
+        if(input==null) {
+            return null;
+        }
+        final var format = getNumberFormat(context);
+        format.setParseBigDecimal(true);
+        final var position = new ParsePosition(0);
+
+        try {
+            final var number = (BigDecimal)format.parse(input, position);
+            if (position.getErrorIndex() != -1) {
+                throw new ParseException("could not parse input='" + input + "'", position.getErrorIndex());
+            } else if (position.getIndex() < input.length()) {
+                throw new ParseException("input='" + input + "' wasnt processed completely", position.getIndex());
+            }
+            return number;
+        } catch (final NumberFormatException | ParseException e) {
+            throw new TextEntryParseException("Not a decimal " + input, e);
+        }
+    }
+
+    @Override
+    public int typicalLength() {
+        return 10;
+    }
+
+}
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/bigdecimal/BigDecimalValueSemanticsProvider.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/bigdecimal/BigDecimalValueSemanticsProvider.java
deleted file mode 100644
index e4c23a1..0000000
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/bigdecimal/BigDecimalValueSemanticsProvider.java
+++ /dev/null
@@ -1,115 +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.bigdecimal;
-
-import java.math.BigDecimal;
-import java.text.DecimalFormat;
-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.exceptions.UnrecoverableException;
-import org.apache.isis.applib.exceptions.recoverable.TextEntryParseException;
-import org.apache.isis.core.metamodel.commons.LocaleUtil;
-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;
-
-public class BigDecimalValueSemanticsProvider
-extends ValueSemanticsProviderAndFacetAbstract<BigDecimal>
-implements BigDecimalValueFacet {
-
-    private static Class<? extends Facet> type() {
-        return BigDecimalValueFacet.class;
-    }
-
-    private static final int TYPICAL_LENGTH = 10;
-    private static final BigDecimal DEFAULT_VALUE = new BigDecimal(0);
-
-    public static final int DEFAULT_LENGTH = 18;
-    public static final int DEFAULT_SCALE = 2;
-
-    private final NumberFormat format;
-
-    public BigDecimalValueSemanticsProvider(final FacetHolder holder) {
-        super(type(), holder, BigDecimal.class, TYPICAL_LENGTH, -1, Immutability.IMMUTABLE, EqualByContent.HONOURED, DEFAULT_VALUE);
-        final String formatRequired = getConfiguration().getValueTypes().getJavaMath().getBigDecimal().getFormat();
-
-        if (formatRequired != null) {
-            format = new DecimalFormat(formatRequired);
-        } else {
-            final Locale inLocale = getConfiguration().getCore().getRuntime().getLocale().map(LocaleUtil::findLocale).orElse(Locale.getDefault());
-            format = NumberFormat.getNumberInstance(inLocale);
-        }
-    }
-
-    // -- SCALE, PRECISION
-
-    @Override
-    public int getPrecision() {
-        return DEFAULT_LENGTH;
-    }
-
-    @Override
-    public int getScale() {
-        return DEFAULT_SCALE;
-    }
-
-    // -- PARSER
-
-    @Override
-    protected BigDecimal doParse(final Parser.Context context, final String entry) {
-        try {
-            return new BigDecimal(entry);
-        } catch (final NumberFormatException e) {
-            throw new TextEntryParseException("Not a decimal " + entry, e);
-        }
-    }
-
-    // -- TITLE
-
-    @Override
-    public String titleString(final Object object) {
-        return titleString(format, object);
-    }
-
-    // -- ENCODER DECODER
-
-    @Override
-    public String toEncodedString(final BigDecimal object) {
-        try {
-            return object.toPlainString();
-        } catch (final Exception e) {
-            throw new UnrecoverableException(e);
-        }
-    }
-
-    @Override
-    public BigDecimal fromEncodedString(final String data) {
-        return new BigDecimal(data);
-    }
-
-    @Override
-    public void visitAttributes(final BiConsumer<String, Object> visitor) {
-        super.visitAttributes(visitor);
-        visitor.accept("format", format);
-    }
-
-}
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/biginteger/BigIntegerValueFacetUsingSemanticsProviderFactory.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/biginteger/BigIntegerValueFacetUsingSemanticsProviderFactory.java
index 5bc4711..efeef09 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/biginteger/BigIntegerValueFacetUsingSemanticsProviderFactory.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/biginteger/BigIntegerValueFacetUsingSemanticsProviderFactory.java
@@ -41,7 +41,7 @@ extends ValueFacetUsingSemanticsProviderFactory<BigInteger> {
         if (type != BigInteger.class) {
             return;
         }
-        addFacets(new BigIntegerValueSemanticsProvider(holder));
+        addValueFacet(new BigIntegerValueSemanticsProvider(holder));
     }
 
 }
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
index d10f5a8..df0f848 100644
--- 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
@@ -40,7 +40,7 @@ extends ValueFacetUsingSemanticsProviderFactory<Blob> {
         if (type != Blob.class) {
             return;
         }
-        addFacets(new BlobValueSemanticsProvider(holder));
+        addValueFacet(new BlobValueSemanticsProvider(holder));
     }
 
 }
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/booleans/BooleanPrimitiveValueFacetUsingSemanticsProviderFactory.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/booleans/BooleanPrimitiveValueFacetUsingSemanticsProviderFactory.java
index a7261a2..6bdd6ae 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/booleans/BooleanPrimitiveValueFacetUsingSemanticsProviderFactory.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/booleans/BooleanPrimitiveValueFacetUsingSemanticsProviderFactory.java
@@ -40,7 +40,7 @@ extends ValueFacetUsingSemanticsProviderFactory<Boolean> {
         if (type != boolean.class) {
             return;
         }
-        addFacets(new BooleanPrimitiveValueSemanticsProvider(holder));
+        addValueFacet(new BooleanPrimitiveValueSemanticsProvider(holder));
     }
 
 }
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/booleans/BooleanWrapperValueFacetUsingSemanticsProviderFactory.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/booleans/BooleanWrapperValueFacetUsingSemanticsProviderFactory.java
index 4a3d08c..62bf86b 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/booleans/BooleanWrapperValueFacetUsingSemanticsProviderFactory.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/booleans/BooleanWrapperValueFacetUsingSemanticsProviderFactory.java
@@ -40,7 +40,7 @@ extends ValueFacetUsingSemanticsProviderFactory<Boolean> {
         if (type != Boolean.class) {
             return;
         }
-        addFacets(new BooleanWrapperValueSemanticsProvider(holder));
+        addValueFacet(new BooleanWrapperValueSemanticsProvider(holder));
     }
 
 }
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/bytes/BytePrimitiveValueFacetUsingSemanticsProviderFactory.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/bytes/BytePrimitiveValueFacetUsingSemanticsProviderFactory.java
index bfbcbb3..de44ad6 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/bytes/BytePrimitiveValueFacetUsingSemanticsProviderFactory.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/bytes/BytePrimitiveValueFacetUsingSemanticsProviderFactory.java
@@ -40,7 +40,7 @@ extends ValueFacetUsingSemanticsProviderFactory<Byte> {
         if (type != byte.class) {
             return;
         }
-        addFacets(new BytePrimitiveValueSemanticsProvider(holder));
+        addValueFacet(new BytePrimitiveValueSemanticsProvider(holder));
     }
 
 }
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/bytes/ByteWrapperValueFacetUsingSemanticsProviderFactory.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/bytes/ByteWrapperValueFacetUsingSemanticsProviderFactory.java
index 5b33210..5505d99 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/bytes/ByteWrapperValueFacetUsingSemanticsProviderFactory.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/bytes/ByteWrapperValueFacetUsingSemanticsProviderFactory.java
@@ -40,7 +40,7 @@ extends ValueFacetUsingSemanticsProviderFactory<Byte> {
         if (type != Byte.class) {
             return;
         }
-        addFacets(new ByteWrapperValueSemanticsProvider(holder));
+        addValueFacet(new ByteWrapperValueSemanticsProvider(holder));
     }
 
 }
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/chars/CharPrimitiveValueFacetUsingSemanticsProviderFactory.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/chars/CharPrimitiveValueFacetUsingSemanticsProviderFactory.java
index ca756b5..b066fbb 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/chars/CharPrimitiveValueFacetUsingSemanticsProviderFactory.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/chars/CharPrimitiveValueFacetUsingSemanticsProviderFactory.java
@@ -40,7 +40,7 @@ extends ValueFacetUsingSemanticsProviderFactory<Character> {
         if (type != char.class) {
             return;
         }
-        addFacets(new CharPrimitiveValueSemanticsProvider(holder));
+        addValueFacet(new CharPrimitiveValueSemanticsProvider(holder));
     }
 
 }
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/chars/CharWrapperValueFacetUsingSemanticsProviderFactory.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/chars/CharWrapperValueFacetUsingSemanticsProviderFactory.java
index 72bae20..b22a705 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/chars/CharWrapperValueFacetUsingSemanticsProviderFactory.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/chars/CharWrapperValueFacetUsingSemanticsProviderFactory.java
@@ -40,7 +40,7 @@ extends ValueFacetUsingSemanticsProviderFactory<Character> {
         if (type != Character.class) {
             return;
         }
-        addFacets(new CharWrapperValueSemanticsProvider(holder));
+        addValueFacet(new CharWrapperValueSemanticsProvider(holder));
     }
 
 }
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
index 9a3d7f9..5b445d4 100644
--- 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
@@ -40,7 +40,7 @@ extends ValueFacetUsingSemanticsProviderFactory<Clob> {
         if (type != Clob.class) {
             return;
         }
-        addFacets(new ClobValueSemanticsProvider(holder));
+        addValueFacet(new ClobValueSemanticsProvider(holder));
     }
 
 }
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/datejodalocal/JodaLocalDateValueFacetUsingSemanticsProviderFactory.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/datejodalocal/JodaLocalDateValueFacetUsingSemanticsProviderFactory.java
index 77f3768..b71e7ca 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/datejodalocal/JodaLocalDateValueFacetUsingSemanticsProviderFactory.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/datejodalocal/JodaLocalDateValueFacetUsingSemanticsProviderFactory.java
@@ -43,7 +43,7 @@ extends ValueFacetUsingSemanticsProviderFactory<LocalDate> {
         if (type != LocalDate.class) {
             return;
         }
-        addFacets(new JodaLocalDateValueSemanticsProvider(holder));
+        addValueFacet(new JodaLocalDateValueSemanticsProvider(holder));
     }
 
 }
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/datesql/JavaSqlDateValueFacetUsingSemanticsProviderFactory.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/datesql/JavaSqlDateValueFacetUsingSemanticsProviderFactory.java
index 1e778b4..4073a6c 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/datesql/JavaSqlDateValueFacetUsingSemanticsProviderFactory.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/datesql/JavaSqlDateValueFacetUsingSemanticsProviderFactory.java
@@ -43,7 +43,7 @@ extends ValueFacetUsingSemanticsProviderFactory<Date> {
         if (type != Date.class) {
             return;
         }
-        addFacets(new JavaSqlDateValueSemanticsProvider(holder));
+        addValueFacet(new JavaSqlDateValueSemanticsProvider(holder));
     }
 
 }
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/datetimejoda/JodaDateTimeValueFacetUsingSemanticsProviderFactory.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/datetimejoda/JodaDateTimeValueFacetUsingSemanticsProviderFactory.java
index cb4f16c..268bae3 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/datetimejoda/JodaDateTimeValueFacetUsingSemanticsProviderFactory.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/datetimejoda/JodaDateTimeValueFacetUsingSemanticsProviderFactory.java
@@ -43,7 +43,7 @@ extends ValueFacetUsingSemanticsProviderFactory<DateTime> {
         if (type != DateTime.class) {
             return;
         }
-        addFacets(new JodaDateTimeValueSemanticsProvider(holder));
+        addValueFacet(new JodaDateTimeValueSemanticsProvider(holder));
     }
 
 }
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/datetimejodalocal/JodaLocalDateTimeValueFacetUsingSemanticsProviderFactory.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/datetimejodalocal/JodaLocalDateTimeValueFacetUsingSemanticsProviderFactory.java
index c3d0d41..422f236 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/datetimejodalocal/JodaLocalDateTimeValueFacetUsingSemanticsProviderFactory.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/datetimejodalocal/JodaLocalDateTimeValueFacetUsingSemanticsProviderFactory.java
@@ -43,7 +43,7 @@ extends ValueFacetUsingSemanticsProviderFactory<LocalDateTime> {
         if (type != LocalDateTime.class) {
             return;
         }
-        addFacets(new JodaLocalDateTimeValueSemanticsProvider(holder));
+        addValueFacet(new JodaLocalDateTimeValueSemanticsProvider(holder));
     }
 
 }
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/dateutil/JavaUtilDateValueFacetUsingSemanticsProviderFactory.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/dateutil/JavaUtilDateValueFacetUsingSemanticsProviderFactory.java
index 9dbb61a..f41f980 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/dateutil/JavaUtilDateValueFacetUsingSemanticsProviderFactory.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/dateutil/JavaUtilDateValueFacetUsingSemanticsProviderFactory.java
@@ -44,7 +44,7 @@ extends ValueFacetUsingSemanticsProviderFactory<Date> {
         if (type != Date.class) {
             return;
         }
-        addFacets(new JavaUtilDateValueSemanticsProvider(holder));
+        addValueFacet(new JavaUtilDateValueSemanticsProvider(holder));
     }
 
 }
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/doubles/DoublePrimitiveValueFacetUsingSemanticsProviderFactory.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/doubles/DoublePrimitiveValueFacetUsingSemanticsProviderFactory.java
index b8e8e6a..8eaefdf 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/doubles/DoublePrimitiveValueFacetUsingSemanticsProviderFactory.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/doubles/DoublePrimitiveValueFacetUsingSemanticsProviderFactory.java
@@ -40,7 +40,7 @@ extends ValueFacetUsingSemanticsProviderFactory<Double> {
         if (type != double.class) {
             return;
         }
-        addFacets(new DoublePrimitiveValueSemanticsProvider(holder));
+        addValueFacet(new DoublePrimitiveValueSemanticsProvider(holder));
     }
 
 }
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/doubles/DoubleWrapperValueFacetUsingSemanticsProviderFactory.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/doubles/DoubleWrapperValueFacetUsingSemanticsProviderFactory.java
index 318af40..bd8263c 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/doubles/DoubleWrapperValueFacetUsingSemanticsProviderFactory.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/doubles/DoubleWrapperValueFacetUsingSemanticsProviderFactory.java
@@ -40,7 +40,7 @@ extends ValueFacetUsingSemanticsProviderFactory<Double> {
         if (type != Double.class) {
             return;
         }
-        addFacets(new DoubleWrapperValueSemanticsProvider(holder));
+        addValueFacet(new DoubleWrapperValueSemanticsProvider(holder));
     }
 
 }
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/floats/FloatPrimitiveValueFacetUsingSemanticsProviderFactory.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/floats/FloatPrimitiveValueFacetUsingSemanticsProviderFactory.java
index d5ee117..287eff8 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/floats/FloatPrimitiveValueFacetUsingSemanticsProviderFactory.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/floats/FloatPrimitiveValueFacetUsingSemanticsProviderFactory.java
@@ -40,7 +40,7 @@ extends ValueFacetUsingSemanticsProviderFactory<Float> {
         if (type != float.class) {
             return;
         }
-        addFacets(new FloatPrimitiveValueSemanticsProvider(holder));
+        addValueFacet(new FloatPrimitiveValueSemanticsProvider(holder));
     }
 
 }
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/floats/FloatWrapperValueFacetUsingSemanticsProviderFactory.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/floats/FloatWrapperValueFacetUsingSemanticsProviderFactory.java
index 4ad32c2..11a7fbf 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/floats/FloatWrapperValueFacetUsingSemanticsProviderFactory.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/floats/FloatWrapperValueFacetUsingSemanticsProviderFactory.java
@@ -40,7 +40,7 @@ extends ValueFacetUsingSemanticsProviderFactory<Float> {
         if (type != Float.class) {
             return;
         }
-        addFacets(new FloatWrapperValueSemanticsProvider(holder));
+        addValueFacet(new FloatWrapperValueSemanticsProvider(holder));
     }
 
 }
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/imageawt/JavaAwtImageValueFacetUsingSemanticsProviderFactory.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/imageawt/JavaAwtImageValueFacetUsingSemanticsProviderFactory.java
index 22d79e1..bf9a055 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/imageawt/JavaAwtImageValueFacetUsingSemanticsProviderFactory.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/imageawt/JavaAwtImageValueFacetUsingSemanticsProviderFactory.java
@@ -42,7 +42,7 @@ extends ValueFacetUsingSemanticsProviderFactory<BufferedImage> {
         if (!BufferedImage.class.isAssignableFrom(type)) {
             return;
         }
-        addFacets(new JavaAwtImageValueSemanticsProvider(holder));
+        addValueFacet(new JavaAwtImageValueSemanticsProvider(holder));
     }
 
 }
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/integer/IntPrimitiveValueFacetUsingSemanticsProviderFactory.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/integer/IntPrimitiveValueFacetUsingSemanticsProviderFactory.java
index a446921..6593a57 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/integer/IntPrimitiveValueFacetUsingSemanticsProviderFactory.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/integer/IntPrimitiveValueFacetUsingSemanticsProviderFactory.java
@@ -40,7 +40,7 @@ extends ValueFacetUsingSemanticsProviderFactory<Integer> {
         if (type != int.class) {
             return;
         }
-        addFacets(new IntPrimitiveValueSemanticsProvider(holder));
+        addValueFacet(new IntPrimitiveValueSemanticsProvider(holder));
     }
 
 }
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/integer/IntWrapperValueFacetUsingSemanticsProviderFactory.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/integer/IntWrapperValueFacetUsingSemanticsProviderFactory.java
index d5c8bb5..6411911 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/integer/IntWrapperValueFacetUsingSemanticsProviderFactory.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/integer/IntWrapperValueFacetUsingSemanticsProviderFactory.java
@@ -40,7 +40,7 @@ extends ValueFacetUsingSemanticsProviderFactory<Integer> {
         if (type != Integer.class) {
             return;
         }
-        addFacets(new IntWrapperValueSemanticsProvider(holder));
+        addValueFacet(new IntWrapperValueSemanticsProvider(holder));
     }
 
 }
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/localrespath/LocalResourcePathValueFacetUsingSemanticsProviderFactory.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/localrespath/LocalResourcePathValueFacetUsingSemanticsProviderFactory.java
index e44fac9..8adf44e 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/localrespath/LocalResourcePathValueFacetUsingSemanticsProviderFactory.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/localrespath/LocalResourcePathValueFacetUsingSemanticsProviderFactory.java
@@ -41,7 +41,7 @@ extends ValueFacetUsingSemanticsProviderFactory<LocalResourcePath> {
         if (type != LocalResourcePath.class) {
             return;
         }
-        addFacets(new LocalResourcePathValueSemanticsProvider(holder));
+        addValueFacet(new LocalResourcePathValueSemanticsProvider(holder));
     }
 
 }
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/longs/LongPrimitiveValueFacetUsingSemanticsProviderFactory.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/longs/LongPrimitiveValueFacetUsingSemanticsProviderFactory.java
index db3d584..1800338 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/longs/LongPrimitiveValueFacetUsingSemanticsProviderFactory.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/longs/LongPrimitiveValueFacetUsingSemanticsProviderFactory.java
@@ -40,7 +40,7 @@ extends ValueFacetUsingSemanticsProviderFactory<Long> {
         if (type != long.class) {
             return;
         }
-        addFacets(new LongPrimitiveValueSemanticsProvider(holder));
+        addValueFacet(new LongPrimitiveValueSemanticsProvider(holder));
     }
 
 }
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/longs/LongWrapperValueFacetUsingSemanticsProviderFactory.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/longs/LongWrapperValueFacetUsingSemanticsProviderFactory.java
index 0d369d7..153a599 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/longs/LongWrapperValueFacetUsingSemanticsProviderFactory.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/longs/LongWrapperValueFacetUsingSemanticsProviderFactory.java
@@ -40,7 +40,7 @@ extends ValueFacetUsingSemanticsProviderFactory<Long> {
         if (type != Long.class) {
             return;
         }
-        addFacets(new LongWrapperValueSemanticsProvider(holder));
+        addValueFacet(new LongWrapperValueSemanticsProvider(holder));
     }
 
 }
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/markup/MarkupValueFacetUsingSemanticsProviderFactory.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/markup/MarkupValueFacetUsingSemanticsProviderFactory.java
index 3c47310..1a945fc 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/markup/MarkupValueFacetUsingSemanticsProviderFactory.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/markup/MarkupValueFacetUsingSemanticsProviderFactory.java
@@ -41,6 +41,6 @@ extends ValueFacetUsingSemanticsProviderFactory<Markup> {
         if (!(Markup.class.isAssignableFrom(type))) {
             return;
         }
-        addFacets(new MarkupValueSemanticsProvider(holder));
+        addValueFacet(new MarkupValueSemanticsProvider(holder));
     }
 }
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/password/PasswordValueFacetUsingSemanticsProviderFactory.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/password/PasswordValueFacetUsingSemanticsProviderFactory.java
index ef6e09a..c166448 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/password/PasswordValueFacetUsingSemanticsProviderFactory.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/password/PasswordValueFacetUsingSemanticsProviderFactory.java
@@ -41,7 +41,7 @@ extends ValueFacetUsingSemanticsProviderFactory<Password> {
         if (type != org.apache.isis.applib.value.Password.class) {
             return;
         }
-        addFacets(new PasswordValueSemanticsProvider(holder));
+        addValueFacet(new PasswordValueSemanticsProvider(holder));
     }
 
 }
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/shortint/ShortPrimitiveValueFacetUsingSemanticsProviderFactory.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/shortint/ShortPrimitiveValueFacetUsingSemanticsProviderFactory.java
index 8955be2..1f1d5fe 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/shortint/ShortPrimitiveValueFacetUsingSemanticsProviderFactory.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/shortint/ShortPrimitiveValueFacetUsingSemanticsProviderFactory.java
@@ -40,7 +40,7 @@ extends ValueFacetUsingSemanticsProviderFactory<Short> {
         if (type != short.class) {
             return;
         }
-        addFacets(new ShortPrimitiveValueSemanticsProvider(holder));
+        addValueFacet(new ShortPrimitiveValueSemanticsProvider(holder));
     }
 
 }
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/shortint/ShortWrapperValueFacetUsingSemanticsProviderFactory.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/shortint/ShortWrapperValueFacetUsingSemanticsProviderFactory.java
index cb10822..897c0b7 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/shortint/ShortWrapperValueFacetUsingSemanticsProviderFactory.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/shortint/ShortWrapperValueFacetUsingSemanticsProviderFactory.java
@@ -40,7 +40,7 @@ extends ValueFacetUsingSemanticsProviderFactory<Short> {
         if (type != Short.class) {
             return;
         }
-        addFacets(new ShortWrapperValueSemanticsProvider(holder));
+        addValueFacet(new ShortWrapperValueSemanticsProvider(holder));
     }
 
 }
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/string/StringValueFacetUsingSemanticsProviderFactory.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/string/StringValueFacetUsingSemanticsProviderFactory.java
index fa6ff82..18a927e 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/string/StringValueFacetUsingSemanticsProviderFactory.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/string/StringValueFacetUsingSemanticsProviderFactory.java
@@ -40,7 +40,7 @@ extends ValueFacetUsingSemanticsProviderFactory<String> {
         if (type != String.class) {
             return;
         }
-        addFacets(new StringValueSemanticsProvider(holder));
+        addValueFacet(new StringValueSemanticsProvider(holder));
     }
 
 }
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/temporal/TemporalValueFacetUsingSemanticsProviderFactory.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/temporal/TemporalValueFacetUsingSemanticsProviderFactory.java
index a192c3c..fe64762 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/temporal/TemporalValueFacetUsingSemanticsProviderFactory.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/temporal/TemporalValueFacetUsingSemanticsProviderFactory.java
@@ -58,7 +58,7 @@ extends ValueFacetUsingSemanticsProviderFactory<T> {
             return;
         }
         val facetHolder = processClassContext.getFacetHolder();
-        addFacets(facetFactory.apply(facetHolder));
+        addValueFacet(facetFactory.apply(facetHolder));
     }
 
 
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/timesql/JavaSqlTimeValueFacetUsingSemanticsProviderFactory.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/timesql/JavaSqlTimeValueFacetUsingSemanticsProviderFactory.java
index 4930d1e..c2f8cc6 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/timesql/JavaSqlTimeValueFacetUsingSemanticsProviderFactory.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/timesql/JavaSqlTimeValueFacetUsingSemanticsProviderFactory.java
@@ -44,7 +44,7 @@ extends ValueFacetUsingSemanticsProviderFactory<Time> {
         if (type != java.sql.Time.class) {
             return;
         }
-        addFacets(new JavaSqlTimeValueSemanticsProvider(holder));
+        addValueFacet(new JavaSqlTimeValueSemanticsProvider(holder));
     }
 
 }
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/timestampsql/JavaSqlTimeStampValueFacetUsingSemanticsProviderFactory.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/timestampsql/JavaSqlTimeStampValueFacetUsingSemanticsProviderFactory.java
index d120892..6fefc64 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/timestampsql/JavaSqlTimeStampValueFacetUsingSemanticsProviderFactory.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/timestampsql/JavaSqlTimeStampValueFacetUsingSemanticsProviderFactory.java
@@ -44,7 +44,7 @@ extends ValueFacetUsingSemanticsProviderFactory<Timestamp> {
         if (type != java.sql.Timestamp.class) {
             return;
         }
-        addFacets(new JavaSqlTimeStampValueSemanticsProvider(holder));
+        addValueFacet(new JavaSqlTimeStampValueSemanticsProvider(holder));
     }
 
 }
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/treenode/TreeNodeValueFacetUsingSemanticsProviderFactory.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/treenode/TreeNodeValueFacetUsingSemanticsProviderFactory.java
index 86717ce..115c97b 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/treenode/TreeNodeValueFacetUsingSemanticsProviderFactory.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/treenode/TreeNodeValueFacetUsingSemanticsProviderFactory.java
@@ -42,6 +42,6 @@ extends ValueFacetUsingSemanticsProviderFactory<TreeNode> {
         if (!TreeNode.class.isAssignableFrom(type)) {
             return;
         }
-        addFacets(new TreeNodeValueSemanticsProvider(holder));
+        addValueFacet(new TreeNodeValueSemanticsProvider(holder));
     }
 }
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/url/URLValueFacetUsingSemanticsProviderFactory.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/url/URLValueFacetUsingSemanticsProviderFactory.java
index 48192f5..ccd9268 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/url/URLValueFacetUsingSemanticsProviderFactory.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/url/URLValueFacetUsingSemanticsProviderFactory.java
@@ -42,7 +42,7 @@ extends ValueFacetUsingSemanticsProviderFactory<URL> {
         if (type != java.net.URL.class) {
             return;
         }
-        addFacets(new URLValueSemanticsProvider(holder));
+        addValueFacet(new URLValueSemanticsProvider(holder));
     }
 
 }
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/url/URLValueSemanticsProvider.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/url/URLValueSemanticsProvider.java
index bf833e4..171ba03 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/url/URLValueSemanticsProvider.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/url/URLValueSemanticsProvider.java
@@ -57,7 +57,7 @@ implements URLValueFacet {
             try {
                 return new java.net.URL(entry);
             } catch (final MalformedURLException ex) {
-                throw new IllegalArgumentException("Not parseable as a URL ('" + entry + "')", ex);
+                throw new IllegalArgumentException("Not parseable as an URL ('" + entry + "')", ex);
             }
         }
     }
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/uuid/UUIDValueFacetUsingSemanticsProviderFactory.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/uuid/UUIDValueFacetUsingSemanticsProviderFactory.java
index 2fa239d..ef77897 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/uuid/UUIDValueFacetUsingSemanticsProviderFactory.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/uuid/UUIDValueFacetUsingSemanticsProviderFactory.java
@@ -42,7 +42,7 @@ extends ValueFacetUsingSemanticsProviderFactory<UUID> {
         if (type != UUID.class) {
             return;
         }
-        addFacets(new UUIDValueSemanticsProvider(holder));
+        addAllFacetsForValueSemantics(new UUIDValueSemantics(), holder);
     }
 
 }
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
new file mode 100644
index 0000000..393f89f
--- /dev/null
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/uuid/UUIDValueSemantics.java
@@ -0,0 +1,76 @@
+/*
+ *  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.uuid;
+
+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.commons.internal.base._Strings;
+
+public class UUIDValueSemantics
+extends AbstractValueSemanticsProvider<UUID>
+implements
+    EncoderDecoder<UUID>,
+    Parser<UUID> {
+
+    // -- ENCODER DECODER
+
+    @Override
+    public String toEncodedString(final UUID object) {
+        return object.toString();
+    }
+
+    @Override
+    public UUID fromEncodedString(final String data) {
+        return UUID.fromString(data);
+    }
+
+    // -- PARSER
+
+    @Override
+    public String presentationValue(final Context context, final UUID value) {
+        return value == null ? "" : value.toString();
+    }
+
+    @Override
+    public String parseableTextRepresentation(final Context context, final UUID value) {
+        return value == null ? null : value.toString();
+    }
+
+    @Override
+    public UUID parseTextRepresentation(final Context context, final String text) {
+        final var input = _Strings.blankToNullOrTrim(text);
+        return input!=null
+                ? UUID.fromString(input)
+                : null;
+    }
+
+    @Override
+    public int typicalLength() {
+        return maxLength();
+    }
+
+    @Override
+    public int maxLength() {
+        return 36;
+    }
+
+}
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/uuid/UUIDValueSemanticsProvider.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/uuid/UUIDValueSemanticsProvider.java
deleted file mode 100644
index dcdd966..0000000
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/uuid/UUIDValueSemanticsProvider.java
+++ /dev/null
@@ -1,91 +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.uuid;
-
-import java.util.UUID;
-
-import org.apache.isis.applib.adapters.Parser;
-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;
-import org.apache.isis.core.metamodel.spec.ManagedObject;
-
-public class UUIDValueSemanticsProvider
-extends ValueSemanticsProviderAndFacetAbstract<UUID>
-implements UUIDValueFacet {
-
-    private static final Class<? extends Facet> type() {
-        return UUIDValueFacet.class;
-    }
-
-    public static final int MAX_LENGTH = 36;
-    public static final int TYPICAL_LENGTH = MAX_LENGTH;
-    private static final UUID DEFAULT_VALUE = null; // no default
-
-    public UUIDValueSemanticsProvider(final FacetHolder holder) {
-        super(type(), holder, UUID.class, TYPICAL_LENGTH, MAX_LENGTH, Immutability.IMMUTABLE, EqualByContent.HONOURED, DEFAULT_VALUE);
-    }
-
-    // //////////////////////////////////////////////////////////////////
-    // Parser
-    // //////////////////////////////////////////////////////////////////
-
-    @Override
-    protected UUID doParse(final Parser.Context context, final String entry) {
-        if (entry.trim().equals("")) {
-            return null;
-        } else {
-            return UUID.fromString(entry);
-        }
-    }
-
-    @Override
-    public String titleString(final Object object) {
-        return object == null ? "" : object.toString();
-    }
-
-    // //////////////////////////////////////////////////////////////////
-    // EncoderDecoder
-    // //////////////////////////////////////////////////////////////////
-
-    @Override
-    public String toEncodedString(final UUID object) {
-        return object.toString();
-    }
-
-    @Override
-    public UUID fromEncodedString(final String data) {
-        return UUID.fromString(data);
-    }
-
-    // //////////////////////////////////////////////////////////////////
-    // UuidValueFacet
-    // //////////////////////////////////////////////////////////////////
-
-    @Override
-    public UUID uuidValue(final ManagedObject object) {
-        return object == null ? null : (UUID) object.getPojo();
-    }
-
-    @Override
-    public ManagedObject createValue(final UUID value) {
-        return getObjectManager().adapt(value);
-    }
-
-}
diff --git a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/propparam/decimal/JavaxValidationDigitsAnnotationFacetFactoryTest.java b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/propparam/decimal/JavaxValidationDigitsAnnotationFacetFactoryTest.java
index 00d6260..944b0d3 100644
--- a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/propparam/decimal/JavaxValidationDigitsAnnotationFacetFactoryTest.java
+++ b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/propparam/decimal/JavaxValidationDigitsAnnotationFacetFactoryTest.java
@@ -21,16 +21,22 @@ package org.apache.isis.core.metamodel.facets.propparam.decimal;
 import java.lang.reflect.Method;
 import java.math.BigDecimal;
 
+import static org.hamcrest.CoreMatchers.is;
+import static org.hamcrest.MatcherAssert.assertThat;
+
 import org.apache.isis.applib.annotation.Introspection.IntrospectionPolicy;
-import org.apache.isis.core.metamodel.facetapi.Facet;
+import org.apache.isis.core.metamodel.facetapi.FacetHolder;
 import org.apache.isis.core.metamodel.facets.AbstractFacetFactoryTest;
 import org.apache.isis.core.metamodel.facets.FacetFactory;
 import org.apache.isis.core.metamodel.facets.FacetFactory.ProcessMethodContext;
+import org.apache.isis.core.metamodel.facets.objectvalue.maxlen.MaxFractionalDigitsFacet;
+import org.apache.isis.core.metamodel.facets.objectvalue.maxlen.MaxTotalDigitsFacet;
 import org.apache.isis.core.metamodel.facets.param.bigdecimal.javaxvaldigits.BigDecimalFacetOnParameterFromJavaxValidationAnnotationFactory;
-import org.apache.isis.core.metamodel.facets.param.bigdecimal.javaxvaldigits.BigDecimalFacetOnParameterFromJavaxValidationDigitsAnnotation;
-import org.apache.isis.core.metamodel.facets.properties.bigdecimal.javaxvaldigits.BigDecimalFacetOnPropertyFromJavaxValidationDigitsAnnotation;
+import org.apache.isis.core.metamodel.facets.param.bigdecimal.javaxvaldigits.MaxFractionalDigitsFacetOnParameterFromJavaxValidationDigitsAnnotation;
+import org.apache.isis.core.metamodel.facets.param.bigdecimal.javaxvaldigits.MaxTotalDigitsFacetOnParameterFromJavaxValidationDigitsAnnotation;
 import org.apache.isis.core.metamodel.facets.properties.bigdecimal.javaxvaldigits.BigDecimalFacetOnPropertyFromJavaxValidationDigitsAnnotationFactory;
-import org.apache.isis.core.metamodel.facets.value.bigdecimal.BigDecimalValueFacet;
+import org.apache.isis.core.metamodel.facets.properties.bigdecimal.javaxvaldigits.MaxFractionalDigitsFacetOnPropertyFromJavaxValidationDigitsAnnotation;
+import org.apache.isis.core.metamodel.facets.properties.bigdecimal.javaxvaldigits.MaxTotalDigitsFacetOnPropertyFromJavaxValidationDigitsAnnotation;
 
 public class JavaxValidationDigitsAnnotationFacetFactoryTest
 extends AbstractFacetFactoryTest {
@@ -50,12 +56,7 @@ extends AbstractFacetFactoryTest {
         facetFactory.process(ProcessMethodContext
                 .forTesting(Order.class, null, method, methodRemover, facetedMethod));
 
-        final Facet facet = facetedMethod.getFacet(BigDecimalValueFacet.class);
-        assertNotNull(facet);
-        assertTrue(facet instanceof BigDecimalFacetOnPropertyFromJavaxValidationDigitsAnnotation);
-        final BigDecimalFacetOnPropertyFromJavaxValidationDigitsAnnotation annotation = (BigDecimalFacetOnPropertyFromJavaxValidationDigitsAnnotation) facet;
-        assertEquals(18, annotation.getPrecision());
-        assertEquals(4, annotation.getScale());
+        assertBigDecimalSemantics(facetedMethod, 18, 4);
     }
 
     public void testAnnotationPickedUpOnActionParameter() {
@@ -71,17 +72,32 @@ extends AbstractFacetFactoryTest {
         }
         final Method method = findMethod(Order.class, "updateCost", new Class[] { BigDecimal.class });
 
-
-
         facetFactory.processParams(new FacetFactory
                 .ProcessParameterContext(Customer.class, IntrospectionPolicy.ANNOTATION_OPTIONAL, method, 0, null, facetedMethodParameter));
 
-        final Facet facet = facetedMethodParameter.getFacet(BigDecimalValueFacet.class);
-        assertNotNull(facet);
-        assertTrue(facet instanceof BigDecimalFacetOnParameterFromJavaxValidationDigitsAnnotation);
-        final BigDecimalFacetOnParameterFromJavaxValidationDigitsAnnotation annotation = (BigDecimalFacetOnParameterFromJavaxValidationDigitsAnnotation) facet;
-        assertEquals(18, annotation.getPrecision());
-        assertEquals(4, annotation.getScale());
+        assertBigDecimalSemantics(facetedMethodParameter, 18, 4);
+
+    }
+
+    // -- HELPER
+
+    private void assertBigDecimalSemantics(
+            final FacetHolder facetedMethod, final int maxTotalDigits, final int maxFractionalDigits) {
+        if(maxTotalDigits>=0) {
+            final MaxTotalDigitsFacet facet = facetedMethod.getFacet(MaxTotalDigitsFacet.class);
+            assertNotNull(facet);
+            assertTrue(facet instanceof MaxTotalDigitsFacetOnPropertyFromJavaxValidationDigitsAnnotation
+                    ||facet instanceof MaxTotalDigitsFacetOnParameterFromJavaxValidationDigitsAnnotation);
+            assertThat(facet.maxTotalDigits(), is(maxTotalDigits));
+        }
+
+        if(maxFractionalDigits>=0) {
+            final MaxFractionalDigitsFacet facet = facetedMethod.getFacet(MaxFractionalDigitsFacet.class);
+            assertNotNull(facet);
+            assertTrue(facet instanceof MaxFractionalDigitsFacetOnPropertyFromJavaxValidationDigitsAnnotation
+                    ||facet instanceof MaxFractionalDigitsFacetOnParameterFromJavaxValidationDigitsAnnotation);
+            assertThat(facet.maxFractionalDigits(), is(maxFractionalDigits));
+        }
     }
 
 }
diff --git a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/value/BigDecimalValueSemanticsProviderTest.java b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/value/BigDecimalValueSemanticsProviderTest.java
index deac09a..9f00a88 100644
--- a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/value/BigDecimalValueSemanticsProviderTest.java
+++ b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/value/BigDecimalValueSemanticsProviderTest.java
@@ -27,14 +27,13 @@ import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.fail;
 
 import org.apache.isis.applib.exceptions.recoverable.TextEntryParseException;
-import org.apache.isis.core.metamodel.facetapi.FacetHolderAbstract;
-import org.apache.isis.core.metamodel.facets.value.bigdecimal.BigDecimalValueSemanticsProvider;
+import org.apache.isis.core.metamodel.facets.value.bigdecimal.BigDecimalValueSemantics;
 
-public class BigDecimalValueSemanticsProviderTest extends ValueSemanticsProviderAbstractTestCase {
+public class BigDecimalValueSemanticsProviderTest
+extends ValueSemanticsProviderAbstractTestCase {
 
-    private BigDecimalValueSemanticsProvider value;
+    private BigDecimalValueSemantics value;
     private BigDecimal bigDecimal;
-    private FacetHolderAbstract holder;
 
     @Override
     @Before
@@ -43,9 +42,8 @@ public class BigDecimalValueSemanticsProviderTest extends ValueSemanticsProvider
 
         bigDecimal = new BigDecimal("34132.199");
         allowMockAdapterToReturn(bigDecimal);
-        holder = FacetHolderAbstract.forTesting(metaModelContext);
 
-        setValue(value = new BigDecimalValueSemanticsProvider(holder));
+        setSemanitcs(value = new BigDecimalValueSemantics());
     }
 
     @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 37b149f..9c459e0 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
@@ -35,6 +35,8 @@ import static org.junit.Assert.assertEquals;
 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.ValueSemanticsProvider;
 import org.apache.isis.applib.services.iactn.InteractionProvider;
 import org.apache.isis.commons.internal.base._Casts;
 import org.apache.isis.core.internaltestsupport.jmocking.JUnitRuleMockery2;
@@ -60,7 +62,8 @@ public abstract class ValueSemanticsProviderAbstractTestCase {
 
     protected MetaModelContext metaModelContext;
 
-    private ValueSemanticsProviderAndFacetAbstract<?> valueSemanticsProvider;
+    //private ValueSemanticsProviderAndFacetAbstract<?> valueSemanticsProvider;
+    private ValueSemanticsProvider<?> valueSemanticsProvider;
     private EncodableFacetUsingEncoderDecoder encodeableFacet;
     private ParseableFacetUsingParser parseableFacet;
 
@@ -107,6 +110,15 @@ public abstract class ValueSemanticsProviderAbstractTestCase {
         this.parseableFacet = ParseableFacetUsingParser.create(value, mockFacetHolder);
     }
 
+    protected void setSemanitcs(final AbstractValueSemanticsProvider<?> valueSemantics) {
+        this.valueSemanticsProvider = valueSemantics;
+        this.encodeableFacet = new EncodableFacetUsingEncoderDecoder(
+                valueSemantics.getEncoderDecoder(),
+                mockFacetHolder);
+        this.parseableFacet = ParseableFacetUsingParser.create(valueSemantics.getParser(), mockFacetHolder);
+    }
+
+
     protected <T> ValueSemanticsProviderAndFacetAbstract<T> getValue(final Class<T> type) {
         return _Casts.uncheckedCast(valueSemanticsProvider);
     }
@@ -126,10 +138,17 @@ public abstract class ValueSemanticsProviderAbstractTestCase {
     @Test
     public void testParseNull() throws Exception {
         Assume.assumeThat(valueSemanticsProvider.getParser(), is(not(nullValue())));
-        try {
-            valueSemanticsProvider.parseTextRepresentation(null, null);
-            fail();
-        } catch (final IllegalArgumentException expected) {
+
+        if(valueSemanticsProvider instanceof ValueSemanticsProviderAndFacetAbstract) {
+
+            try {
+                ((ValueSemanticsProviderAndFacetAbstract<?>)valueSemanticsProvider).parseTextRepresentation(null, null);
+                fail();
+            } catch (final IllegalArgumentException expected) {
+            }
+
+        } else {
+            assertEquals(null, valueSemanticsProvider.getParser().parseTextRepresentation(null, null));
         }
     }
 
@@ -137,7 +156,7 @@ public abstract class ValueSemanticsProviderAbstractTestCase {
     public void testParseEmptyString() throws Exception {
         Assume.assumeThat(valueSemanticsProvider.getParser(), is(not(nullValue())));
 
-        final Object newValue = valueSemanticsProvider.parseTextRepresentation(null, "");
+        final Object newValue = valueSemanticsProvider.getParser().parseTextRepresentation(null, "");
         assertNull(newValue);
     }
 
@@ -158,6 +177,14 @@ public abstract class ValueSemanticsProviderAbstractTestCase {
 
     @Test
     public void testTitleOfForNullObject() {
-        assertEquals("", valueSemanticsProvider.presentationValue(null, null));
+
+        if(valueSemanticsProvider instanceof ValueSemanticsProviderAndFacetAbstract) {
+            assertEquals("",
+                    ((ValueSemanticsProviderAndFacetAbstract<?>)valueSemanticsProvider)
+                    .presentationValue(null, null));
+        } else {
+            assertEquals("", valueSemanticsProvider.getParser().presentationValue(null, null));
+        }
+
     }
 }
diff --git a/incubator/viewers/javafx/ui/src/main/java/org/apache/isis/incubator/viewer/javafx/ui/components/number/NumberFieldFactory.java b/incubator/viewers/javafx/ui/src/main/java/org/apache/isis/incubator/viewer/javafx/ui/components/number/NumberFieldFactory.java
index 3fe9d50..eb83fff 100644
--- a/incubator/viewers/javafx/ui/src/main/java/org/apache/isis/incubator/viewer/javafx/ui/components/number/NumberFieldFactory.java
+++ b/incubator/viewers/javafx/ui/src/main/java/org/apache/isis/incubator/viewer/javafx/ui/components/number/NumberFieldFactory.java
@@ -20,7 +20,7 @@ package org.apache.isis.incubator.viewer.javafx.ui.components.number;
 
 import javax.inject.Inject;
 
-import org.springframework.core.annotation.Order;
+import org.springframework.util.ClassUtils;
 
 import org.apache.isis.applib.annotation.PriorityPrecedence;
 import org.apache.isis.commons.internal.base._Strings;
@@ -32,13 +32,14 @@ import org.apache.isis.incubator.viewer.javafx.ui.components.UiComponentHandlerF
 import org.apache.isis.viewer.common.model.binding.NumberConverterForStringComponent;
 import org.apache.isis.viewer.common.model.components.UiComponentFactory.ComponentRequest;
 
+import lombok.RequiredArgsConstructor;
+import lombok.val;
+import lombok.extern.log4j.Log4j2;
+
 import javafx.scene.Node;
 import javafx.scene.control.TextField;
 import javafx.scene.control.TextFormatter;
 import javafx.scene.layout.VBox;
-import lombok.RequiredArgsConstructor;
-import lombok.val;
-import lombok.extern.log4j.Log4j2;
 
 @org.springframework.stereotype.Component
 @javax.annotation.Priority(PriorityPrecedence.MIDPOINT)
@@ -47,12 +48,14 @@ import lombok.extern.log4j.Log4j2;
 public class NumberFieldFactory implements UiComponentHandlerFx {
 
     @Override
-    public boolean isHandling(ComponentRequest request) {
-        return request.hasFeatureTypeFacetAnyOf(NumberConverterForStringComponent.getSupportedFacets());
+    public boolean isHandling(final ComponentRequest request) {
+        val type = request.getFeatureTypeSpec().getCorrespondingClass();
+        return Number.class.isAssignableFrom(
+                ClassUtils.resolvePrimitiveIfNecessary(type));
     }
 
     @Override
-    public Node handle(ComponentRequest request) {
+    public Node handle(final ComponentRequest request) {
 
         val uiComponent = new VBox();
         val uiField = _fx.add(uiComponent, new TextField());
diff --git a/persistence/jdo/metamodel/src/main/java/org/apache/isis/persistence/jdo/metamodel/facets/prop/column/BigDecimalInferredFromJdoColumnAnnotationFacetFactory.java b/persistence/jdo/metamodel/src/main/java/org/apache/isis/persistence/jdo/metamodel/facets/prop/column/BigDecimalInferredFromJdoColumnAnnotationFacetFactory.java
index 7c6aa6b..421f42e 100644
--- a/persistence/jdo/metamodel/src/main/java/org/apache/isis/persistence/jdo/metamodel/facets/prop/column/BigDecimalInferredFromJdoColumnAnnotationFacetFactory.java
+++ b/persistence/jdo/metamodel/src/main/java/org/apache/isis/persistence/jdo/metamodel/facets/prop/column/BigDecimalInferredFromJdoColumnAnnotationFacetFactory.java
@@ -29,8 +29,8 @@ import org.apache.isis.core.metamodel.facetapi.FeatureType;
 import org.apache.isis.core.metamodel.facetapi.MetaModelRefiner;
 import org.apache.isis.core.metamodel.facets.FacetFactoryAbstract;
 import org.apache.isis.core.metamodel.facets.FacetedMethod;
-import org.apache.isis.core.metamodel.facets.value.bigdecimal.BigDecimalValueFacet;
-import org.apache.isis.core.metamodel.facets.value.bigdecimal.BigDecimalValueSemanticsProvider;
+import org.apache.isis.core.metamodel.facets.objectvalue.maxlen.MaxFractionalDigitsFacet;
+import org.apache.isis.core.metamodel.facets.objectvalue.maxlen.MaxTotalDigitsFacet;
 import org.apache.isis.core.metamodel.progmodel.ProgrammingModel;
 import org.apache.isis.core.metamodel.spec.feature.MixedIn;
 import org.apache.isis.core.metamodel.spec.feature.ObjectAssociation;
@@ -38,16 +38,10 @@ import org.apache.isis.core.metamodel.specloader.validator.ValidationFailure;
 import org.apache.isis.persistence.jdo.provider.metamodel.facets.object.persistencecapable.JdoPersistenceCapableFacet;
 import org.apache.isis.persistence.jdo.provider.metamodel.facets.prop.notpersistent.JdoNotPersistentFacet;
 
-import lombok.val;
-
-
 public class BigDecimalInferredFromJdoColumnAnnotationFacetFactory
 extends FacetFactoryAbstract
 implements MetaModelRefiner {
 
-    private static final int DEFAULT_LENGTH = BigDecimalValueSemanticsProvider.DEFAULT_LENGTH;
-    private static final int DEFAULT_SCALE = BigDecimalValueSemanticsProvider.DEFAULT_SCALE;
-
     @Inject
     public BigDecimalInferredFromJdoColumnAnnotationFacetFactory(final MetaModelContext mmc) {
         super(mmc, FeatureType.PROPERTIES_ONLY);
@@ -62,47 +56,19 @@ implements MetaModelRefiner {
 
         final FacetedMethod holder = processMethodContext.getFacetHolder();
 
-        BigDecimalValueFacet existingFacet = holder.getFacet(BigDecimalValueFacet.class);
+        final var jdoColumnIfAny = processMethodContext.synthesizeOnMethod(Column.class);
 
-        val jdoColumnAnnotation = processMethodContext.synthesizeOnMethod(Column.class)
-                .orElse(null);
-
-        if (jdoColumnAnnotation == null) {
-            if(existingFacet != null
-                    && !existingFacet.getPrecedence().isFallback()) {
-                // do nothing
-            } else {
-                addFacet(new BigDecimalFacetFallback(holder));
-            }
-        } else {
-
-            // obtain the existing facet's length and scale, to use as defaults if none are specified on the @Column
-            // this will mean a metamodel validation exception will only be fired later (see #refineMetaModelValidator)
-            // if there was an *explicit* value defined on the @Column annotation that is incompatible with existing.
-            Integer existingLength = null;
-            Integer existingScale = null;
-            if(existingFacet != null
-                    && !existingFacet.getPrecedence().isFallback()) {
-                existingLength = existingFacet.getPrecision();
-                existingScale = existingFacet.getScale();
-            }
-
-            Integer length = valueElseDefaults(jdoColumnAnnotation.length(), existingLength, DEFAULT_LENGTH);
-            Integer scale = valueElseDefaults(jdoColumnAnnotation.scale(), existingScale, DEFAULT_SCALE);
-            addFacet(new BigDecimalFacetInferredFromJdoColumn(holder, length, scale));
-        }
-    }
+        addFacetIfPresent(
+                MaxTotalDigitsFacetInferredFromJdoColumn
+                .create(jdoColumnIfAny, holder));
 
-    private static final Integer valueElseDefaults(final int value, final Integer underlying, int defaultVal) {
-        return value != -1
-                ? value
-                        : underlying != null
-                        ? underlying
-                                : defaultVal;
+        addFacetIfPresent(
+                MaxFractionalDigitsFacetInferredFromJdoColumn
+                .create(jdoColumnIfAny, holder));
     }
 
     @Override
-    public void refineProgrammingModel(ProgrammingModel programmingModel) {
+    public void refineProgrammingModel(final ProgrammingModel programmingModel) {
         programmingModel.addVisitingValidatorSkipManagedBeans(spec->{
 
             // only consider persistent entities
@@ -121,16 +87,29 @@ implements MetaModelRefiner {
         });
     }
 
-    private static void validateBigDecimalValueFacet(ObjectAssociation association) {
+    private static void validateBigDecimalValueFacet(final ObjectAssociation association) {
+
+        association.lookupFacet(MaxTotalDigitsFacet.class)
+        .map(MaxTotalDigitsFacet::getSharedFacetRankingElseFail)
+        .ifPresent(facetRanking->facetRanking
+                .visitTopRankPairsSemanticDiffering(MaxTotalDigitsFacet.class, (a, b)->{
+
+                    ValidationFailure.raiseFormatted(
+                            association,
+                            "%s: inconsistent MaxTotalDigits semantics specified in %s and %s.",
+                            association.getFeatureIdentifier().toString(),
+                            a.getClass().getSimpleName(),
+                            b.getClass().getSimpleName());
+                }));
 
-        association.lookupFacet(BigDecimalValueFacet.class)
-        .map(BigDecimalValueFacet::getSharedFacetRankingElseFail)
+        association.lookupFacet(MaxFractionalDigitsFacet.class)
+        .map(MaxFractionalDigitsFacet::getSharedFacetRankingElseFail)
         .ifPresent(facetRanking->facetRanking
-                .visitTopRankPairsSemanticDiffering(BigDecimalValueFacet.class, (a, b)->{
+                .visitTopRankPairsSemanticDiffering(MaxFractionalDigitsFacet.class, (a, b)->{
 
                     ValidationFailure.raiseFormatted(
                             association,
-                            "%s: inconsistent BigDecimalValue semantics specified in %s and %s.",
+                            "%s: inconsistent MaxFractionalDigits semantics specified in %s and %s.",
                             association.getFeatureIdentifier().toString(),
                             a.getClass().getSimpleName(),
                             b.getClass().getSimpleName());
diff --git a/persistence/jdo/metamodel/src/main/java/org/apache/isis/persistence/jdo/metamodel/facets/prop/column/MaxLengthFacetDerivedFromJdoColumn.java b/persistence/jdo/metamodel/src/main/java/org/apache/isis/persistence/jdo/metamodel/facets/prop/column/MaxFractionalDigitsFacetInferredFromJdoColumn.java
similarity index 54%
copy from persistence/jdo/metamodel/src/main/java/org/apache/isis/persistence/jdo/metamodel/facets/prop/column/MaxLengthFacetDerivedFromJdoColumn.java
copy to persistence/jdo/metamodel/src/main/java/org/apache/isis/persistence/jdo/metamodel/facets/prop/column/MaxFractionalDigitsFacetInferredFromJdoColumn.java
index 71dc240..fd732ee 100644
--- a/persistence/jdo/metamodel/src/main/java/org/apache/isis/persistence/jdo/metamodel/facets/prop/column/MaxLengthFacetDerivedFromJdoColumn.java
+++ b/persistence/jdo/metamodel/src/main/java/org/apache/isis/persistence/jdo/metamodel/facets/prop/column/MaxFractionalDigitsFacetInferredFromJdoColumn.java
@@ -18,14 +18,32 @@
  */
 package org.apache.isis.persistence.jdo.metamodel.facets.prop.column;
 
+import java.util.Optional;
+
+import javax.jdo.annotations.Column;
+
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
-import org.apache.isis.core.metamodel.facets.objectvalue.maxlen.MaxLengthFacetAbstract;
+import org.apache.isis.core.metamodel.facets.objectvalue.maxlen.MaxFractionalDigitsFacet;
+import org.apache.isis.core.metamodel.facets.objectvalue.maxlen.MaxFractionalDigitsFacetAbstract;
 
+public class MaxFractionalDigitsFacetInferredFromJdoColumn
+extends MaxFractionalDigitsFacetAbstract {
 
-public class MaxLengthFacetDerivedFromJdoColumn extends MaxLengthFacetAbstract {
+     public static Optional<MaxFractionalDigitsFacet> create(
+             final Optional<Column> jdoColumnIfAny,
+             final FacetHolder holder) {
+
+         return jdoColumnIfAny
+         .filter(jdoColumn->jdoColumn.scale()>=0)
+         .map(jdoColumn->{
+             return new MaxFractionalDigitsFacetInferredFromJdoColumn(
+                     jdoColumn.scale(), holder);
+         });
+    }
 
-    public MaxLengthFacetDerivedFromJdoColumn(final Integer length, final FacetHolder holder) {
-        super(length, holder);
+    private MaxFractionalDigitsFacetInferredFromJdoColumn(
+            final int maxFractionalDigits, final FacetHolder holder) {
+        super(maxFractionalDigits, holder);
     }
 
 }
diff --git a/persistence/jdo/metamodel/src/main/java/org/apache/isis/persistence/jdo/metamodel/facets/prop/column/MaxLengthDerivedFromJdoColumnAnnotationFacetFactory.java b/persistence/jdo/metamodel/src/main/java/org/apache/isis/persistence/jdo/metamodel/facets/prop/column/MaxLengthDerivedFromJdoColumnAnnotationFacetFactory.java
index bed5234..fee1f90 100644
--- a/persistence/jdo/metamodel/src/main/java/org/apache/isis/persistence/jdo/metamodel/facets/prop/column/MaxLengthDerivedFromJdoColumnAnnotationFacetFactory.java
+++ b/persistence/jdo/metamodel/src/main/java/org/apache/isis/persistence/jdo/metamodel/facets/prop/column/MaxLengthDerivedFromJdoColumnAnnotationFacetFactory.java
@@ -40,7 +40,6 @@ import org.apache.isis.persistence.jdo.provider.metamodel.facets.prop.notpersist
 
 import lombok.val;
 
-
 public class MaxLengthDerivedFromJdoColumnAnnotationFacetFactory
 extends FacetFactoryAbstract
 implements MetaModelRefiner {
@@ -49,7 +48,6 @@ implements MetaModelRefiner {
 
     public MaxLengthDerivedFromJdoColumnAnnotationFacetFactory(final MetaModelContext mmc) {
         super(mmc, FeatureType.PROPERTIES_ONLY);
-        this.jdoFacetContext = jdoFacetContext;
     }
 
     @Override
@@ -61,26 +59,16 @@ implements MetaModelRefiner {
             return;
         }
 
-
         if(String.class != processMethodContext.getMethod().getReturnType()) {
             return;
         }
-        val jdoColumnAnnotation = processMethodContext.synthesizeOnMethod(Column.class)
-                .orElse(null);
-
-        if (jdoColumnAnnotation==null) {
-            return;
-        }
-        if(jdoColumnAnnotation.length() == -1) {
-            return;
-        }
+        val jdoColumnIfAny = processMethodContext.synthesizeOnMethod(Column.class);
 
         val facetHolder = processMethodContext.getFacetHolder();
 
-        FacetUtil.addFacet(
-                new MaxLengthFacetDerivedFromJdoColumn(
-                        jdoColumnAnnotation.length(),
-                        facetHolder));
+        FacetUtil.addFacetIfPresent(
+                MaxTotalDigitsFacetInferredFromJdoColumn
+                .create(jdoColumnIfAny, facetHolder));
     }
 
     @Override
diff --git a/persistence/jdo/metamodel/src/main/java/org/apache/isis/persistence/jdo/metamodel/facets/prop/column/MaxLengthFacetDerivedFromJdoColumn.java b/persistence/jdo/metamodel/src/main/java/org/apache/isis/persistence/jdo/metamodel/facets/prop/column/MaxLengthFacetDerivedFromJdoColumn.java
index 71dc240..8f3c6ba 100644
--- a/persistence/jdo/metamodel/src/main/java/org/apache/isis/persistence/jdo/metamodel/facets/prop/column/MaxLengthFacetDerivedFromJdoColumn.java
+++ b/persistence/jdo/metamodel/src/main/java/org/apache/isis/persistence/jdo/metamodel/facets/prop/column/MaxLengthFacetDerivedFromJdoColumn.java
@@ -18,14 +18,31 @@
  */
 package org.apache.isis.persistence.jdo.metamodel.facets.prop.column;
 
+import java.util.Optional;
+
+import javax.jdo.annotations.Column;
+
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
+import org.apache.isis.core.metamodel.facets.objectvalue.maxlen.MaxLengthFacet;
 import org.apache.isis.core.metamodel.facets.objectvalue.maxlen.MaxLengthFacetAbstract;
 
+public class MaxLengthFacetDerivedFromJdoColumn
+extends MaxLengthFacetAbstract {
 
-public class MaxLengthFacetDerivedFromJdoColumn extends MaxLengthFacetAbstract {
+    public static Optional<MaxLengthFacet> create(
+            final Optional<Column> jdoColumnIfAny,
+            final FacetHolder holder) {
 
-    public MaxLengthFacetDerivedFromJdoColumn(final Integer length, final FacetHolder holder) {
-        super(length, holder);
+        return jdoColumnIfAny
+        .map(jdoColumn->
+            new MaxLengthFacetDerivedFromJdoColumn(
+                    jdoColumn.length(), holder));
     }
 
+    private MaxLengthFacetDerivedFromJdoColumn(
+            final int maxLength, final FacetHolder holder) {
+        super(maxLength, holder);
+    }
+
+
 }
diff --git a/persistence/jdo/metamodel/src/main/java/org/apache/isis/persistence/jdo/metamodel/facets/prop/column/BigDecimalFacetFallback.java b/persistence/jdo/metamodel/src/main/java/org/apache/isis/persistence/jdo/metamodel/facets/prop/column/MaxTotalDigitsFacetInferredFromJdoColumn.java
similarity index 52%
rename from persistence/jdo/metamodel/src/main/java/org/apache/isis/persistence/jdo/metamodel/facets/prop/column/BigDecimalFacetFallback.java
rename to persistence/jdo/metamodel/src/main/java/org/apache/isis/persistence/jdo/metamodel/facets/prop/column/MaxTotalDigitsFacetInferredFromJdoColumn.java
index 04fe0d9..bc6268c 100644
--- a/persistence/jdo/metamodel/src/main/java/org/apache/isis/persistence/jdo/metamodel/facets/prop/column/BigDecimalFacetFallback.java
+++ b/persistence/jdo/metamodel/src/main/java/org/apache/isis/persistence/jdo/metamodel/facets/prop/column/MaxTotalDigitsFacetInferredFromJdoColumn.java
@@ -18,18 +18,32 @@
  */
 package org.apache.isis.persistence.jdo.metamodel.facets.prop.column;
 
+import java.util.Optional;
+
+import javax.jdo.annotations.Column;
+
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
-import org.apache.isis.core.metamodel.facets.value.bigdecimal.BigDecimalValueFacetAbstract;
-import org.apache.isis.core.metamodel.facets.value.bigdecimal.BigDecimalValueSemanticsProvider;
+import org.apache.isis.core.metamodel.facets.objectvalue.maxlen.MaxTotalDigitsFacet;
+import org.apache.isis.core.metamodel.facets.objectvalue.maxlen.MaxTotalDigitsFacetAbstract;
+
+public class MaxTotalDigitsFacetInferredFromJdoColumn
+extends MaxTotalDigitsFacetAbstract {
 
-public class BigDecimalFacetFallback
-extends BigDecimalValueFacetAbstract {
+    public static Optional<MaxTotalDigitsFacet> create(
+            final Optional<Column> jdoColumnIfAny,
+            final FacetHolder holder) {
 
-    public BigDecimalFacetFallback(final FacetHolder holder) {
-        super(
-                BigDecimalValueSemanticsProvider.DEFAULT_LENGTH,
-                BigDecimalValueSemanticsProvider.DEFAULT_SCALE,
-                holder, Precedence.FALLBACK);
+        return jdoColumnIfAny
+        .filter(jdoColumn->jdoColumn.length()>=0)
+        .map(jdoColumn->
+            new MaxTotalDigitsFacetInferredFromJdoColumn(
+                    jdoColumn.length(), holder));
     }
 
+    private MaxTotalDigitsFacetInferredFromJdoColumn(
+            final int maxTotalDigits, final FacetHolder holder) {
+        super(maxTotalDigits, holder);
+    }
+
+
 }
diff --git a/persistence/jdo/metamodel/src/test/java/org/apache/isis/persistence/jdo/metamodel/facets/prop/column/BigDecimalDerivedFromJdoColumnAnnotationFacetFactoryTest.java b/persistence/jdo/metamodel/src/test/java/org/apache/isis/persistence/jdo/metamodel/facets/prop/column/BigDecimalDerivedFromJdoColumnAnnotationFacetFactoryTest.java
index 146fb7c..b2ccfcf 100644
--- a/persistence/jdo/metamodel/src/test/java/org/apache/isis/persistence/jdo/metamodel/facets/prop/column/BigDecimalDerivedFromJdoColumnAnnotationFacetFactoryTest.java
+++ b/persistence/jdo/metamodel/src/test/java/org/apache/isis/persistence/jdo/metamodel/facets/prop/column/BigDecimalDerivedFromJdoColumnAnnotationFacetFactoryTest.java
@@ -24,10 +24,11 @@ import static org.hamcrest.CoreMatchers.is;
 import static org.hamcrest.MatcherAssert.assertThat;
 
 import org.apache.isis.core.metamodel._testing.MetaModelContext_forTesting;
-import org.apache.isis.core.metamodel.facetapi.Facet;
 import org.apache.isis.core.metamodel.facetapi.FeatureType;
 import org.apache.isis.core.metamodel.facets.FacetFactory.ProcessMethodContext;
-import org.apache.isis.core.metamodel.facets.value.bigdecimal.BigDecimalValueFacet;
+import org.apache.isis.core.metamodel.facets.FacetedMethod;
+import org.apache.isis.core.metamodel.facets.objectvalue.maxlen.MaxFractionalDigitsFacet;
+import org.apache.isis.core.metamodel.facets.objectvalue.maxlen.MaxTotalDigitsFacet;
 import org.apache.isis.persistence.jdo.metamodel.testing.AbstractFacetFactoryTest;
 
 import lombok.val;
@@ -66,11 +67,7 @@ extends AbstractFacetFactoryTest {
         facetFactory.process(ProcessMethodContext
                 .forTesting(cls, null, method, methodRemover, facetedMethod));
 
-        final BigDecimalValueFacet facet = facetedMethod.getFacet(BigDecimalValueFacet.class);
-        assertNotNull(facet);
-        assertTrue(facet instanceof BigDecimalFacetInferredFromJdoColumn);
-        assertThat(facet.getPrecision(), is(12));
-        assertThat(facet.getScale(), is(3));
+        assertBigDecimalSemantics(facetedMethod, 12, 3);
     }
 
     public void testAnnotationDefaultsLengthIfMissing() throws Exception {
@@ -79,10 +76,7 @@ extends AbstractFacetFactoryTest {
         facetFactory.process(ProcessMethodContext
                 .forTesting(cls, null, method, methodRemover, facetedMethod));
 
-        final BigDecimalValueFacet facet = facetedMethod.getFacet(BigDecimalValueFacet.class);
-        assertNotNull(facet);
-        assertTrue(facet instanceof BigDecimalFacetInferredFromJdoColumn);
-        assertThat(facet.getPrecision(), is(18));
+        assertBigDecimalSemantics(facetedMethod, -1, 3);
     }
 
     public void testAnnotationDefaultsScaleIfMissing() throws Exception {
@@ -91,10 +85,7 @@ extends AbstractFacetFactoryTest {
         facetFactory.process(ProcessMethodContext
                 .forTesting(cls, null, method, methodRemover, facetedMethod));
 
-        final BigDecimalValueFacet facet = facetedMethod.getFacet(BigDecimalValueFacet.class);
-        assertNotNull(facet);
-        assertTrue(facet instanceof BigDecimalFacetInferredFromJdoColumn);
-        assertThat(facet.getScale(), is(2));
+        assertBigDecimalSemantics(facetedMethod, 12, -1);
     }
 
     public void testNoFacetIfPropertyTypeIsNotBigDecimal() throws Exception {
@@ -104,19 +95,30 @@ extends AbstractFacetFactoryTest {
         facetFactory.process(ProcessMethodContext
                 .forTesting(cls, null, method, methodRemover, facetedMethod));
 
-        final Facet facet = facetedMethod.getFacet(BigDecimalValueFacet.class);
-        assertNull(facet);
+        assertBigDecimalSemantics(facetedMethod, -1, -1);
     }
 
-    public void testFallbackFacetIfPropertyIsNotAnnotated() throws Exception {
-
-        final Class<?> cls = SimpleObjectWithBigDecimalColumnAnnotations.class;
-        final Method method = cls.getMethod("getBigDecimalPropertyWithoutColumnAnnotation");
-        facetFactory.process(ProcessMethodContext
-                .forTesting(cls, null, method, methodRemover, facetedMethod));
-
-        final Facet facet = facetedMethod.getFacet(BigDecimalValueFacet.class);
-        assertNotNull(facet);
-        assertTrue(facet instanceof BigDecimalFacetFallback);
+    // -- HELPER
+
+    private void assertBigDecimalSemantics(
+            final FacetedMethod facetedMethod, final int maxTotalDigits, final int maxFractionalDigits) {
+        if(maxTotalDigits>=0) {
+            final MaxTotalDigitsFacet facet = facetedMethod.getFacet(MaxTotalDigitsFacet.class);
+            assertNotNull(facet);
+            assertTrue(facet instanceof MaxTotalDigitsFacetInferredFromJdoColumn);
+            assertThat(facet.maxTotalDigits(), is(maxTotalDigits));
+        } else {
+            assertNull(facetedMethod.getFacet(MaxTotalDigitsFacet.class));
+        }
+
+        if(maxFractionalDigits>=0) {
+            final MaxFractionalDigitsFacet facet = facetedMethod.getFacet(MaxFractionalDigitsFacet.class);
+            assertNotNull(facet);
+            assertTrue(facet instanceof MaxFractionalDigitsFacetInferredFromJdoColumn);
+            assertThat(facet.maxFractionalDigits(), is(maxFractionalDigits));
+        } else {
+            assertNull(facetedMethod.getFacet(MaxFractionalDigitsFacet.class));
+        }
     }
+
 }
diff --git a/viewers/common/src/main/java/org/apache/isis/viewer/common/model/binding/BindingConverter.java b/viewers/common/src/main/java/org/apache/isis/viewer/common/model/binding/BindingConverter.java
index 0d00b86..b557314 100644
--- a/viewers/common/src/main/java/org/apache/isis/viewer/common/model/binding/BindingConverter.java
+++ b/viewers/common/src/main/java/org/apache/isis/viewer/common/model/binding/BindingConverter.java
@@ -34,20 +34,20 @@ public interface BindingConverter<T> {
 
     ObjectSpecification getValueSpecification();
 
-    default T unwrap(ManagedObject object) {
+    default T unwrap(final ManagedObject object) {
         return _Casts.uncheckedCast(ManagedObjects.UnwrapUtil.single(object));
     }
 
-    default ManagedObject wrap(T pojo) {
+    default ManagedObject wrap(final T pojo) {
         return ManagedObject.of(getValueSpecification(), pojo);
     }
 
-    default Optional<? extends Facet> lookupFacet(final @NonNull Class<? extends Facet> facetType) {
+    default <X extends Facet> Optional<X> lookupFacet(final @NonNull Class<X> facetType) {
         return Optional.ofNullable(getValueSpecification().getFacet(facetType));
     }
 
     default Optional<? extends Facet> lookupFacetOneOf(
-            @NonNull Can<Class<? extends Facet>> facetTypes) {
+            @NonNull final Can<Class<? extends Facet>> facetTypes) {
         return facetTypes.stream()
         .map(getValueSpecification()::getFacet)
         .filter(_NullSafe::isPresent)
diff --git a/viewers/common/src/main/java/org/apache/isis/viewer/common/model/binding/NumberConverterForStringComponent.java b/viewers/common/src/main/java/org/apache/isis/viewer/common/model/binding/NumberConverterForStringComponent.java
index 565667c..49fce46 100644
--- a/viewers/common/src/main/java/org/apache/isis/viewer/common/model/binding/NumberConverterForStringComponent.java
+++ b/viewers/common/src/main/java/org/apache/isis/viewer/common/model/binding/NumberConverterForStringComponent.java
@@ -20,38 +20,27 @@ package org.apache.isis.viewer.common.model.binding;
 
 import java.util.Optional;
 
-import org.apache.isis.commons.collections.Can;
 import org.apache.isis.commons.internal.exceptions._Exceptions;
-import org.apache.isis.core.metamodel.facetapi.Facet;
-import org.apache.isis.core.metamodel.facets.object.value.vsp.ValueSemanticsProviderAndFacetAbstract;
-import org.apache.isis.core.metamodel.facets.value.bigdecimal.BigDecimalValueFacet;
-import org.apache.isis.core.metamodel.facets.value.biginteger.BigIntegerValueFacet;
-import org.apache.isis.core.metamodel.facets.value.bytes.ByteValueFacet;
-import org.apache.isis.core.metamodel.facets.value.doubles.DoubleFloatingPointValueFacet;
-import org.apache.isis.core.metamodel.facets.value.floats.FloatingPointValueFacet;
-import org.apache.isis.core.metamodel.facets.value.integer.IntegerValueFacet;
-import org.apache.isis.core.metamodel.facets.value.longs.LongValueFacet;
-import org.apache.isis.core.metamodel.facets.value.shortint.ShortValueFacet;
+import org.apache.isis.core.metamodel.facets.object.parseable.ParseableFacet;
 import org.apache.isis.core.metamodel.spec.ManagedObject;
-import org.apache.isis.core.metamodel.spec.ManagedObjects;
 import org.apache.isis.core.metamodel.spec.ObjectSpecification;
 
 import lombok.Getter;
 import lombok.val;
 
-public final class NumberConverterForStringComponent implements BindingConverter<String> {
+public final class NumberConverterForStringComponent
+implements BindingConverter<String> {
 
     @Getter(onMethod_ = {@Override})
     private final ObjectSpecification valueSpecification;
-    private final ValueSemanticsProviderAndFacetAbstract<? extends Number> valueFacet;
+    private final ParseableFacet parsableFacet;
 
     @SuppressWarnings("unchecked")
     public NumberConverterForStringComponent(final ObjectSpecification valueSpecification) {
         this.valueSpecification = valueSpecification;
 
-        this.valueFacet = lookupFacetOneOf(getSupportedFacets())
-                .map(ValueSemanticsProviderAndFacetAbstract.class::cast)
-                .orElseThrow(()->_Exceptions.noSuchElement("missing 'number' value facet"));
+        this.parsableFacet = lookupFacet(ParseableFacet.class)
+                .orElseThrow(()->_Exceptions.noSuchElement("missing 'ParseableFacet'"));
     }
 
     @Override
@@ -62,29 +51,17 @@ public final class NumberConverterForStringComponent implements BindingConverter
             return ManagedObject.empty(getValueSpecification());
         }
 
-        val number = valueFacet.parseTextRepresentation(null, stringifiedNumber);
+        val number = //parsableFacet.parseTextRepresentation(null, stringifiedNumber);
+                0;
         return ManagedObject.of(getValueSpecification(), number);
     }
 
     @Override
     public String unwrap(final ManagedObject object) {
-        val number = (Number) ManagedObjects.UnwrapUtil.single(object);
-        return valueFacet.parseableTextRepresentation(null, number);
+        //val number = (Number) ManagedObjects.UnwrapUtil.single(object);
+        return "0";//parsableFacet.parseableTextRepresentation(null, number);
     }
 
-
-    // for performance reasons in order of likelihood (just guessing)
-    @Getter
-    private final static Can<Class<? extends Facet>> supportedFacets = Can.of(
-            IntegerValueFacet.class,
-            DoubleFloatingPointValueFacet.class,
-            ByteValueFacet.class,
-            LongValueFacet.class,
-            BigIntegerValueFacet.class,
-            BigDecimalValueFacet.class,
-            ShortValueFacet.class,
-            FloatingPointValueFacet.class);
-
     @Override
     public String toString(final String value) {
         return value; // identity
@@ -97,8 +74,9 @@ public final class NumberConverterForStringComponent implements BindingConverter
 
     @Override
     public Optional<String> tryParse(final String stringifiedValue) {
-        return valueFacet.tryParseTextEntry(null, stringifiedValue)
-                .map(Exception::getMessage); // TODO should be passed through the ExceptionRecognizer
+        return Optional.empty();
+//                parsableFacet.tryParseTextEntry(null, stringifiedValue)
+//                .map(Exception::getMessage); // TODO should be passed through the ExceptionRecognizer
     }
 
 }
\ No newline at end of file
diff --git a/viewers/common/src/main/java/org/apache/isis/viewer/common/model/feature/ScalarUiModel.java b/viewers/common/src/main/java/org/apache/isis/viewer/common/model/feature/ScalarUiModel.java
index 807d126..012ad9c 100644
--- a/viewers/common/src/main/java/org/apache/isis/viewer/common/model/feature/ScalarUiModel.java
+++ b/viewers/common/src/main/java/org/apache/isis/viewer/common/model/feature/ScalarUiModel.java
@@ -23,8 +23,9 @@ import java.math.BigDecimal;
 import org.apache.isis.commons.collections.Can;
 import org.apache.isis.core.metamodel.facetapi.FeatureType;
 import org.apache.isis.core.metamodel.facets.objectvalue.fileaccept.FileAcceptFacet;
+import org.apache.isis.core.metamodel.facets.objectvalue.maxlen.MaxFractionalDigitsFacet;
+import org.apache.isis.core.metamodel.facets.objectvalue.maxlen.MaxTotalDigitsFacet;
 import org.apache.isis.core.metamodel.facets.objectvalue.typicallen.TypicalLengthFacet;
-import org.apache.isis.core.metamodel.facets.value.bigdecimal.BigDecimalValueFacet;
 import org.apache.isis.core.metamodel.facets.value.string.StringValueSemanticsProvider;
 import org.apache.isis.core.metamodel.spec.ManagedObject;
 import org.apache.isis.core.metamodel.spec.feature.ObjectFeature;
@@ -56,8 +57,9 @@ public interface ScalarUiModel {
      * @see #getLength()
      */
     default Integer getLength() {
-        final BigDecimalValueFacet facet = getMetaModel().getFacet(BigDecimalValueFacet.class);
-        return facet != null? facet.getPrecision(): null;
+        return getMetaModel().lookupFacet(MaxTotalDigitsFacet.class)
+                .map(MaxTotalDigitsFacet::maxTotalDigits)
+                .orElse(null);
     }
 
     /**
@@ -66,8 +68,9 @@ public interface ScalarUiModel {
      * @see #getScale()
      */
     default Integer getScale() {
-        final BigDecimalValueFacet facet = getMetaModel().getFacet(BigDecimalValueFacet.class);
-        return facet != null? facet.getScale(): null;
+        return getMetaModel().lookupFacet(MaxFractionalDigitsFacet.class)
+                .map(MaxFractionalDigitsFacet::maxFractionalDigits)
+                .orElse(null);
     }
 
     default int getTypicalLength() {
diff --git a/viewers/restfulobjects/rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/domainobjects/JsonValueEncoder.java b/viewers/restfulobjects/rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/domainobjects/JsonValueEncoder.java
index 6444fd8..707c8e2 100644
--- a/viewers/restfulobjects/rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/domainobjects/JsonValueEncoder.java
+++ b/viewers/restfulobjects/rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/domainobjects/JsonValueEncoder.java
@@ -190,10 +190,6 @@ public class JsonValueEncoder {
         return adapter != null? adapter.getPojo(): NullNode.getInstance();
     }
 
-//    ManagedObject adapterFor(Object pojo) {
-//        return objectAdapterProvider.adapterFor(pojo);
-//    }
-
     // -- NESTED TYPE DECLARATIONS
 
     public static class ExpectedStringRepresentingValueException extends IllegalArgumentException {
diff --git a/viewers/restfulobjects/rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/domainobjects/ObjectAndActionInvocation.java b/viewers/restfulobjects/rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/domainobjects/ObjectAndActionInvocation.java
index 99de803..897bcf8 100644
--- a/viewers/restfulobjects/rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/domainobjects/ObjectAndActionInvocation.java
+++ b/viewers/restfulobjects/rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/domainobjects/ObjectAndActionInvocation.java
@@ -41,9 +41,9 @@ import lombok.val;
 public class ObjectAndActionInvocation {
 
     public static ObjectAndActionInvocation of(
-            @NonNull ActionInteraction.Result actionInteractionResult,
-            @NonNull JsonRepresentation argsJsonRepr,
-            @NonNull ActionResultReprRenderer.SelfLink selfLink) {
+            @NonNull final ActionInteraction.Result actionInteractionResult,
+            @NonNull final JsonRepresentation argsJsonRepr,
+            @NonNull final ActionResultReprRenderer.SelfLink selfLink) {
         return new ObjectAndActionInvocation(
                 actionInteractionResult.getManagedAction().getOwner(),
                 actionInteractionResult.getManagedAction().getAction(),
@@ -72,7 +72,12 @@ public class ObjectAndActionInvocation {
             return ActionResultRepresentation.ResultType.VOID;
         }
 
-        if (isVector(returnedAdapter.getSpecification())) {
+        //FIXME following decision tree should not depend on the returned runtime types
+        // but on the returnTypeSpec,
+        // which is introspected eagerly on application start and should be the binding contract
+        val actualReturnTypeSpec = returnedAdapter.getSpecification();
+
+        if (isVector(actualReturnTypeSpec)) {
 
             // though not strictly required, try to be consistent:  empty list vs populated list
             if(elementAdapters.get().isEmpty()) {
@@ -93,7 +98,7 @@ public class ObjectAndActionInvocation {
                     : ActionResultRepresentation.ResultType.SCALAR_VALUES;
         }
 
-        if (isScalarValue(returnedAdapter.getSpecification())) {
+        if (isScalarValue(actualReturnTypeSpec)) {
             return ActionResultRepresentation.ResultType.SCALAR_VALUE;
         }
 
@@ -126,11 +131,11 @@ public class ObjectAndActionInvocation {
 
     //TODO[2449] need to check whether that strategy holds consistently
     private static boolean isScalarValue(final @NonNull ObjectSpecification spec) {
-        return spec.getFacet(EncodableFacet.class)!=null;
+        return spec.containsFacet(EncodableFacet.class);
     }
 
     private static boolean isVector(final @NonNull ObjectSpecification spec) {
-        return spec.getFacet(CollectionFacet.class)!=null;
+        return spec.containsFacet(CollectionFacet.class);
     }
 
 
diff --git a/viewers/restfulobjects/rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/domainobjects/ObjectPropertyReprRenderer.java b/viewers/restfulobjects/rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/domainobjects/ObjectPropertyReprRenderer.java
index eaa2589..e1f6fa6 100644
--- a/viewers/restfulobjects/rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/domainobjects/ObjectPropertyReprRenderer.java
+++ b/viewers/restfulobjects/rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/domainobjects/ObjectPropertyReprRenderer.java
@@ -20,17 +20,19 @@ package org.apache.isis.viewer.restfulobjects.rendering.domainobjects;
 
 import java.util.List;
 import java.util.Objects;
+import java.util.Optional;
 
 import com.fasterxml.jackson.databind.node.NullNode;
 
 import org.apache.isis.applib.annotation.Where;
+import org.apache.isis.commons.collections.Can;
 import org.apache.isis.commons.internal.collections._Lists;
 import org.apache.isis.core.metamodel.facetapi.Facet;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
 import org.apache.isis.core.metamodel.facets.collections.collection.defaultview.DefaultViewFacet;
 import org.apache.isis.core.metamodel.facets.object.value.ValueFacet;
-import org.apache.isis.core.metamodel.facets.value.bigdecimal.BigDecimalValueFacet;
-import org.apache.isis.core.metamodel.facets.value.biginteger.BigIntegerValueFacet;
+import org.apache.isis.core.metamodel.facets.objectvalue.maxlen.MaxFractionalDigitsFacet;
+import org.apache.isis.core.metamodel.facets.objectvalue.maxlen.MaxTotalDigitsFacet;
 import org.apache.isis.core.metamodel.interactions.managed.ManagedProperty;
 import org.apache.isis.core.metamodel.spec.feature.OneToOneAssociation;
 import org.apache.isis.viewer.restfulobjects.applib.JsonRepresentation;
@@ -85,7 +87,7 @@ extends AbstractObjectMemberReprRenderer<OneToOneAssociation> {
     private Object addValue(final LinkFollowSpecs linkFollower) {
         val valueAdapterIfAny = objectMember.get(objectAdapter, getInteractionInitiatedBy());
 
-        // use the runtime type if we have a value, else the compile time type of the member otherwise
+        // use the runtime type if we have a value, otherwise the compile time type of the member
         val spec = valueAdapterIfAny != null
                 ? valueAdapterIfAny.getSpecification()
                 : objectMember.getSpecification();
@@ -93,27 +95,27 @@ extends AbstractObjectMemberReprRenderer<OneToOneAssociation> {
         val valueFacet = spec.getFacet(ValueFacet.class);
         if (valueFacet != null) {
             String format = null;
-            final Class<?> specClass = spec.getCorrespondingClass();
-            if(specClass == java.math.BigDecimal.class) {
+            final Class<?> valueType = spec.getCorrespondingClass();
+            if(valueType == java.math.BigDecimal.class) {
                 // look for facet on member, else on the value's spec
-                final BigDecimalValueFacet bigDecimalValueFacet =
-                        getFacet(BigDecimalValueFacet.class,
-                                objectMember,
-                                valueAdapterIfAny != null? valueAdapterIfAny.getSpecification(): null);
-                if(bigDecimalValueFacet != null) {
-                    final Integer precision = bigDecimalValueFacet.getPrecision();
-                    final Integer scale = bigDecimalValueFacet.getScale();
-                    format = String.format("big-decimal(%d,%d)", precision, scale);
-                }
-            } else if(specClass == java.math.BigInteger.class) {
+
+                final var facetHolders = Can.<FacetHolder>of(
+                        objectMember,
+                        valueAdapterIfAny != null ? valueAdapterIfAny.getSpecification() : null);
+
+                final int totalDigits = lookupFacet(MaxTotalDigitsFacet.class, facetHolders)
+                        .map(MaxTotalDigitsFacet::maxTotalDigits)
+                        .orElse(-1);
+
+                final int scale = lookupFacet(MaxFractionalDigitsFacet.class, facetHolders)
+                        .map(MaxFractionalDigitsFacet::maxFractionalDigits)
+                        .orElse(-1);
+
+                format = String.format("big-decimal(%d,%d)", totalDigits, scale);
+
+            } else if(valueType == java.math.BigInteger.class) {
                 // look for facet on member, else on the value's spec
-                final BigIntegerValueFacet bigIntegerValueFacet =
-                        getFacet(BigIntegerValueFacet.class,
-                                objectMember,
-                                valueAdapterIfAny != null? valueAdapterIfAny.getSpecification(): null);
-                if(bigIntegerValueFacet != null) {
-                    format = String.format("big-integer");
-                }
+                format = String.format("big-integer");
             }
             return jsonValueEncoder.appendValueAndFormat(valueAdapterIfAny, spec, representation, format, resourceContext.suppressMemberExtensions());
         }
@@ -157,17 +159,16 @@ extends AbstractObjectMemberReprRenderer<OneToOneAssociation> {
                 && Objects.equals(defaultViewFacet.value(), "table");
     }
 
-    private static <T extends Facet> T getFacet(final Class<T> facetType, final FacetHolder... holders) {
+    private static <T extends Facet> Optional<T> lookupFacet(
+            final Class<T> facetType,
+            final Can<FacetHolder> holders) {
         for (FacetHolder holder : holders) {
-            if(holder == null) {
-                continue;
-            }
             final T facet = holder.getFacet(facetType);
             if(facet != null) {
-                return facet;
+                return Optional.of(facet);
             }
         }
-        return null;
+        return Optional.empty();
     }
 
 
diff --git a/viewers/restfulobjects/rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/domainobjects/ScalarValueReprRenderer.java b/viewers/restfulobjects/rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/domainobjects/ScalarValueReprRenderer.java
index 8289f37..730db31 100644
--- a/viewers/restfulobjects/rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/domainobjects/ScalarValueReprRenderer.java
+++ b/viewers/restfulobjects/rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/domainobjects/ScalarValueReprRenderer.java
@@ -39,7 +39,8 @@ extends ReprRendererAbstract<ManagedObject> {
             final IResourceContext resourceContext,
             final LinkFollowSpecs linkFollower,
             final JsonRepresentation representation) {
-        super(resourceContext, linkFollower, null, representation); // null for representationType (there is none)
+        // null for representationType (there is none)
+        super(resourceContext, linkFollower, null, representation);
     }
 
     /**
diff --git a/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/collectioncontents/summary/CollectionContentsAsSummaryFactory.java b/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/collectioncontents/summary/CollectionContentsAsSummaryFactory.java
index d95bcb9..afce4a5 100644
--- a/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/collectioncontents/summary/CollectionContentsAsSummaryFactory.java
+++ b/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/collectioncontents/summary/CollectionContentsAsSummaryFactory.java
@@ -18,6 +18,7 @@
  */
 package org.apache.isis.viewer.wicket.ui.components.collectioncontents.summary;
 
+import java.math.BigDecimal;
 import java.util.function.Predicate;
 import java.util.stream.Stream;
 
@@ -27,7 +28,6 @@ import org.apache.wicket.model.Model;
 import org.apache.wicket.model.ResourceModel;
 import org.apache.wicket.request.resource.CssResourceReference;
 
-import org.apache.isis.core.metamodel.facets.value.bigdecimal.BigDecimalValueFacet;
 import org.apache.isis.core.metamodel.spec.ObjectSpecification;
 import org.apache.isis.core.metamodel.spec.feature.MixedIn;
 import org.apache.isis.core.metamodel.spec.feature.ObjectAssociation;
@@ -40,15 +40,18 @@ import org.apache.isis.viewer.wicket.ui.ComponentFactoryAbstract;
 /**
  * {@link ComponentFactory} for {@link CollectionContentsAsSummary}.
  */
-public class CollectionContentsAsSummaryFactory extends ComponentFactoryAbstract implements CollectionContentsAsFactory {
+public class CollectionContentsAsSummaryFactory
+extends ComponentFactoryAbstract
+implements CollectionContentsAsFactory {
 
     private static final long serialVersionUID = 1L;
 
     private static final String NAME = "summary";
 
     static final Predicate<ObjectAssociation> OF_TYPE_BIGDECIMAL = (final ObjectAssociation objectAssoc) -> {
-        final ObjectSpecification objectSpec = objectAssoc.getSpecification();
-        return objectSpec.containsNonFallbackFacet(BigDecimalValueFacet.class);
+        final var objectSpec = objectAssoc.getSpecification();
+        return objectSpec.isValue()
+                && objectSpec.getCorrespondingClass().equals(BigDecimal.class);
     };
 
     // //////////////////////////////////////
diff --git a/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/IsisConverterLocator.java b/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/IsisConverterLocator.java
index bc1e2e6..969b07d 100644
--- a/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/IsisConverterLocator.java
+++ b/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/IsisConverterLocator.java
@@ -25,8 +25,8 @@ import org.apache.wicket.util.convert.converter.BigIntegerConverter;
 
 import org.apache.isis.commons.internal.base._Casts;
 import org.apache.isis.commons.internal.base._NullSafe;
+import org.apache.isis.core.metamodel.facets.objectvalue.maxlen.MaxFractionalDigitsFacet;
 import org.apache.isis.core.metamodel.facets.objectvalue.renderedadjusted.RenderedAdjustedFacet;
-import org.apache.isis.core.metamodel.facets.value.bigdecimal.BigDecimalValueFacet;
 import org.apache.isis.core.metamodel.spec.ManagedObject;
 import org.apache.isis.viewer.wicket.model.isis.WicketViewerSettings;
 import org.apache.isis.viewer.wicket.ui.components.scalars.jdkdates.DateConverterForJavaSqlDate;
@@ -108,11 +108,10 @@ public class IsisConverterLocator {
             return _Casts.uncheckedCast(new BigIntegerConverter());
         }
         if (java.math.BigDecimal.class == correspondingClass) {
-            final BigDecimalValueFacet facet = objectSpecification.getFacet(BigDecimalValueFacet.class);
-            Integer scale = null;
-            if (facet != null) {
-                scale = facet.getScale();
-            }
+            final int scale = objectSpecification
+                .lookupFacet(MaxFractionalDigitsFacet.class)
+                .map(MaxFractionalDigitsFacet::maxFractionalDigits)
+                .orElse(-1);
             return _Casts.uncheckedCast(new BigDecimalConverterWithScale(scale).forViewMode());
         }
 
diff --git a/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/jdkmath/BigDecimalConverterWithScale.java b/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/jdkmath/BigDecimalConverterWithScale.java
index 6356739..9d4e8c1 100644
--- a/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/jdkmath/BigDecimalConverterWithScale.java
+++ b/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/jdkmath/BigDecimalConverterWithScale.java
@@ -43,7 +43,7 @@ public class BigDecimalConverterWithScale extends BigDecimalConverter {
     /**
      * For {@link JavaMathBigDecimalPanelFactory} to call, so that there is a single instance.
      */
-    static AbstractNumberConverter<BigDecimal> newThreadSafeConverter(Integer scale) {
+    static AbstractNumberConverter<BigDecimal> newThreadSafeConverter(final Integer scale) {
         return new BigDecimalConverterWithScale(scale);
     }
 
@@ -51,14 +51,17 @@ public class BigDecimalConverterWithScale extends BigDecimalConverter {
     private final Integer scale;
 
     public BigDecimalConverterWithScale(final Integer scale) {
-        this.scale = scale;
+        this.scale = scale!=null
+                && scale>=0
+                ? scale
+                : null;
     }
 
     /**
      * Disables thousands separator grouping.
      */
     @Override
-    protected NumberFormat newNumberFormat(Locale locale) {
+    protected NumberFormat newNumberFormat(final Locale locale) {
         NumberFormat numberFormat = NumberFormat.getInstance(locale);
         numberFormat.setGroupingUsed(false);
         return numberFormat;
@@ -80,7 +83,7 @@ public class BigDecimalConverterWithScale extends BigDecimalConverter {
     }
 
     @Override
-    public BigDecimal convertToObject(String valueStr, Locale locale) throws ConversionException {
+    public BigDecimal convertToObject(final String valueStr, final Locale locale) throws ConversionException {
 
         DecimalFormat numberFormat = (DecimalFormat) getNumberFormat(locale);
         char groupingSeparator = numberFormat.getDecimalFormatSymbols().getGroupingSeparator();
@@ -120,7 +123,7 @@ public class BigDecimalConverterWithScale extends BigDecimalConverter {
         return new BigDecimalConverterWithScale(this.scale){
             private static final long serialVersionUID = 1L;
             @Override
-            public String convertToString(BigDecimal value, Locale locale) {
+            public String convertToString(final BigDecimal value, final Locale locale) {
                 NumberFormat fmt = BigDecimalConverterWithScale.this.getNumberFormat(locale);
                 fmt.setGroupingUsed(true);// re-enable for view mode
                 return fmt.format(value);
diff --git a/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/pages/entity/EntityPage.java b/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/pages/entity/EntityPage.java
index 12c47c1..433c0f8 100644
--- a/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/pages/entity/EntityPage.java
+++ b/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/pages/entity/EntityPage.java
@@ -69,8 +69,8 @@ public class EntityPage extends PageAbstract {
      * Specifically handled by <code>IsisWicketApplication#newPageFactory()</code>
      */
     public static EntityPage bookmarked(
-            IsisAppCommonContext commonContext,
-            PageParameters pageParameters) {
+            final IsisAppCommonContext commonContext,
+            final PageParameters pageParameters) {
 
         val entityModel = createEntityModel(commonContext, pageParameters);
         return new EntityPage(pageParameters, entityModel);
@@ -84,8 +84,8 @@ public class EntityPage extends PageAbstract {
      * @return An EntityModel for the requested OID
      */
     private static EntityModel createEntityModel(
-            IsisAppCommonContext commonContext,
-            PageParameters parameters) {
+            final IsisAppCommonContext commonContext,
+            final PageParameters parameters) {
 
         String oid = EntityModel.oidStr(parameters);
         if (Strings.isEmpty(oid)) {
@@ -102,15 +102,15 @@ public class EntityPage extends PageAbstract {
      * Ensures that any exception that might have occurred already (eg from an action invocation) is shown.
      */
     public EntityPage(
-            IsisAppCommonContext commonContext,
-            ManagedObject adapter) {
+            final IsisAppCommonContext commonContext,
+            final ManagedObject adapter) {
 
         this(PageParametersUtils.newPageParameters(), newEntityModel(commonContext, adapter));
     }
 
     private static EntityModel newEntityModel(
-            IsisAppCommonContext commonContext,
-            ManagedObject adapter) {
+            final IsisAppCommonContext commonContext,
+            final ManagedObject adapter) {
 
         val entityModel = EntityModel.ofAdapter(commonContext, adapter);
         return entityModel;
@@ -133,6 +133,7 @@ public class EntityPage extends PageAbstract {
         if(!isShowBreadcrumbs()) {
             return;
         }
+
         final BreadcrumbModelProvider session = (BreadcrumbModelProvider) getSession();
         final BreadcrumbModel breadcrumbModel = session.getBreadcrumbModel();
         breadcrumbModel.visited(entityModel);
@@ -145,7 +146,7 @@ public class EntityPage extends PageAbstract {
     }
 
     @Override
-    public void renderHead(IHeaderResponse response) {
+    public void renderHead(final IHeaderResponse response) {
         super.renderHead(response);
         response.render(CssHeaderItem.forReference(WHERE_AM_I_CSS));
     }
@@ -214,8 +215,8 @@ public class EntityPage extends PageAbstract {
     }
 
     protected void addWhereAmIIfShown(
-            WebMarkupContainer entityPageContainer,
-            WhereAmIHelper whereAmIModel) {
+            final WebMarkupContainer entityPageContainer,
+            final WhereAmIHelper whereAmIModel) {
 
         val whereAmIContainer = new WebMarkupContainer("whereAmI-container");
         entityPageContainer.addOrReplace(whereAmIContainer);