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/11/18 08:50:29 UTC

[isis] branch master updated: ISIS-2882: wire up value-semantics for Character- and UUID scalar-panels

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 6a6d799  ISIS-2882: wire up value-semantics for Character- and UUID scalar-panels
6a6d799 is described below

commit 6a6d79991e09bc2f4a8b0415e34e5b2cca0c67a3
Author: Andi Huber <ah...@apache.org>
AuthorDate: Thu Nov 18 09:50:17 2021 +0100

    ISIS-2882: wire up value-semantics for Character- and UUID scalar-panels
---
 .../metamodel/commons/ScalarRepresentation.java    |   2 +-
 .../valuesemantics/UUIDValueSemantics.java         |   5 +-
 .../model/converter/CharacterConverterWkt.java}    |  22 ++---
 .../wicket/model/converter/UuidConverterWkt.java}  |  26 +++---
 .../scalars/ScalarPanelTextFieldAbstract.java      |  95 +++++++-------------
 .../ScalarPanelTextFieldDatePickerAbstract.java    |  17 +++-
 .../scalars/ScalarPanelTextFieldNumeric.java       |  24 +----
 .../ScalarPanelTextFieldParseableAbstract.java     |  38 ++++----
 .../components/scalars/bookmark/BookmarkPanel.java |   1 -
 .../scalars/jdk8time/Jdk8LocalDatePanel.java       |   3 +-
 .../scalars/jdk8time/Jdk8LocalDateTimePanel.java   |  13 +--
 .../scalars/jdk8time/Jdk8OffsetDateTimePanel.java  |  10 ---
 .../scalars/jdkdates/JavaSqlDatePanel.java         |   3 +-
 .../scalars/jdkdates/JavaSqlTimestampPanel.java    |   3 +-
 .../scalars/jdkmath/JavaMathBigDecimalPanel.java   |   8 --
 .../scalars/jdkmath/JavaMathBigIntegerPanel.java   |   8 --
 .../scalars/jodatime/JodaDateTimePanel.java        |  12 +--
 .../scalars/jodatime/JodaLocalDatePanel.java       |   3 +-
 .../scalars/jodatime/JodaLocalDateTimePanel.java   |  13 +--
 .../scalars/jodatime/JodaLocalTimePanel.java       |  17 +++-
 .../scalars/passwd/IsisPasswordPanel.java          |  11 ++-
 .../ui/components/scalars/primitive/BytePanel.java |   8 --
 .../scalars/primitive/CharacterPanel.java          |  17 ++--
 .../components/scalars/primitive/DoublePanel.java  |  11 +--
 .../components/scalars/primitive/FloatPanel.java   |   8 --
 .../components/scalars/primitive/IntegerPanel.java |   8 --
 .../ui/components/scalars/primitive/LongPanel.java |  11 +--
 .../components/scalars/primitive/ShortPanel.java   |  11 +--
 .../scalars/string/MultiLineStringPanel.java       |   2 +-
 .../ui/components/scalars/uuid/UuidConverter.java  |  63 -------------
 .../ui/components/scalars/uuid/UuidPanel.java      |  25 +++---
 .../ui/components/scalars/uuid/UuidTextField.java  |  56 ------------
 .../scalars/value/compound/ValueCompoundPanel.java |   2 +-
 .../org/apache/isis/viewer/wicket/ui/util/Wkt.java |  60 +++++++++----
 .../scalars/uuid/UuidConverterTest_roundtrip.java  | 100 +++++++++++++++------
 35 files changed, 281 insertions(+), 435 deletions(-)

diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/commons/ScalarRepresentation.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/commons/ScalarRepresentation.java
index d24fa3b..b4a5d4b 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/commons/ScalarRepresentation.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/commons/ScalarRepresentation.java
@@ -30,7 +30,7 @@ public enum ScalarRepresentation {
      * Editing (text-parsing) mode, corresponds to 'regular' UI components.
      * <p>
      * In case of value-types, indicates that for value-type to {@link String} conversion,
-     * a {@link Parser} is required.
+     * and vice versa, a {@link Parser} is required.
      */
     EDITING,
 
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/valuesemantics/UUIDValueSemantics.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/valuesemantics/UUIDValueSemantics.java
index ee2dbeb..2f24f0a 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/valuesemantics/UUIDValueSemantics.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/valuesemantics/UUIDValueSemantics.java
@@ -24,10 +24,10 @@ import javax.inject.Named;
 
 import org.springframework.stereotype.Component;
 
-import org.apache.isis.applib.adapters.ValueSemanticsAbstract;
 import org.apache.isis.applib.adapters.EncoderDecoder;
 import org.apache.isis.applib.adapters.Parser;
 import org.apache.isis.applib.adapters.Renderer;
+import org.apache.isis.applib.adapters.ValueSemanticsAbstract;
 import org.apache.isis.applib.adapters.ValueSemanticsProvider;
 import org.apache.isis.commons.internal.base._Strings;
 import org.apache.isis.schema.common.v2.ValueType;
@@ -97,4 +97,7 @@ implements
         return 36;
     }
 
+    //    private static final Pattern pattern = Pattern.compile(
+    //            "[0-9a-fA-F]{8}(?:-[0-9a-fA-F]{4}){3}-[0-9a-fA-F]{12}");
+
 }
diff --git a/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/bookmark/BookmarkPanel.java b/viewers/wicket/model/src/main/java/org/apache/isis/viewer/wicket/model/converter/CharacterConverterWkt.java
similarity index 62%
copy from viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/bookmark/BookmarkPanel.java
copy to viewers/wicket/model/src/main/java/org/apache/isis/viewer/wicket/model/converter/CharacterConverterWkt.java
index 37dbef6..12332da 100644
--- a/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/bookmark/BookmarkPanel.java
+++ b/viewers/wicket/model/src/main/java/org/apache/isis/viewer/wicket/model/converter/CharacterConverterWkt.java
@@ -16,22 +16,22 @@
  *  specific language governing permissions and limitations
  *  under the License.
  */
-package org.apache.isis.viewer.wicket.ui.components.scalars.bookmark;
+package org.apache.isis.viewer.wicket.model.converter;
 
-import org.apache.isis.applib.services.bookmark.Bookmark;
-import org.apache.isis.viewer.wicket.model.models.ScalarModel;
-import org.apache.isis.viewer.wicket.ui.components.scalars.ScalarPanelTextFieldParseableAbstract;
+import org.apache.isis.core.metamodel.commons.ScalarRepresentation;
+import org.apache.isis.core.metamodel.spec.feature.ObjectFeature;
 
-/**
- * Panel for rendering scalars of type {@link Bookmark}.
- */
-public class BookmarkPanel extends ScalarPanelTextFieldParseableAbstract {
+import lombok.NonNull;
 
-    private static final long serialVersionUID = 1L;
+public class CharacterConverterWkt
+extends ConverterBasedOnValueSemantics<Character> {
 
+    private static final long serialVersionUID = 1L;
 
-    public BookmarkPanel(final String id, final ScalarModel scalarModel) {
-        super(id, scalarModel);
+    public CharacterConverterWkt(
+            final @NonNull ObjectFeature objFeature,
+            final @NonNull ScalarRepresentation scalarRepresentation) {
+        super(objFeature, scalarRepresentation);
     }
 
 }
diff --git a/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/bookmark/BookmarkPanel.java b/viewers/wicket/model/src/main/java/org/apache/isis/viewer/wicket/model/converter/UuidConverterWkt.java
similarity index 62%
copy from viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/bookmark/BookmarkPanel.java
copy to viewers/wicket/model/src/main/java/org/apache/isis/viewer/wicket/model/converter/UuidConverterWkt.java
index 37dbef6..2186fc7 100644
--- a/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/bookmark/BookmarkPanel.java
+++ b/viewers/wicket/model/src/main/java/org/apache/isis/viewer/wicket/model/converter/UuidConverterWkt.java
@@ -16,22 +16,24 @@
  *  specific language governing permissions and limitations
  *  under the License.
  */
-package org.apache.isis.viewer.wicket.ui.components.scalars.bookmark;
+package org.apache.isis.viewer.wicket.model.converter;
 
-import org.apache.isis.applib.services.bookmark.Bookmark;
-import org.apache.isis.viewer.wicket.model.models.ScalarModel;
-import org.apache.isis.viewer.wicket.ui.components.scalars.ScalarPanelTextFieldParseableAbstract;
+import java.util.UUID;
 
-/**
- * Panel for rendering scalars of type {@link Bookmark}.
- */
-public class BookmarkPanel extends ScalarPanelTextFieldParseableAbstract {
+import org.apache.isis.core.metamodel.commons.ScalarRepresentation;
+import org.apache.isis.core.metamodel.spec.feature.ObjectFeature;
 
-    private static final long serialVersionUID = 1L;
+import lombok.NonNull;
 
+public class UuidConverterWkt
+extends ConverterBasedOnValueSemantics<UUID> {
+
+    private static final long serialVersionUID = 1L;
 
-    public BookmarkPanel(final String id, final ScalarModel scalarModel) {
-        super(id, scalarModel);
+    public UuidConverterWkt(
+            final @NonNull ObjectFeature objFeature,
+            final @NonNull ScalarRepresentation scalarRepresentation) {
+        super(objFeature, scalarRepresentation);
     }
 
-}
+}
\ No newline at end of file
diff --git a/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/ScalarPanelTextFieldAbstract.java b/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/ScalarPanelTextFieldAbstract.java
index 3cfc9d0..80f85fb 100644
--- a/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/ScalarPanelTextFieldAbstract.java
+++ b/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/ScalarPanelTextFieldAbstract.java
@@ -25,11 +25,8 @@ import org.apache.wicket.AttributeModifier;
 import org.apache.wicket.Component;
 import org.apache.wicket.MarkupContainer;
 import org.apache.wicket.ajax.AjaxRequestTarget;
-import org.apache.wicket.behavior.Behavior;
-import org.apache.wicket.markup.ComponentTag;
 import org.apache.wicket.markup.html.basic.Label;
 import org.apache.wicket.markup.html.form.AbstractTextComponent;
-import org.apache.wicket.markup.html.form.TextField;
 import org.apache.wicket.markup.html.panel.Fragment;
 import org.apache.wicket.model.IModel;
 import org.apache.wicket.model.Model;
@@ -39,11 +36,13 @@ import org.apache.wicket.validation.IValidator;
 import org.apache.wicket.validation.ValidationError;
 
 import org.apache.isis.commons.internal.base._Casts;
+import org.apache.isis.core.metamodel.commons.ScalarRepresentation;
 import org.apache.isis.core.metamodel.facets.objectvalue.maxlen.MaxLengthFacet;
 import org.apache.isis.core.metamodel.facets.objectvalue.typicallen.TypicalLengthFacet;
 import org.apache.isis.core.metamodel.objectmanager.ObjectManager;
 import org.apache.isis.core.metamodel.spec.ManagedObject;
 import org.apache.isis.core.metamodel.spec.ManagedObjects;
+import org.apache.isis.core.metamodel.spec.feature.ObjectFeature;
 import org.apache.isis.core.runtime.context.IsisAppCommonContext;
 import org.apache.isis.viewer.wicket.model.models.ScalarModel;
 import org.apache.isis.viewer.wicket.model.util.CommonContextUtils;
@@ -52,6 +51,8 @@ import org.apache.isis.viewer.wicket.ui.panels.PanelAbstract;
 import org.apache.isis.viewer.wicket.ui.util.Tooltips;
 import org.apache.isis.viewer.wicket.ui.util.Wkt;
 
+import lombok.AccessLevel;
+import lombok.Getter;
 import lombok.NonNull;
 import lombok.val;
 
@@ -79,66 +80,45 @@ implements TextFieldValueModel.ScalarModelProvider {
 
     protected final Class<T> cls;
 
-    protected static class ReplaceDisabledTagWithReadonlyTagBehaviour extends Behavior {
-        private static final long serialVersionUID = 1L;
-
-        @Override public void onComponentTag(final Component component, final ComponentTag tag) {
-            super.onComponentTag(component, tag);
-            if(component.isEnabled()) {
-                return;
-            }
-            tag.remove("disabled");
-            tag.put("readonly","readonly");
-        }
-    }
-
+    @Getter(value = AccessLevel.PROTECTED)
     private AbstractTextComponent<T> textField;
 
-
-    public ScalarPanelTextFieldAbstract(final String id, final ScalarModel scalarModel, final Class<T> cls) {
+    protected ScalarPanelTextFieldAbstract(final String id, final ScalarModel scalarModel, final Class<T> cls) {
         super(id, scalarModel);
         this.cls = cls;
     }
 
     // -- CONVERSION
 
-//    protected final IConverter<T> getConverter(final ScalarModel scalarModel) {
-//        return getConverter(scalarModel.getMetaModel(), scalarModel.isEditMode()
-//                ? ScalarRepresentation.EDITING
-//                : ScalarRepresentation.VIEWING);
-//    }
-//
-//    /**
-//     * Converter that is used for the either regular (editing) or compact (HTML) view of the panel,
-//     * based on argument {@code scalarRepresentation}.
-//     */
-//    protected abstract IConverter<T> getConverter(
-//            @NonNull ObjectFeature propOrParam,
-//            @NonNull ScalarRepresentation scalarRepresentation);
-
-    // --
-
-    protected AbstractTextComponent<T> getTextField() {
-        return textField;
+    protected final IConverter<T> getConverter(final ScalarModel scalarModel) {
+        return getConverter(scalarModel.getMetaModel(), scalarModel.isEditMode()
+                ? ScalarRepresentation.EDITING
+                : ScalarRepresentation.VIEWING);
     }
 
     /**
-     * Optional hook for subclasses to override
+     * Converter that is used for the either regular (editing) or compact (HTML) view of the panel,
+     * based on argument {@code scalarRepresentation}.
      */
-    protected AbstractTextComponent<T> createTextFieldForRegular(final String id) {
-        return createTextField(id);
-    }
+    protected abstract IConverter<T> getConverter(
+            @NonNull ObjectFeature propOrParam,
+            @NonNull ScalarRepresentation scalarRepresentation);
+
+    // --
 
-    protected TextField<T> createTextField(final String id) {
-        return new TextField<>(id, newTextFieldValueModel(), cls);
+    /**
+     * TextField, with converter.
+     */
+    protected AbstractTextComponent<T> createTextField(final String id) {
+        return Wkt.textFieldWithConverter(
+                id, newTextFieldValueModel(), cls, getConverter(getModel()));
     }
 
-    protected TextFieldValueModel<T> newTextFieldValueModel() {
+    protected final TextFieldValueModel<T> newTextFieldValueModel() {
         return new TextFieldValueModel<>(this);
     }
 
-    // ///////////////////////////////////////////////////////////////////
-
+    // --
 
     @Override
     protected MarkupContainer createComponentForRegular() {
@@ -147,7 +127,7 @@ implements TextFieldValueModel.ScalarModelProvider {
         // am instantiating both to avoid NPEs
         // elsewhere can use Component#isVisibilityAllowed or ScalarModel.getEditStyle() to check whichis visible.
 
-        textField = createTextFieldForRegular(ID_SCALAR_VALUE);
+        textField = createTextField(ID_SCALAR_VALUE);
         textField.setOutputMarkupId(true);
 
         addStandardSemantics();
@@ -165,19 +145,6 @@ implements TextFieldValueModel.ScalarModelProvider {
         return textField;
     }
 
-    private void addReplaceDisabledTagWithReadonlyTagBehaviourIfRequired(final Component component) {
-        if(!getWicketViewerSettings().isReplaceDisabledTagWithReadonlyTag()) {
-            return;
-        }
-        if (component == null) {
-            return;
-        }
-        if (!component.getBehaviors(ReplaceDisabledTagWithReadonlyTagBehaviour.class).isEmpty()) {
-            return;
-        }
-        component.add(new ReplaceDisabledTagWithReadonlyTagBehaviour());
-    }
-
     protected MarkupContainer createScalarIfRegularFormGroup() {
         Fragment textFieldFragment = createTextFieldFragment("scalarValueContainer");
         final String name = getModel().getFriendlyName();
@@ -360,7 +327,10 @@ implements TextFieldValueModel.ScalarModelProvider {
         super.onInitializeNotEditable();
 
         textField.setEnabled(false);
-        addReplaceDisabledTagWithReadonlyTagBehaviourIfRequired(textField);
+
+        if(getWicketViewerSettings().isReplaceDisabledTagWithReadonlyTag()) {
+            Wkt.behaviorAddReplaceDisabledTagWithReadonlyTag(textField);
+        }
 
         clearTooltip();
     }
@@ -370,7 +340,10 @@ implements TextFieldValueModel.ScalarModelProvider {
         super.onInitializeReadonly(disableReason);
 
         textField.setEnabled(false);
-        addReplaceDisabledTagWithReadonlyTagBehaviourIfRequired(textField);
+
+        if(getWicketViewerSettings().isReplaceDisabledTagWithReadonlyTag()) {
+            Wkt.behaviorAddReplaceDisabledTagWithReadonlyTag(textField);
+        }
 
         inlinePromptLink.setEnabled(false);
 
diff --git a/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/ScalarPanelTextFieldDatePickerAbstract.java b/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/ScalarPanelTextFieldDatePickerAbstract.java
index 41ee8db..ae52c1c 100644
--- a/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/ScalarPanelTextFieldDatePickerAbstract.java
+++ b/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/ScalarPanelTextFieldDatePickerAbstract.java
@@ -30,10 +30,14 @@ import org.apache.wicket.model.Model;
 import org.apache.wicket.util.convert.IConverter;
 
 import org.apache.isis.commons.internal.base._Casts;
+import org.apache.isis.core.metamodel.commons.ScalarRepresentation;
 import org.apache.isis.core.metamodel.facets.objectvalue.renderedadjusted.RenderedAdjustedFacet;
+import org.apache.isis.core.metamodel.spec.feature.ObjectFeature;
 import org.apache.isis.viewer.wicket.model.models.ScalarModel;
 import org.apache.isis.viewer.wicket.ui.components.scalars.datepicker.TextFieldWithDateTimePicker;
 
+import lombok.NonNull;
+
 /**
  * Panel for rendering scalars representing dates, along with a date picker.
  */
@@ -64,8 +68,9 @@ extends ScalarPanelTextFieldAbstract<T>  {
     }
 
     @Override
-    protected TextField<T> createTextField(final String id) {
-        return new TextFieldWithDateTimePicker<>(super.getCommonContext(), id, newTextFieldValueModel(), cls, converter);
+    protected final TextField<T> createTextField(final String id) {
+        return new TextFieldWithDateTimePicker<>(
+                super.getCommonContext(), id, newTextFieldValueModel(), cls, converter);
     }
 
 
@@ -113,4 +118,12 @@ extends ScalarPanelTextFieldAbstract<T>  {
         return null;
     }
 
+    //FIXME[ISIS-2882] wire up correctly
+    @Override
+    protected IConverter<T> getConverter(@NonNull final ObjectFeature propOrParam,
+            @NonNull final ScalarRepresentation scalarRepresentation) {
+        // TODO Auto-generated method stub
+        return null;
+    }
+
 }
diff --git a/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/ScalarPanelTextFieldNumeric.java b/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/ScalarPanelTextFieldNumeric.java
index 2a63204..f58d592 100644
--- a/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/ScalarPanelTextFieldNumeric.java
+++ b/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/ScalarPanelTextFieldNumeric.java
@@ -22,14 +22,10 @@ import java.io.Serializable;
 
 import org.apache.wicket.Component;
 import org.apache.wicket.model.IModel;
-import org.apache.wicket.util.convert.IConverter;
 
-import org.apache.isis.core.metamodel.commons.ScalarRepresentation;
-import org.apache.isis.core.metamodel.spec.feature.ObjectFeature;
 import org.apache.isis.viewer.wicket.model.models.ScalarModel;
 import org.apache.isis.viewer.wicket.ui.util.Wkt;
 
-import lombok.NonNull;
 import lombok.val;
 
 /**
@@ -48,7 +44,7 @@ extends ScalarPanelTextFieldAbstract<T> {
     }
 
     @Override
-    protected Component createComponentForCompact() {
+    protected final Component createComponentForCompact() {
         val label = Wkt.labelAddWithConverter(
                 getCompactFragment(CompactType.SPAN),
                 ID_SCALAR_IF_COMPACT, newTextFieldValueModel(), cls, getConverter(getModel()));
@@ -57,24 +53,8 @@ extends ScalarPanelTextFieldAbstract<T> {
     }
 
     @Override
-    protected IModel<String> obtainInlinePromptModel() {
+    protected final IModel<String> obtainInlinePromptModel() {
         return super.toStringConvertingModelOf(getConverter(scalarModel));
     }
 
-    //FIXME move up in hierarchy
-    protected final IConverter<T> getConverter(final ScalarModel scalarModel) {
-        return getConverter(scalarModel.getMetaModel(), scalarModel.isEditMode()
-                ? ScalarRepresentation.EDITING
-                : ScalarRepresentation.VIEWING);
-    }
-
-    /**
-     * Converter that is used for the either regular (editing) or compact (HTML) view of the panel,
-     * based on argument {@code scalarRepresentation}.
-     */
-    //FIXME move up in hierarchy
-    protected abstract IConverter<T> getConverter(
-            @NonNull ObjectFeature propOrParam,
-            @NonNull ScalarRepresentation scalarRepresentation);
-
 }
diff --git a/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/ScalarPanelTextFieldParseableAbstract.java b/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/ScalarPanelTextFieldParseableAbstract.java
index 1e019fc..fadb648 100644
--- a/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/ScalarPanelTextFieldParseableAbstract.java
+++ b/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/ScalarPanelTextFieldParseableAbstract.java
@@ -18,51 +18,51 @@
  */
 package org.apache.isis.viewer.wicket.ui.components.scalars;
 
-import org.apache.wicket.markup.html.form.AbstractTextComponent;
-import org.apache.wicket.markup.html.form.TextField;
+import org.apache.wicket.util.convert.IConverter;
 import org.apache.wicket.validation.validator.StringValidator;
 
+import org.apache.isis.core.metamodel.commons.ScalarRepresentation;
 import org.apache.isis.core.metamodel.facets.objectvalue.maxlen.MaxLengthFacet;
-import org.apache.isis.core.metamodel.spec.ObjectSpecification;
+import org.apache.isis.core.metamodel.spec.feature.ObjectFeature;
 import org.apache.isis.viewer.wicket.model.models.ScalarModel;
 
+import lombok.NonNull;
+
 /**
  * Adapter for {@link ScalarPanelTextFieldAbstract textField-based scalar panel}
  * s where moreover the scalar parameter or property is a value type that is
  * parseable.
  */
+@Deprecated //FIXME[ISIS-2882] probably remove class, have each value-type implement their own
 public abstract class ScalarPanelTextFieldParseableAbstract
 extends ScalarPanelTextFieldAbstract<String> {
 
     private static final long serialVersionUID = 1L;
 
-    public ScalarPanelTextFieldParseableAbstract(final String id, final ScalarModel scalarModel) {
+    protected ScalarPanelTextFieldParseableAbstract(final String id, final ScalarModel scalarModel) {
         super(id, scalarModel, String.class);
     }
 
     @Override
-    protected AbstractTextComponent<String> createTextFieldForRegular(final String id) {
-        final TextFieldStringModel model = new TextFieldStringModel(this);
-        return new TextField<>(id, model);
-    }
-
-    @Override
     protected void addStandardSemantics() {
         super.addStandardSemantics();
-
         addMaxLengthValidator();
     }
 
-    private void addMaxLengthValidator() {
-        final ScalarModel scalarModel = getModel();
-        final AbstractTextComponent<String> textField = getTextField();
+    @Override
+    protected IConverter<String> getConverter(
+            final @NonNull ObjectFeature propOrParam,
+            final @NonNull ScalarRepresentation scalarRepresentation) {
+        return null; // does not use conversion
+    }
 
-        final ObjectSpecification facetHolder = scalarModel.getScalarTypeSpec();
+    // -- HELPER
 
-        final MaxLengthFacet maxLengthFacet = facetHolder.getFacet(MaxLengthFacet.class);
-        if (maxLengthFacet != null) {
-            textField.add(StringValidator.maximumLength(maxLengthFacet.value()));
-        }
+    //FIXME[ISIS-2882] move up in hierarchy - also make sure logic is not already duplicated
+    private void addMaxLengthValidator() {
+        getModel().getScalarTypeSpec().lookupFacet(MaxLengthFacet.class)
+        .ifPresent(maxLengthFacet->
+            getTextField().add(StringValidator.maximumLength(maxLengthFacet.value())));
     }
 
 }
diff --git a/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/bookmark/BookmarkPanel.java b/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/bookmark/BookmarkPanel.java
index 37dbef6..7d2a955 100644
--- a/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/bookmark/BookmarkPanel.java
+++ b/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/bookmark/BookmarkPanel.java
@@ -29,7 +29,6 @@ public class BookmarkPanel extends ScalarPanelTextFieldParseableAbstract {
 
     private static final long serialVersionUID = 1L;
 
-
     public BookmarkPanel(final String id, final ScalarModel scalarModel) {
         super(id, scalarModel);
     }
diff --git a/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/jdk8time/Jdk8LocalDatePanel.java b/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/jdk8time/Jdk8LocalDatePanel.java
index 6d0e192..5997987 100644
--- a/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/jdk8time/Jdk8LocalDatePanel.java
+++ b/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/jdk8time/Jdk8LocalDatePanel.java
@@ -25,7 +25,8 @@ import org.apache.isis.viewer.wicket.ui.components.scalars.ScalarPanelTextFieldD
 /**
  * Panel for rendering scalars of type {@link LocalDate}.
  */
-public class Jdk8LocalDatePanel extends ScalarPanelTextFieldDatePickerAbstract<LocalDate> {
+public class Jdk8LocalDatePanel
+extends ScalarPanelTextFieldDatePickerAbstract<LocalDate> {
 
     private static final long serialVersionUID = 1L;
 
diff --git a/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/jdk8time/Jdk8LocalDateTimePanel.java b/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/jdk8time/Jdk8LocalDateTimePanel.java
index e0ce9f1..2b1a6ae 100644
--- a/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/jdk8time/Jdk8LocalDateTimePanel.java
+++ b/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/jdk8time/Jdk8LocalDateTimePanel.java
@@ -20,17 +20,14 @@ package org.apache.isis.viewer.wicket.ui.components.scalars.jdk8time;
 
 import java.time.LocalDateTime;
 
-import org.apache.wicket.markup.html.form.AbstractTextComponent;
-
 import org.apache.isis.viewer.wicket.model.models.ScalarModel;
 import org.apache.isis.viewer.wicket.ui.components.scalars.ScalarPanelTextFieldDatePickerAbstract;
-import org.apache.isis.viewer.wicket.ui.components.scalars.TextFieldValueModel;
-import org.apache.isis.viewer.wicket.ui.components.scalars.datepicker.TextFieldWithDateTimePicker;
 
 /**
  * Panel for rendering scalars of type {@link LocalDateTime}.
  */
-public class Jdk8LocalDateTimePanel extends ScalarPanelTextFieldDatePickerAbstract<LocalDateTime> {
+public class Jdk8LocalDateTimePanel
+extends ScalarPanelTextFieldDatePickerAbstract<LocalDateTime> {
 
     private static final long serialVersionUID = 1L;
 
@@ -39,10 +36,4 @@ public class Jdk8LocalDateTimePanel extends ScalarPanelTextFieldDatePickerAbstra
         init(new DateConverterForJdk8LocalDateTime(getWicketViewerSettings(), getAdjustBy()));
     }
 
-    @Override
-    protected AbstractTextComponent<LocalDateTime> createTextFieldForRegular(final String id) {
-        final TextFieldValueModel<LocalDateTime> textFieldValueModel = new TextFieldValueModel<>(this);
-        return new TextFieldWithDateTimePicker<>(super.getCommonContext(), id, textFieldValueModel, cls, converter);
-    }
-
 }
diff --git a/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/jdk8time/Jdk8OffsetDateTimePanel.java b/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/jdk8time/Jdk8OffsetDateTimePanel.java
index bfed31f..971d80d 100644
--- a/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/jdk8time/Jdk8OffsetDateTimePanel.java
+++ b/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/jdk8time/Jdk8OffsetDateTimePanel.java
@@ -20,12 +20,8 @@ package org.apache.isis.viewer.wicket.ui.components.scalars.jdk8time;
 
 import java.time.OffsetDateTime;
 
-import org.apache.wicket.markup.html.form.AbstractTextComponent;
-
 import org.apache.isis.viewer.wicket.model.models.ScalarModel;
 import org.apache.isis.viewer.wicket.ui.components.scalars.ScalarPanelTextFieldDatePickerAbstract;
-import org.apache.isis.viewer.wicket.ui.components.scalars.TextFieldValueModel;
-import org.apache.isis.viewer.wicket.ui.components.scalars.datepicker.TextFieldWithDateTimePicker;
 
 /**
  * Panel for rendering scalars of type {@link OffsetDateTime}.
@@ -40,10 +36,4 @@ extends ScalarPanelTextFieldDatePickerAbstract<OffsetDateTime> {
         init(new DateConverterForJdk8OffsetDateTime(getWicketViewerSettings(), getAdjustBy()));
     }
 
-    @Override
-    protected AbstractTextComponent<OffsetDateTime> createTextFieldForRegular(final String id) {
-        final TextFieldValueModel<OffsetDateTime> textFieldValueModel = new TextFieldValueModel<>(this);
-        return new TextFieldWithDateTimePicker<>(super.getCommonContext(), id, textFieldValueModel, cls, converter);
-    }
-
 }
diff --git a/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/jdkdates/JavaSqlDatePanel.java b/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/jdkdates/JavaSqlDatePanel.java
index f4e6415..decacd2 100644
--- a/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/jdkdates/JavaSqlDatePanel.java
+++ b/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/jdkdates/JavaSqlDatePanel.java
@@ -26,7 +26,8 @@ import org.apache.isis.viewer.wicket.ui.components.scalars.ScalarPanelTextFieldD
 /**
  * Panel for rendering scalars of type {@link Date java.sql.Date}.
  */
-public class JavaSqlDatePanel extends ScalarPanelTextFieldDatePickerAbstract<java.sql.Date> {
+public class JavaSqlDatePanel
+extends ScalarPanelTextFieldDatePickerAbstract<java.sql.Date> {
 
     private static final long serialVersionUID = 1L;
 
diff --git a/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/jdkdates/JavaSqlTimestampPanel.java b/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/jdkdates/JavaSqlTimestampPanel.java
index 7b0b138..6d5ebce 100644
--- a/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/jdkdates/JavaSqlTimestampPanel.java
+++ b/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/jdkdates/JavaSqlTimestampPanel.java
@@ -27,7 +27,8 @@ import org.apache.isis.viewer.wicket.ui.components.scalars.ScalarPanelTextFieldD
 /**
  * Panel for rendering scalars of type {@link java.sql.Timestamp}.
  */
-public class JavaSqlTimestampPanel extends ScalarPanelTextFieldDatePickerAbstract<Timestamp> {
+public class JavaSqlTimestampPanel
+extends ScalarPanelTextFieldDatePickerAbstract<Timestamp> {
 
     private static final long serialVersionUID = 1L;
 
diff --git a/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/jdkmath/JavaMathBigDecimalPanel.java b/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/jdkmath/JavaMathBigDecimalPanel.java
index f465364..a7de058 100644
--- a/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/jdkmath/JavaMathBigDecimalPanel.java
+++ b/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/jdkmath/JavaMathBigDecimalPanel.java
@@ -20,7 +20,6 @@ package org.apache.isis.viewer.wicket.ui.components.scalars.jdkmath;
 
 import java.math.BigDecimal;
 
-import org.apache.wicket.markup.html.form.AbstractTextComponent;
 import org.apache.wicket.util.convert.IConverter;
 
 import org.apache.isis.core.metamodel.commons.ScalarRepresentation;
@@ -28,7 +27,6 @@ import org.apache.isis.core.metamodel.spec.feature.ObjectFeature;
 import org.apache.isis.viewer.wicket.model.converter.BigDecimalConverterWkt;
 import org.apache.isis.viewer.wicket.model.models.ScalarModel;
 import org.apache.isis.viewer.wicket.ui.components.scalars.ScalarPanelTextFieldNumeric;
-import org.apache.isis.viewer.wicket.ui.util.Wkt;
 
 import lombok.NonNull;
 
@@ -47,12 +45,6 @@ extends ScalarPanelTextFieldNumeric<BigDecimal> {
     }
 
     @Override
-    protected AbstractTextComponent<BigDecimal> createTextFieldForRegular(final String id) {
-        return Wkt.textFieldWithConverter(
-                id, newTextFieldValueModel(), BigDecimal.class, getConverter(getModel()));
-    }
-
-    @Override
     protected IConverter<BigDecimal> getConverter(
             final @NonNull ObjectFeature propOrParam,
             final @NonNull ScalarRepresentation scalarRepresentation) {
diff --git a/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/jdkmath/JavaMathBigIntegerPanel.java b/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/jdkmath/JavaMathBigIntegerPanel.java
index d96811f..04c4fe9 100644
--- a/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/jdkmath/JavaMathBigIntegerPanel.java
+++ b/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/jdkmath/JavaMathBigIntegerPanel.java
@@ -20,7 +20,6 @@ package org.apache.isis.viewer.wicket.ui.components.scalars.jdkmath;
 
 import java.math.BigInteger;
 
-import org.apache.wicket.markup.html.form.AbstractTextComponent;
 import org.apache.wicket.util.convert.IConverter;
 
 import org.apache.isis.core.metamodel.commons.ScalarRepresentation;
@@ -28,7 +27,6 @@ import org.apache.isis.core.metamodel.spec.feature.ObjectFeature;
 import org.apache.isis.viewer.wicket.model.converter.BigIntegerConverterWkt;
 import org.apache.isis.viewer.wicket.model.models.ScalarModel;
 import org.apache.isis.viewer.wicket.ui.components.scalars.ScalarPanelTextFieldNumeric;
-import org.apache.isis.viewer.wicket.ui.util.Wkt;
 
 import lombok.NonNull;
 
@@ -45,12 +43,6 @@ extends ScalarPanelTextFieldNumeric<BigInteger> {
     }
 
     @Override
-    protected AbstractTextComponent<BigInteger> createTextFieldForRegular(final String id) {
-        return Wkt.textFieldWithConverter(
-                id, newTextFieldValueModel(), BigInteger.class, getConverter(getModel()));
-    }
-
-    @Override
     protected IConverter<BigInteger> getConverter(
             final @NonNull ObjectFeature propOrParam,
             final @NonNull ScalarRepresentation scalarRepresentation) {
diff --git a/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/jodatime/JodaDateTimePanel.java b/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/jodatime/JodaDateTimePanel.java
index f4b4819..e9715b1 100644
--- a/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/jodatime/JodaDateTimePanel.java
+++ b/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/jodatime/JodaDateTimePanel.java
@@ -18,19 +18,17 @@
  */
 package org.apache.isis.viewer.wicket.ui.components.scalars.jodatime;
 
-import org.apache.wicket.markup.html.form.AbstractTextComponent;
 import org.joda.time.DateTime;
 import org.joda.time.LocalDateTime;
 
 import org.apache.isis.viewer.wicket.model.models.ScalarModel;
 import org.apache.isis.viewer.wicket.ui.components.scalars.ScalarPanelTextFieldDatePickerAbstract;
-import org.apache.isis.viewer.wicket.ui.components.scalars.TextFieldValueModel;
-import org.apache.isis.viewer.wicket.ui.components.scalars.datepicker.TextFieldWithDateTimePicker;
 
 /**
  * Panel for rendering scalars of type {@link LocalDateTime}.
  */
-public class JodaDateTimePanel extends ScalarPanelTextFieldDatePickerAbstract<DateTime> {
+public class JodaDateTimePanel
+extends ScalarPanelTextFieldDatePickerAbstract<DateTime> {
 
     private static final long serialVersionUID = 1L;
 
@@ -39,10 +37,4 @@ public class JodaDateTimePanel extends ScalarPanelTextFieldDatePickerAbstract<Da
         init(new DateConverterForJodaDateTime(getWicketViewerSettings(), getAdjustBy()));
     }
 
-    @Override
-    protected AbstractTextComponent<DateTime> createTextFieldForRegular(final String id) {
-        final TextFieldValueModel<DateTime> textFieldValueModel = new TextFieldValueModel<>(this);
-        return new TextFieldWithDateTimePicker<>(super.getCommonContext(), id, textFieldValueModel, cls, converter);
-    }
-
 }
diff --git a/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/jodatime/JodaLocalDatePanel.java b/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/jodatime/JodaLocalDatePanel.java
index a2bf487..72a56d2 100644
--- a/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/jodatime/JodaLocalDatePanel.java
+++ b/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/jodatime/JodaLocalDatePanel.java
@@ -26,7 +26,8 @@ import org.apache.isis.viewer.wicket.ui.components.scalars.ScalarPanelTextFieldD
 /**
  * Panel for rendering scalars of type {@link LocalDate}.
  */
-public class JodaLocalDatePanel extends ScalarPanelTextFieldDatePickerAbstract<LocalDate> {
+public class JodaLocalDatePanel
+extends ScalarPanelTextFieldDatePickerAbstract<LocalDate> {
 
     private static final long serialVersionUID = 1L;
 
diff --git a/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/jodatime/JodaLocalDateTimePanel.java b/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/jodatime/JodaLocalDateTimePanel.java
index 5267d01..ba56685 100644
--- a/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/jodatime/JodaLocalDateTimePanel.java
+++ b/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/jodatime/JodaLocalDateTimePanel.java
@@ -18,18 +18,16 @@
  */
 package org.apache.isis.viewer.wicket.ui.components.scalars.jodatime;
 
-import org.apache.wicket.markup.html.form.AbstractTextComponent;
 import org.joda.time.LocalDateTime;
 
 import org.apache.isis.viewer.wicket.model.models.ScalarModel;
 import org.apache.isis.viewer.wicket.ui.components.scalars.ScalarPanelTextFieldDatePickerAbstract;
-import org.apache.isis.viewer.wicket.ui.components.scalars.TextFieldValueModel;
-import org.apache.isis.viewer.wicket.ui.components.scalars.datepicker.TextFieldWithDateTimePicker;
 
 /**
  * Panel for rendering scalars of type {@link LocalDateTime}.
  */
-public class JodaLocalDateTimePanel extends ScalarPanelTextFieldDatePickerAbstract<LocalDateTime> {
+public class JodaLocalDateTimePanel
+extends ScalarPanelTextFieldDatePickerAbstract<LocalDateTime> {
 
     private static final long serialVersionUID = 1L;
 
@@ -38,11 +36,4 @@ public class JodaLocalDateTimePanel extends ScalarPanelTextFieldDatePickerAbstra
         init(new DateConverterForJodaLocalDateTime(getWicketViewerSettings(), getAdjustBy()));
     }
 
-    // TODO mgrigorov: Check whether this is really needed after fixing ISIS-1015
-    @Override
-    protected AbstractTextComponent<LocalDateTime> createTextFieldForRegular(final String id) {
-        final TextFieldValueModel<LocalDateTime> textFieldValueModel = new TextFieldValueModel<>(this);
-        return new TextFieldWithDateTimePicker<>(super.getCommonContext(), id, textFieldValueModel, cls, converter);
-    }
-
 }
diff --git a/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/jodatime/JodaLocalTimePanel.java b/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/jodatime/JodaLocalTimePanel.java
index dd5f9cd..ab2356b 100644
--- a/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/jodatime/JodaLocalTimePanel.java
+++ b/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/jodatime/JodaLocalTimePanel.java
@@ -23,14 +23,19 @@ import org.apache.wicket.markup.html.form.TextField;
 import org.apache.wicket.util.convert.IConverter;
 import org.joda.time.LocalTime;
 
+import org.apache.isis.core.metamodel.commons.ScalarRepresentation;
+import org.apache.isis.core.metamodel.spec.feature.ObjectFeature;
 import org.apache.isis.viewer.wicket.model.models.ScalarModel;
 import org.apache.isis.viewer.wicket.ui.components.scalars.ScalarPanelTextFieldAbstract;
 import org.apache.isis.viewer.wicket.ui.components.scalars.TextFieldValueModel;
 
+import lombok.NonNull;
+
 /**
  * Panel for rendering scalars of type {@link LocalTime}.
  */
-public class JodaLocalTimePanel extends ScalarPanelTextFieldAbstract<LocalTime> {
+public class JodaLocalTimePanel
+extends ScalarPanelTextFieldAbstract<LocalTime> {
 
     private static final long serialVersionUID = 1L;
 
@@ -39,7 +44,7 @@ public class JodaLocalTimePanel extends ScalarPanelTextFieldAbstract<LocalTime>
     }
 
     @Override
-    protected AbstractTextComponent<LocalTime> createTextFieldForRegular(final String id) {
+    protected AbstractTextComponent<LocalTime> createTextField(final String id) {
         final TextFieldValueModel<LocalTime> textFieldValueModel = new TextFieldValueModel<>(this);
         return new TextField<LocalTime>(id, textFieldValueModel, LocalTime.class) {
             private static final long serialVersionUID = 1L;
@@ -52,4 +57,12 @@ public class JodaLocalTimePanel extends ScalarPanelTextFieldAbstract<LocalTime>
         };
     }
 
+    //FIXME[ISIS-2882] wire up correctly
+    @Override
+    protected IConverter<LocalTime> getConverter(@NonNull final ObjectFeature propOrParam,
+            final @NonNull ScalarRepresentation scalarRepresentation) {
+        // TODO Auto-generated method stub
+        return null;
+    }
+
 }
diff --git a/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/passwd/IsisPasswordPanel.java b/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/passwd/IsisPasswordPanel.java
index cc7e799..1c1de64 100644
--- a/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/passwd/IsisPasswordPanel.java
+++ b/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/passwd/IsisPasswordPanel.java
@@ -25,14 +25,14 @@ import org.apache.wicket.markup.html.form.PasswordTextField;
 import org.apache.isis.applib.value.Password;
 import org.apache.isis.viewer.wicket.model.models.ScalarModel;
 import org.apache.isis.viewer.wicket.ui.components.scalars.ScalarPanelTextFieldParseableAbstract;
-import org.apache.isis.viewer.wicket.ui.components.scalars.TextFieldStringModel;
 
 import de.agilecoders.wicket.core.util.Attributes;
 
 /**
  * Panel for rendering scalars of type {@link Password Isis' applib.Password}.
  */
-public class IsisPasswordPanel extends ScalarPanelTextFieldParseableAbstract {
+public class IsisPasswordPanel
+extends ScalarPanelTextFieldParseableAbstract {
 
     private static final long serialVersionUID = 1L;
 
@@ -40,11 +40,10 @@ public class IsisPasswordPanel extends ScalarPanelTextFieldParseableAbstract {
         super(id, scalarModel);
     }
 
-
     @Override
-    protected AbstractTextComponent<String> createTextFieldForRegular(final String id) {
-        final TextFieldStringModel textModel = new TextFieldStringModel(this);
-        final PasswordTextField passwordField = new PasswordTextField(id, textModel) {
+    protected AbstractTextComponent<String> createTextField(final String id) {
+
+        final PasswordTextField passwordField = new PasswordTextField(id, newTextFieldValueModel()) {
             private static final long serialVersionUID = 1L;
 
             @Override
diff --git a/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/primitive/BytePanel.java b/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/primitive/BytePanel.java
index 6b8a476..25fe38e 100644
--- a/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/primitive/BytePanel.java
+++ b/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/primitive/BytePanel.java
@@ -18,7 +18,6 @@
  */
 package org.apache.isis.viewer.wicket.ui.components.scalars.primitive;
 
-import org.apache.wicket.markup.html.form.AbstractTextComponent;
 import org.apache.wicket.util.convert.IConverter;
 
 import org.apache.isis.core.metamodel.commons.ScalarRepresentation;
@@ -26,7 +25,6 @@ import org.apache.isis.core.metamodel.spec.feature.ObjectFeature;
 import org.apache.isis.viewer.wicket.model.converter.ByteConverterWkt;
 import org.apache.isis.viewer.wicket.model.models.ScalarModel;
 import org.apache.isis.viewer.wicket.ui.components.scalars.ScalarPanelTextFieldNumeric;
-import org.apache.isis.viewer.wicket.ui.util.Wkt;
 
 import lombok.NonNull;
 
@@ -43,12 +41,6 @@ extends ScalarPanelTextFieldNumeric<Byte> {
     }
 
     @Override
-    protected AbstractTextComponent<Byte> createTextFieldForRegular(final String id) {
-        return Wkt.textFieldWithConverter(
-                id, newTextFieldValueModel(), Byte.class, getConverter(getModel()));
-    }
-
-    @Override
     protected IConverter<Byte> getConverter(
             final @NonNull ObjectFeature propOrParam,
             final @NonNull ScalarRepresentation scalarRepresentation) {
diff --git a/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/primitive/CharacterPanel.java b/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/primitive/CharacterPanel.java
index c5490f5..7ef728e 100644
--- a/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/primitive/CharacterPanel.java
+++ b/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/primitive/CharacterPanel.java
@@ -19,13 +19,14 @@
 package org.apache.isis.viewer.wicket.ui.components.scalars.primitive;
 
 import org.apache.wicket.util.convert.IConverter;
-import org.apache.wicket.util.convert.converter.CharacterConverter;
-import org.springframework.util.ClassUtils;
 
+import org.apache.isis.core.metamodel.commons.ScalarRepresentation;
+import org.apache.isis.core.metamodel.spec.feature.ObjectFeature;
+import org.apache.isis.viewer.wicket.model.converter.CharacterConverterWkt;
 import org.apache.isis.viewer.wicket.model.models.ScalarModel;
 import org.apache.isis.viewer.wicket.ui.components.scalars.ScalarPanelTextFieldAbstract;
 
-import lombok.val;
+import lombok.NonNull;
 
 /**
  * Panel for rendering scalars of type {@link Character} or <tt>char</tt>.
@@ -40,12 +41,10 @@ extends ScalarPanelTextFieldAbstract<Character> {
     }
 
     @Override
-    public <C> IConverter<C> getConverter(final Class<C> _type) {
-        val type = ClassUtils.resolvePrimitiveIfNecessary(_type);
-        if(Character.class.equals(type)) {
-            return (IConverter<C>) CharacterConverter.INSTANCE; //FIXME[ISIS-2882] use value semantics instead
-        }
-        return super.getConverter(_type);
+    protected IConverter<Character> getConverter(
+            final @NonNull ObjectFeature propOrParam,
+            final @NonNull ScalarRepresentation scalarRepresentation) {
+        return new CharacterConverterWkt(propOrParam, scalarRepresentation);
     }
 
 }
diff --git a/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/primitive/DoublePanel.java b/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/primitive/DoublePanel.java
index a164ebc..502d4de 100644
--- a/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/primitive/DoublePanel.java
+++ b/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/primitive/DoublePanel.java
@@ -18,7 +18,6 @@
  */
 package org.apache.isis.viewer.wicket.ui.components.scalars.primitive;
 
-import org.apache.wicket.markup.html.form.AbstractTextComponent;
 import org.apache.wicket.util.convert.IConverter;
 
 import org.apache.isis.core.metamodel.commons.ScalarRepresentation;
@@ -26,14 +25,14 @@ import org.apache.isis.core.metamodel.spec.feature.ObjectFeature;
 import org.apache.isis.viewer.wicket.model.converter.DoubleConverterWkt;
 import org.apache.isis.viewer.wicket.model.models.ScalarModel;
 import org.apache.isis.viewer.wicket.ui.components.scalars.ScalarPanelTextFieldNumeric;
-import org.apache.isis.viewer.wicket.ui.util.Wkt;
 
 import lombok.NonNull;
 
 /**
  * Panel for rendering scalars of type {@link Double} or <tt>double</tt>.
  */
-public class DoublePanel extends ScalarPanelTextFieldNumeric<Double> {
+public class DoublePanel
+extends ScalarPanelTextFieldNumeric<Double> {
 
     private static final long serialVersionUID = 1L;
 
@@ -42,12 +41,6 @@ public class DoublePanel extends ScalarPanelTextFieldNumeric<Double> {
     }
 
     @Override
-    protected AbstractTextComponent<Double> createTextFieldForRegular(final String id) {
-        return Wkt.textFieldWithConverter(
-                id, newTextFieldValueModel(), Double.class, getConverter(getModel()));
-    }
-
-    @Override
     protected IConverter<Double> getConverter(
             final @NonNull ObjectFeature propOrParam,
             final @NonNull ScalarRepresentation scalarRepresentation) {
diff --git a/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/primitive/FloatPanel.java b/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/primitive/FloatPanel.java
index d79aa76..f98e8fc 100644
--- a/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/primitive/FloatPanel.java
+++ b/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/primitive/FloatPanel.java
@@ -18,7 +18,6 @@
  */
 package org.apache.isis.viewer.wicket.ui.components.scalars.primitive;
 
-import org.apache.wicket.markup.html.form.AbstractTextComponent;
 import org.apache.wicket.util.convert.IConverter;
 
 import org.apache.isis.core.metamodel.commons.ScalarRepresentation;
@@ -26,7 +25,6 @@ import org.apache.isis.core.metamodel.spec.feature.ObjectFeature;
 import org.apache.isis.viewer.wicket.model.converter.FloatConverterWkt;
 import org.apache.isis.viewer.wicket.model.models.ScalarModel;
 import org.apache.isis.viewer.wicket.ui.components.scalars.ScalarPanelTextFieldNumeric;
-import org.apache.isis.viewer.wicket.ui.util.Wkt;
 
 import lombok.NonNull;
 
@@ -42,12 +40,6 @@ public class FloatPanel extends ScalarPanelTextFieldNumeric<Float> {
     }
 
     @Override
-    protected AbstractTextComponent<Float> createTextFieldForRegular(final String id) {
-        return Wkt.textFieldWithConverter(
-                id, newTextFieldValueModel(), Float.class, getConverter(getModel()));
-    }
-
-    @Override
     protected IConverter<Float> getConverter(
             final @NonNull ObjectFeature propOrParam,
             final @NonNull ScalarRepresentation scalarRepresentation) {
diff --git a/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/primitive/IntegerPanel.java b/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/primitive/IntegerPanel.java
index 800dbde..c509281 100644
--- a/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/primitive/IntegerPanel.java
+++ b/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/primitive/IntegerPanel.java
@@ -18,7 +18,6 @@
  */
 package org.apache.isis.viewer.wicket.ui.components.scalars.primitive;
 
-import org.apache.wicket.markup.html.form.AbstractTextComponent;
 import org.apache.wicket.util.convert.IConverter;
 
 import org.apache.isis.core.metamodel.commons.ScalarRepresentation;
@@ -26,7 +25,6 @@ import org.apache.isis.core.metamodel.spec.feature.ObjectFeature;
 import org.apache.isis.viewer.wicket.model.converter.IntegerConverterWkt;
 import org.apache.isis.viewer.wicket.model.models.ScalarModel;
 import org.apache.isis.viewer.wicket.ui.components.scalars.ScalarPanelTextFieldNumeric;
-import org.apache.isis.viewer.wicket.ui.util.Wkt;
 
 import lombok.NonNull;
 
@@ -42,12 +40,6 @@ public class IntegerPanel extends ScalarPanelTextFieldNumeric<Integer> {
     }
 
     @Override
-    protected AbstractTextComponent<Integer> createTextFieldForRegular(final String id) {
-        return Wkt.textFieldWithConverter(
-                id, newTextFieldValueModel(), Integer.class, getConverter(getModel()));
-    }
-
-    @Override
     protected IConverter<Integer> getConverter(
             final @NonNull ObjectFeature propOrParam,
             final @NonNull ScalarRepresentation scalarRepresentation) {
diff --git a/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/primitive/LongPanel.java b/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/primitive/LongPanel.java
index 80a2393..2ba36ef 100644
--- a/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/primitive/LongPanel.java
+++ b/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/primitive/LongPanel.java
@@ -18,7 +18,6 @@
  */
 package org.apache.isis.viewer.wicket.ui.components.scalars.primitive;
 
-import org.apache.wicket.markup.html.form.AbstractTextComponent;
 import org.apache.wicket.util.convert.IConverter;
 
 import org.apache.isis.core.metamodel.commons.ScalarRepresentation;
@@ -26,14 +25,14 @@ import org.apache.isis.core.metamodel.spec.feature.ObjectFeature;
 import org.apache.isis.viewer.wicket.model.converter.LongConverterWkt;
 import org.apache.isis.viewer.wicket.model.models.ScalarModel;
 import org.apache.isis.viewer.wicket.ui.components.scalars.ScalarPanelTextFieldNumeric;
-import org.apache.isis.viewer.wicket.ui.util.Wkt;
 
 import lombok.NonNull;
 
 /**
  * Panel for rendering scalars of type {@link Long} or <tt>long</tt>.
  */
-public class LongPanel extends ScalarPanelTextFieldNumeric<Long> {
+public class LongPanel
+extends ScalarPanelTextFieldNumeric<Long> {
 
     private static final long serialVersionUID = 1L;
 
@@ -42,12 +41,6 @@ public class LongPanel extends ScalarPanelTextFieldNumeric<Long> {
     }
 
     @Override
-    protected AbstractTextComponent<Long> createTextFieldForRegular(final String id) {
-        return Wkt.textFieldWithConverter(
-                id, newTextFieldValueModel(), Long.class, getConverter(getModel()));
-    }
-
-    @Override
     protected IConverter<Long> getConverter(
             final @NonNull ObjectFeature propOrParam,
             final @NonNull ScalarRepresentation scalarRepresentation) {
diff --git a/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/primitive/ShortPanel.java b/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/primitive/ShortPanel.java
index 795d3ce..f1ed507 100644
--- a/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/primitive/ShortPanel.java
+++ b/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/primitive/ShortPanel.java
@@ -18,7 +18,6 @@
  */
 package org.apache.isis.viewer.wicket.ui.components.scalars.primitive;
 
-import org.apache.wicket.markup.html.form.AbstractTextComponent;
 import org.apache.wicket.util.convert.IConverter;
 
 import org.apache.isis.core.metamodel.commons.ScalarRepresentation;
@@ -26,14 +25,14 @@ import org.apache.isis.core.metamodel.spec.feature.ObjectFeature;
 import org.apache.isis.viewer.wicket.model.converter.ShortConverterWkt;
 import org.apache.isis.viewer.wicket.model.models.ScalarModel;
 import org.apache.isis.viewer.wicket.ui.components.scalars.ScalarPanelTextFieldNumeric;
-import org.apache.isis.viewer.wicket.ui.util.Wkt;
 
 import lombok.NonNull;
 
 /**
  * Panel for rendering scalars of type {@link Short} or <tt>short</tt>.
  */
-public class ShortPanel extends ScalarPanelTextFieldNumeric<Short> {
+public class ShortPanel
+extends ScalarPanelTextFieldNumeric<Short> {
 
     private static final long serialVersionUID = 1L;
 
@@ -42,12 +41,6 @@ public class ShortPanel extends ScalarPanelTextFieldNumeric<Short> {
     }
 
     @Override
-    protected AbstractTextComponent<Short> createTextFieldForRegular(final String id) {
-        return Wkt.textFieldWithConverter(
-                id, newTextFieldValueModel(), Short.class, getConverter(getModel()));
-    }
-
-    @Override
     protected IConverter<Short> getConverter(
             final @NonNull ObjectFeature propOrParam,
             final @NonNull ScalarRepresentation scalarRepresentation) {
diff --git a/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/string/MultiLineStringPanel.java b/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/string/MultiLineStringPanel.java
index 678e1e4..593ef50 100644
--- a/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/string/MultiLineStringPanel.java
+++ b/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/string/MultiLineStringPanel.java
@@ -48,7 +48,7 @@ extends ScalarPanelTextFieldParseableAbstract {
     }
 
     @Override
-    protected AbstractTextComponent<String> createTextFieldForRegular(final String id) {
+    protected AbstractTextComponent<String> createTextField(final String id) {
         val model = new TextFieldStringModel(this);
         val textArea = new TextArea<String>(id, model);
         setRowsAndMaxLengthAttributesOn(textArea);
diff --git a/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/uuid/UuidConverter.java b/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/uuid/UuidConverter.java
deleted file mode 100644
index 4908a3a..0000000
--- a/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/uuid/UuidConverter.java
+++ /dev/null
@@ -1,63 +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.viewer.wicket.ui.components.scalars.uuid;
-
-import java.util.Locale;
-import java.util.UUID;
-
-import org.apache.wicket.util.convert.ConversionException;
-import org.apache.wicket.util.convert.IConverter;
-
-import org.apache.isis.commons.internal.base._Strings;
-
-/**
- * The {@link IConverter} implementation that our {@link UuidTextField} delegates to for converting strings into values.
- */
-public class UuidConverter implements IConverter<UUID>
-{
-    private static final long serialVersionUID = 1L;
-
-    //    private static final Pattern pattern = Pattern.compile(
-    //            "[0-9a-fA-F]{8}(?:-[0-9a-fA-F]{4}){3}-[0-9a-fA-F]{12}");
-
-    @Override
-    public UUID convertToObject(String value, Locale locale)
-            throws ConversionException {
-
-        if(_Strings.isNullOrEmpty(value)) {
-            return null;
-        }
-
-        try {
-            return UUID.fromString(value);
-        } catch (IllegalArgumentException e) {
-            throw newConversionException(value);
-        }
-    }
-
-    @Override
-    public String convertToString(UUID value, Locale locale) {
-        return value != null ? value.toString() : null;
-    }
-
-    private ConversionException newConversionException(String value) {
-        return new ConversionException(
-                String.format("Failed to convert '%s' to a UUID", value));
-    }
-}
\ No newline at end of file
diff --git a/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/uuid/UuidPanel.java b/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/uuid/UuidPanel.java
index 43c2dac..5b3e4a5 100644
--- a/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/uuid/UuidPanel.java
+++ b/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/uuid/UuidPanel.java
@@ -20,32 +20,33 @@ package org.apache.isis.viewer.wicket.ui.components.scalars.uuid;
 
 import java.util.UUID;
 
-import org.apache.wicket.markup.html.form.AbstractTextComponent;
+import org.apache.wicket.util.convert.IConverter;
 
+import org.apache.isis.core.metamodel.commons.ScalarRepresentation;
+import org.apache.isis.core.metamodel.spec.feature.ObjectFeature;
+import org.apache.isis.viewer.wicket.model.converter.UuidConverterWkt;
 import org.apache.isis.viewer.wicket.model.models.ScalarModel;
 import org.apache.isis.viewer.wicket.ui.components.scalars.ScalarPanelTextFieldAbstract;
-import org.apache.isis.viewer.wicket.ui.components.scalars.TextFieldValueModel;
+
+import lombok.NonNull;
 
 /**
  * Panel for rendering scalars of type {@link UUID}.
  */
-public class UuidPanel extends ScalarPanelTextFieldAbstract<UUID> {
+public class UuidPanel
+extends ScalarPanelTextFieldAbstract<UUID> {
 
     private static final long serialVersionUID = 1L;
 
-    private static final UuidConverter converter = new UuidConverter();
-
-    public UuidPanel(
-            final String id,
-            final ScalarModel scalarModel) {
+    public UuidPanel(final String id, final ScalarModel scalarModel) {
         super(id, scalarModel, UUID.class);
     }
 
     @Override
-    protected AbstractTextComponent<UUID> createTextFieldForRegular(final String id) {
-        final ScalarModel model = getModel();
-        final TextFieldValueModel<UUID> textFieldValueModel = new TextFieldValueModel<>(this);
-        return new UuidTextField(id, textFieldValueModel, cls, model, converter);
+    protected IConverter<UUID> getConverter(
+            final @NonNull ObjectFeature propOrParam,
+            final @NonNull ScalarRepresentation scalarRepresentation) {
+        return new UuidConverterWkt(propOrParam, scalarRepresentation);
     }
 
 }
diff --git a/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/uuid/UuidTextField.java b/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/uuid/UuidTextField.java
deleted file mode 100644
index 261204d..0000000
--- a/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/uuid/UuidTextField.java
+++ /dev/null
@@ -1,56 +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.viewer.wicket.ui.components.scalars.uuid;
-
-import java.util.UUID;
-
-import org.apache.wicket.model.IModel;
-import org.apache.wicket.util.convert.IConverter;
-
-import org.apache.isis.viewer.wicket.model.models.ScalarModel;
-import org.apache.isis.viewer.wicket.ui.components.scalars.TextFieldAbstract;
-
-final class UuidTextField extends TextFieldAbstract<UUID> {
-
-    private static final long serialVersionUID = 1L;
-
-    private final UuidConverter converter;
-
-    UuidTextField(
-            final String id, final IModel<UUID> model, final Class<UUID> type,
-            final ScalarModel scalarModel,
-            final UuidConverter converter) {
-        super(id, model, type, scalarModel);
-        this.converter = converter;
-    }
-
-    @SuppressWarnings("unchecked")
-    @Override
-    public <C> IConverter<C> getConverter(Class<C> type) {
-        if (type != UUID.class) {
-            return super.getConverter(type);
-        }
-        return (IConverter<C>) getConverterFor(scalarModel);
-    }
-
-    @Override
-    protected IConverter<UUID> getConverterFor(ScalarModel scalarModel) {
-        return converter;
-    }
-}
\ No newline at end of file
diff --git a/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/value/compound/ValueCompoundPanel.java b/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/value/compound/ValueCompoundPanel.java
index b191920..ba76246 100644
--- a/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/value/compound/ValueCompoundPanel.java
+++ b/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/value/compound/ValueCompoundPanel.java
@@ -46,7 +46,7 @@ extends ScalarPanelTextFieldParseableAbstract {
     }
 
     @Override
-    protected AbstractTextComponent<String> createTextFieldForRegular(final String id) {
+    protected AbstractTextComponent<String> createTextField(final String id) {
         return new TextField<>(id, LambdaModel.of(()->
             renderer().simpleTextPresentation(null, scalarModel.getObject().getPojo())));
     }
diff --git a/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/util/Wkt.java b/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/util/Wkt.java
index 30875ae..fcfbe89 100644
--- a/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/util/Wkt.java
+++ b/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/util/Wkt.java
@@ -123,6 +123,22 @@ public class Wkt {
         };
     }
 
+    private static class ReplaceDisabledTagWithReadonlyTagBehavior extends Behavior {
+        private static final long serialVersionUID = 1L;
+        @Override public void onComponentTag(final Component component, final ComponentTag tag) {
+            super.onComponentTag(component, tag);
+            if(component.isEnabled()) {
+                return;
+            }
+            tag.remove("disabled");
+            tag.put("readonly","readonly");
+        }
+    }
+
+    public Behavior behaviorReplaceDisabledTagWithReadonlyTag() {
+        return new ReplaceDisabledTagWithReadonlyTagBehavior();
+    }
+
     public Behavior behaviorAddOnClick(
             final MarkupContainer markupContainer,
             final SerializableConsumer<AjaxRequestTarget> onClick) {
@@ -135,6 +151,12 @@ public class Wkt {
         return add(markupContainer, behaviorFireOnEscapeKey(onRespond));
     }
 
+    public void behaviorAddReplaceDisabledTagWithReadonlyTag(final Component component) {
+        if (component.getBehaviors(ReplaceDisabledTagWithReadonlyTagBehavior.class).isEmpty()) {
+            component.add(new ReplaceDisabledTagWithReadonlyTagBehavior());
+        }
+    }
+
     // -- BUTTON
 
     public AjaxButton button(
@@ -464,24 +486,30 @@ public class Wkt {
 
     // -- TEXT FIELD
 
+    /**
+     * @param converter - if {@code null} returns {@link TextField} using Wicket's default converters.
+     */
     public <T> TextField<T> textFieldWithConverter(
-            final String id, final IModel<T> model, final Class<T> type, final IConverter<T> converter) {
-        return new TextField<T>(id, model, type) {
-            private static final long serialVersionUID = 1L;
-            @SuppressWarnings("unchecked")
-            @Override public <C> IConverter<C> getConverter(final Class<C> cType) {
-                return cType == type
-                        ? (IConverter<C>) converter
-                        : super.getConverter(cType);}
-            @Override public void error(final IValidationError error) {
-                if(error instanceof ValidationError) {
-                    // use plain error message from ConversionException, circumventing resource bundles.
-                    this.error(((ValidationError)error).getMessage());
-                } else {
-                    super.error(error);
+            final String id, final IModel<T> model, final Class<T> type,
+            final @Nullable IConverter<T> converter) {
+        return converter!=null
+            ? new TextField<T>(id, model, type) {
+                    private static final long serialVersionUID = 1L;
+                    @SuppressWarnings("unchecked")
+                    @Override public <C> IConverter<C> getConverter(final Class<C> cType) {
+                        return cType == type
+                                ? (IConverter<C>) converter
+                                : super.getConverter(cType);}
+                    @Override public void error(final IValidationError error) {
+                        if(error instanceof ValidationError) {
+                            // use plain error message from ConversionException, circumventing resource bundles.
+                            this.error(((ValidationError)error).getMessage());
+                        } else {
+                            super.error(error);
+                        }
+                    }
                 }
-            }
-        };
+            : new TextField<>(id, model, type);
     }
 
     // -- FOCUS UTILITY
diff --git a/viewers/wicket/ui/src/test/java/org/apache/isis/viewer/wicket/ui/components/scalars/uuid/UuidConverterTest_roundtrip.java b/viewers/wicket/ui/src/test/java/org/apache/isis/viewer/wicket/ui/components/scalars/uuid/UuidConverterTest_roundtrip.java
index 08b6d12..d912036 100644
--- a/viewers/wicket/ui/src/test/java/org/apache/isis/viewer/wicket/ui/components/scalars/uuid/UuidConverterTest_roundtrip.java
+++ b/viewers/wicket/ui/src/test/java/org/apache/isis/viewer/wicket/ui/components/scalars/uuid/UuidConverterTest_roundtrip.java
@@ -22,52 +22,100 @@ import java.util.Locale;
 import java.util.UUID;
 
 import org.apache.wicket.util.convert.ConversionException;
-import org.junit.Assert;
-import org.junit.Before;
-import org.junit.Rule;
-import org.junit.Test;
-import org.junit.rules.ExpectedException;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
 
-public class UuidConverterTest_roundtrip {
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertNotNull;
+import static org.junit.jupiter.api.Assertions.assertNull;
+import static org.junit.jupiter.api.Assertions.assertThrows;
+import static org.junit.jupiter.api.Assertions.assertTrue;
+
+import org.apache.isis.applib.annotation.DomainObject;
+import org.apache.isis.applib.annotation.Property;
+import org.apache.isis.applib.services.iactnlayer.InteractionService;
+import org.apache.isis.core.config.valuetypes.ValueSemanticsRegistry;
+import org.apache.isis.core.metamodel._testing.MetaModelContext_forTesting;
+import org.apache.isis.core.metamodel.commons.ScalarRepresentation;
+import org.apache.isis.core.metamodel.context.MetaModelContext;
+import org.apache.isis.core.metamodel.valuesemantics.UUIDValueSemantics;
+import org.apache.isis.core.security._testing.InteractionService_forTesting;
+import org.apache.isis.viewer.wicket.model.converter.UuidConverterWkt;
+
+import lombok.Getter;
+import lombok.Setter;
+import lombok.val;
+
+// see also BigDecimalConverter_roundtrip, for more rigorous testing
+@SuppressWarnings("unused")
+class UuidConverterTest_roundtrip {
 
     final UUID valid = UUID.randomUUID();
 
-    private UuidConverter converter;
+    private UuidConverterWkt converter;
+
+    private InteractionService interactionService;
+    private MetaModelContext mmc;
+
+    @BeforeEach
+    void setUp() throws Exception {
+
+        UUIDValueSemantics valueSemantics;
+        mmc = MetaModelContext_forTesting.builder()
+                .valueSemantic(valueSemantics = new UUIDValueSemantics())
+                .interactionProvider(interactionService = new InteractionService_forTesting())
+                .build();
+        //valueSemantics.setSpecificationLoader(mmc.getSpecificationLoader());
 
-    @Rule
-    public ExpectedException exception = ExpectedException.none();
+        // pre-requisites for testing
+        val reg = mmc.getServiceRegistry().lookupServiceElseFail(ValueSemanticsRegistry.class);
+        assertNotNull(reg.selectValueSemantics(UUID.class));
+        assertTrue(reg.selectValueSemantics(UUID.class).isNotEmpty());
+        assertNotNull(mmc.getServiceRegistry().lookupServiceElseFail(InteractionService.class));
+        assertNotNull(mmc.getInteractionProvider());
 
-    @Before
-    public void setUp() throws Exception {
-        converter = newConverter();
+
+        converter = newConverter(CustomerWithUuid.class);
     }
 
     @Test
-    public void happy_case() {
+    void happy_case() {
 
-        Assert.assertEquals(
+        assertEquals(
                 valid, converter.convertToObject(valid.toString(), Locale.ENGLISH));
-        Assert.assertEquals(
+        assertEquals(
                 valid.toString(), converter.convertToString(valid, Locale.ENGLISH));
     }
 
     @Test
-    public void when_null() {
-        Assert.assertNull(converter.convertToObject(null, Locale.ENGLISH));
-        Assert.assertNull(converter.convertToObject("", Locale.ENGLISH));
-        Assert.assertNull(converter.convertToString(null, Locale.ENGLISH));
+    void when_null() {
+        assertNull(converter.convertToObject(null, Locale.ENGLISH));
+        assertNull(converter.convertToObject("", Locale.ENGLISH));
+        assertNull(converter.convertToString(null, Locale.ENGLISH));
     }
 
     @Test
-    public void invalid() {
-        exception.expect(ConversionException.class);
-        exception.expectMessage("Failed to convert 'junk' to a UUID");
-        Assert.assertNull(converter.convertToObject("junk", Locale.ENGLISH));
+    void invalid() {
+        assertThrows(ConversionException.class,
+                ()->converter.convertToObject("junk", Locale.ENGLISH),
+                "Failed to convert 'junk' to a UUID");
+    }
+
+    // -- HELPER
+
+    private UuidConverterWkt newConverter(final Class<?> type) {
+        val customerSpec = mmc.getSpecificationLoader().specForTypeElseFail(type);
+        val prop = customerSpec.getPropertyElseFail("value");
+        return new UuidConverterWkt(prop, ScalarRepresentation.EDITING);
     }
 
-    private UuidConverter newConverter() {
-        return new
-                UuidConverter();
+    // -- SCENARIOS
+
+    @DomainObject
+    static class CustomerWithUuid {
+        @Property @Getter @Setter
+        private UUID value;
     }
 
+
 }