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/12/13 12:35:37 UTC

[isis] branch master updated: ISIS-2918: [SecMan] new property ApplicationUser.locale: Locale

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 fae64b7  ISIS-2918: [SecMan] new property ApplicationUser.locale: Locale
fae64b7 is described below

commit fae64b731142f198aed03d4a3637f6096cd8b890
Author: andi-huber <ah...@apache.org>
AuthorDate: Mon Dec 13 13:35:22 2021 +0100

    ISIS-2918: [SecMan] new property ApplicationUser.locale: Locale
    
    - also implement LocaleValueSemantics
---
 .../value/semantics/ValueSemanticsAbstract.java    |  6 ++
 .../core/metamodel/IsisModuleCoreMetamodel.java    |  2 +
 .../valuesemantics/BigDecimalValueSemantics.java   |  6 ++
 .../valuesemantics/BigIntegerValueSemantics.java   |  6 ++
 .../valuesemantics/BlobValueSemantics.java         |  9 +++
 .../valuesemantics/BookmarkValueSemantics.java     |  8 +++
 .../valuesemantics/BooleanValueSemantics.java      |  6 ++
 .../BufferedImageValueSemantics.java               |  9 ++-
 .../valuesemantics/ByteValueSemantics.java         |  8 +++
 .../valuesemantics/ChangesDtoValueSemantics.java   |  6 ++
 .../valuesemantics/CharacterValueSemantics.java    |  5 ++
 .../valuesemantics/ClobValueSemantics.java         |  9 +++
 .../valuesemantics/CommandDtoValueSemantics.java   |  6 ++
 .../valuesemantics/DoubleValueSemantics.java       |  6 ++
 .../valuesemantics/EnumValueSemanticsAbstract.java |  8 +++
 .../valuesemantics/FloatValueSemantics.java        |  6 ++
 .../valuesemantics/IntValueSemantics.java          |  6 ++
 .../InteractionDtoValueSemantics.java              |  6 ++
 .../LocalResourcePathValueSemantics.java           |  8 +++
 ...lueSemantics.java => LocaleValueSemantics.java} | 67 +++++++++++++-------
 .../valuesemantics/LongValueSemantics.java         |  6 ++
 .../valuesemantics/MarkupValueSemantics.java       |  8 +++
 .../valuesemantics/OidDtoValueSemantics.java       |  8 +++
 .../valuesemantics/PasswordValueSemantics.java     |  6 ++
 .../valuesemantics/ShortValueSemantics.java        |  8 +++
 .../valuesemantics/StringValueSemantics.java       |  6 ++
 .../valuesemantics/TreeNodeValueSemantics.java     | 24 ++++++++
 .../valuesemantics/URLValueSemantics.java          | 11 ++++
 .../valuesemantics/UUIDValueSemantics.java         |  8 +++
 .../temporal/LocalDateTimeValueSemantics.java      |  8 +++
 .../temporal/LocalDateValueSemantics.java          |  8 +++
 .../temporal/LocalTimeValueSemantics.java          |  8 +++
 .../temporal/OffsetDateTimeValueSemantics.java     |  8 +++
 .../temporal/OffsetTimeValueSemantics.java         |  7 +++
 .../temporal/ZonedDateTimeValueSemantics.java      |  8 +++
 .../temporal/legacy/JavaSqlDateValueSemantics.java |  7 +++
 .../legacy/JavaSqlTimeStampValueSemantics.java     |  8 +++
 .../temporal/legacy/JavaSqlTimeValueSemantics.java |  8 +++
 .../legacy/JavaUtilDateValueSemantics.java         |  8 +++
 .../secman/applib/user/dom/ApplicationUser.java    | 28 +++++++++
 .../dom/mixins/ApplicationUser_updateLocale.java   | 72 ++++++++++++++++++++++
 .../secman/jdo/user/dom/ApplicationUser.java       | 37 +++++++----
 .../secman/jpa/user/dom/ApplicationUser.java       | 15 +++++
 extensions/vw/fullcalendar/applib/pom.xml          |  5 ++
 .../value/CalendarEventSemanticsProvider.java      | 12 +++-
 .../model/valuetypes/ValueTypeExample.java         | 12 ++++
 .../model/valuetypes/ValueTypeExampleService.java  | 10 +--
 .../semantics/AsciiDocValueSemantics.java          |  8 +++
 .../valuesemantics/JodaDateTimeValueSemantics.java |  8 +++
 .../JodaLocalDateTimeValueSemantics.java           |  9 +++
 .../JodaLocalDateValueSemantics.java               |  9 +++
 .../JodaLocalTimeValueSemantics.java               |  9 +++
 .../semantics/MarkdownValueSemantics.java          |  8 +++
 53 files changed, 556 insertions(+), 42 deletions(-)

diff --git a/api/applib/src/main/java/org/apache/isis/applib/value/semantics/ValueSemanticsAbstract.java b/api/applib/src/main/java/org/apache/isis/applib/value/semantics/ValueSemanticsAbstract.java
index 9adb8c2..2ba58fd 100644
--- a/api/applib/src/main/java/org/apache/isis/applib/value/semantics/ValueSemanticsAbstract.java
+++ b/api/applib/src/main/java/org/apache/isis/applib/value/semantics/ValueSemanticsAbstract.java
@@ -35,6 +35,7 @@ import org.springframework.lang.Nullable;
 
 import org.apache.isis.applib.exceptions.recoverable.TextEntryParseException;
 import org.apache.isis.applib.services.iactnlayer.InteractionContext;
+import org.apache.isis.commons.collections.Can;
 import org.apache.isis.commons.internal.base._Strings;
 import org.apache.isis.commons.internal.exceptions._Exceptions;
 import org.apache.isis.schema.common.v2.ValueType;
@@ -89,6 +90,11 @@ implements
     }
 
     /**
+     * JUnit support.
+     */
+    public Can<T> getExamples() { return Can.empty(); }
+
+    /**
      * @param context - nullable in support of JUnit testing
      * @return {@link Locale} from given context or else system's default
      */
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/IsisModuleCoreMetamodel.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/IsisModuleCoreMetamodel.java
index 50a68a0..8354c8e 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/IsisModuleCoreMetamodel.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/IsisModuleCoreMetamodel.java
@@ -64,6 +64,7 @@ import org.apache.isis.core.metamodel.valuesemantics.FloatValueSemantics;
 import org.apache.isis.core.metamodel.valuesemantics.IntValueSemantics;
 import org.apache.isis.core.metamodel.valuesemantics.InteractionDtoValueSemantics;
 import org.apache.isis.core.metamodel.valuesemantics.LocalResourcePathValueSemantics;
+import org.apache.isis.core.metamodel.valuesemantics.LocaleValueSemantics;
 import org.apache.isis.core.metamodel.valuesemantics.LongValueSemantics;
 import org.apache.isis.core.metamodel.valuesemantics.MarkupValueSemantics;
 import org.apache.isis.core.metamodel.valuesemantics.OidDtoValueSemantics;
@@ -127,6 +128,7 @@ import org.apache.isis.core.security.IsisModuleCoreSecurity;
         BookmarkValueSemantics.class,
         OidDtoValueSemantics.class,
         UUIDValueSemantics.class,
+        LocaleValueSemantics.class,
         TreeNodeValueSemantics.class,
         ChangesDtoValueSemantics.class,
         CommandDtoValueSemantics.class,
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/valuesemantics/BigDecimalValueSemantics.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/valuesemantics/BigDecimalValueSemantics.java
index 345b1fe..26eedca 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/valuesemantics/BigDecimalValueSemantics.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/valuesemantics/BigDecimalValueSemantics.java
@@ -33,6 +33,7 @@ import org.apache.isis.applib.value.semantics.Parser;
 import org.apache.isis.applib.value.semantics.Renderer;
 import org.apache.isis.applib.value.semantics.ValueSemanticsAbstract;
 import org.apache.isis.applib.value.semantics.ValueSemanticsProvider;
+import org.apache.isis.commons.collections.Can;
 import org.apache.isis.core.metamodel.facets.objectvalue.digits.MaxFractionalDigitsFacet;
 import org.apache.isis.core.metamodel.specloader.SpecificationLoader;
 import org.apache.isis.schema.common.v2.ValueType;
@@ -131,4 +132,9 @@ implements
             format.setMaximumFractionDigits(digits));
     }
 
+    @Override
+    public Can<BigDecimal> getExamples() {
+        return Can.of(new BigDecimal("-63.1"), BigDecimal.ZERO);
+    }
+
 }
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/valuesemantics/BigIntegerValueSemantics.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/valuesemantics/BigIntegerValueSemantics.java
index e874397..e423752 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/valuesemantics/BigIntegerValueSemantics.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/valuesemantics/BigIntegerValueSemantics.java
@@ -29,6 +29,7 @@ import org.apache.isis.applib.value.semantics.EncoderDecoder;
 import org.apache.isis.applib.value.semantics.Parser;
 import org.apache.isis.applib.value.semantics.Renderer;
 import org.apache.isis.applib.value.semantics.ValueSemanticsAbstract;
+import org.apache.isis.commons.collections.Can;
 import org.apache.isis.schema.common.v2.ValueType;
 
 @Component
@@ -95,4 +96,9 @@ implements
         return 10;
     }
 
+    @Override
+    public Can<BigInteger> getExamples() {
+        return Can.of(BigInteger.valueOf(-63L), BigInteger.ZERO);
+    }
+
 }
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/valuesemantics/BlobValueSemantics.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/valuesemantics/BlobValueSemantics.java
index 00a2bb3..596f18f 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/valuesemantics/BlobValueSemantics.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/valuesemantics/BlobValueSemantics.java
@@ -28,10 +28,12 @@ import javax.inject.Named;
 import org.springframework.stereotype.Component;
 
 import org.apache.isis.applib.value.Blob;
+import org.apache.isis.applib.value.NamedWithMimeType.CommonMimeType;
 import org.apache.isis.applib.value.semantics.EncoderDecoder;
 import org.apache.isis.applib.value.semantics.Renderer;
 import org.apache.isis.applib.value.semantics.ValueSemanticsAbstract;
 import org.apache.isis.applib.value.semantics.ValueSemanticsProvider;
+import org.apache.isis.commons.collections.Can;
 import org.apache.isis.commons.internal.base._Bytes;
 import org.apache.isis.commons.internal.base._Strings;
 import org.apache.isis.schema.common.v2.ValueType;
@@ -84,4 +86,11 @@ implements
         }
     }
 
+    @Override
+    public Can<Blob> getExamples() {
+        return Can.of(
+                Blob.of("a Blob", CommonMimeType.BIN, new byte[] {1, 2, 3}),
+                Blob.of("another Blob", CommonMimeType.BIN, new byte[] {3, 4}));
+    }
+
 }
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/valuesemantics/BookmarkValueSemantics.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/valuesemantics/BookmarkValueSemantics.java
index d59ea45..9499d8c 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/valuesemantics/BookmarkValueSemantics.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/valuesemantics/BookmarkValueSemantics.java
@@ -29,6 +29,7 @@ import org.apache.isis.applib.value.semantics.Parser;
 import org.apache.isis.applib.value.semantics.Renderer;
 import org.apache.isis.applib.value.semantics.ValueSemanticsAbstract;
 import org.apache.isis.applib.value.semantics.ValueSemanticsProvider;
+import org.apache.isis.commons.collections.Can;
 import org.apache.isis.commons.internal.base._Strings;
 import org.apache.isis.schema.common.v2.ValueType;
 
@@ -123,4 +124,11 @@ implements
         return 4048;
     }
 
+    @Override
+    public Can<Bookmark> getExamples() {
+        return Can.of(
+                Bookmark.parseElseFail("a:b"),
+                Bookmark.parseElseFail("c:d"));
+    }
+
 }
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/valuesemantics/BooleanValueSemantics.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/valuesemantics/BooleanValueSemantics.java
index 8c037ae..8a4b59c 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/valuesemantics/BooleanValueSemantics.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/valuesemantics/BooleanValueSemantics.java
@@ -30,6 +30,7 @@ import org.apache.isis.applib.value.semantics.Parser;
 import org.apache.isis.applib.value.semantics.Renderer;
 import org.apache.isis.applib.value.semantics.ValueSemanticsAbstract;
 import org.apache.isis.applib.value.semantics.ValueSemanticsProvider;
+import org.apache.isis.commons.collections.Can;
 import org.apache.isis.commons.internal.base._Strings;
 import org.apache.isis.schema.common.v2.ValueType;
 
@@ -140,4 +141,9 @@ implements
         return 6;
     }
 
+    @Override
+    public Can<Boolean> getExamples() {
+        return Can.of(Boolean.TRUE, Boolean.FALSE);
+    }
+
 }
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/valuesemantics/BufferedImageValueSemantics.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/valuesemantics/BufferedImageValueSemantics.java
index 53b2f9a..840ca01 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/valuesemantics/BufferedImageValueSemantics.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/valuesemantics/BufferedImageValueSemantics.java
@@ -29,6 +29,7 @@ import org.springframework.stereotype.Component;
 import org.apache.isis.applib.value.semantics.EncoderDecoder;
 import org.apache.isis.applib.value.semantics.OrderRelation;
 import org.apache.isis.applib.value.semantics.ValueSemanticsAbstract;
+import org.apache.isis.commons.collections.Can;
 import org.apache.isis.commons.internal.base._Strings;
 import org.apache.isis.commons.internal.image._Images;
 import org.apache.isis.core.metamodel.spec.ManagedObject;
@@ -119,7 +120,11 @@ implements
         /*sonar-ignore-off*/
     }
 
-
-
+    @Override
+    public Can<BufferedImage> getExamples() {
+        return Can.of(
+                new BufferedImage(4, 4, BufferedImage.TYPE_INT_RGB),
+                new BufferedImage(8, 8, BufferedImage.TYPE_INT_RGB));
+    }
 
 }
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/valuesemantics/ByteValueSemantics.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/valuesemantics/ByteValueSemantics.java
index b8b313c..6a610f4 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/valuesemantics/ByteValueSemantics.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/valuesemantics/ByteValueSemantics.java
@@ -28,6 +28,7 @@ import org.apache.isis.applib.value.semantics.EncoderDecoder;
 import org.apache.isis.applib.value.semantics.Parser;
 import org.apache.isis.applib.value.semantics.Renderer;
 import org.apache.isis.applib.value.semantics.ValueSemanticsAbstract;
+import org.apache.isis.commons.collections.Can;
 import org.apache.isis.commons.internal.base._Strings;
 import org.apache.isis.schema.common.v2.ValueType;
 
@@ -115,4 +116,11 @@ implements
         return 6;
     }
 
+    @Override
+    public Can<Byte> getExamples() {
+        return Can.of(
+                Byte.MIN_VALUE,
+                Byte.MAX_VALUE);
+    }
+
 }
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/valuesemantics/ChangesDtoValueSemantics.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/valuesemantics/ChangesDtoValueSemantics.java
index d0ef62d..1d21c0f 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/valuesemantics/ChangesDtoValueSemantics.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/valuesemantics/ChangesDtoValueSemantics.java
@@ -26,6 +26,7 @@ import org.apache.isis.applib.util.schema.ChangesDtoUtils;
 import org.apache.isis.applib.value.semantics.EncoderDecoder;
 import org.apache.isis.applib.value.semantics.Renderer;
 import org.apache.isis.applib.value.semantics.ValueSemanticsAbstract;
+import org.apache.isis.commons.collections.Can;
 import org.apache.isis.schema.chg.v2.ChangesDto;
 import org.apache.isis.schema.common.v2.ValueType;
 
@@ -66,4 +67,9 @@ implements
         return render(value, ChangesDtoUtils::toXml);
     }
 
+    @Override
+    public Can<ChangesDto> getExamples() {
+        return Can.of(new ChangesDto(), new ChangesDto());
+    }
+
 }
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/valuesemantics/CharacterValueSemantics.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/valuesemantics/CharacterValueSemantics.java
index 14666dd..3b00f28 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/valuesemantics/CharacterValueSemantics.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/valuesemantics/CharacterValueSemantics.java
@@ -28,6 +28,7 @@ import org.apache.isis.applib.value.semantics.EncoderDecoder;
 import org.apache.isis.applib.value.semantics.Parser;
 import org.apache.isis.applib.value.semantics.Renderer;
 import org.apache.isis.applib.value.semantics.ValueSemanticsAbstract;
+import org.apache.isis.commons.collections.Can;
 import org.apache.isis.commons.internal.base._Strings;
 import org.apache.isis.schema.common.v2.ValueType;
 
@@ -110,5 +111,9 @@ implements
         return 1;
     }
 
+    @Override
+    public Can<Character> getExamples() {
+        return Can.of('a', 'b');
+    }
 
 }
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/valuesemantics/ClobValueSemantics.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/valuesemantics/ClobValueSemantics.java
index 35241ea..fbcd3cf 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/valuesemantics/ClobValueSemantics.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/valuesemantics/ClobValueSemantics.java
@@ -25,10 +25,12 @@ import javax.inject.Named;
 import org.springframework.stereotype.Component;
 
 import org.apache.isis.applib.value.Clob;
+import org.apache.isis.applib.value.NamedWithMimeType.CommonMimeType;
 import org.apache.isis.applib.value.semantics.EncoderDecoder;
 import org.apache.isis.applib.value.semantics.Renderer;
 import org.apache.isis.applib.value.semantics.ValueSemanticsAbstract;
 import org.apache.isis.applib.value.semantics.ValueSemanticsProvider;
+import org.apache.isis.commons.collections.Can;
 import org.apache.isis.schema.common.v2.ValueType;
 
 @Component
@@ -77,4 +79,11 @@ implements
         }
     }
 
+    @Override
+    public Can<Clob> getExamples() {
+        return Can.of(
+                Clob.of("a Clob", CommonMimeType.TXT, "abc"),
+                Clob.of("another Clob", CommonMimeType.TXT, "ef"));
+    }
+
 }
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/valuesemantics/CommandDtoValueSemantics.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/valuesemantics/CommandDtoValueSemantics.java
index 369ff34..06bc345 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/valuesemantics/CommandDtoValueSemantics.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/valuesemantics/CommandDtoValueSemantics.java
@@ -26,6 +26,7 @@ import org.apache.isis.applib.util.schema.CommandDtoUtils;
 import org.apache.isis.applib.value.semantics.EncoderDecoder;
 import org.apache.isis.applib.value.semantics.Renderer;
 import org.apache.isis.applib.value.semantics.ValueSemanticsAbstract;
+import org.apache.isis.commons.collections.Can;
 import org.apache.isis.schema.cmd.v2.CommandDto;
 import org.apache.isis.schema.common.v2.ValueType;
 
@@ -66,4 +67,9 @@ implements
         return render(value, CommandDtoUtils::toXml);
     }
 
+    @Override
+    public Can<CommandDto> getExamples() {
+        return Can.of(new CommandDto(), new CommandDto());
+    }
+
 }
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/valuesemantics/DoubleValueSemantics.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/valuesemantics/DoubleValueSemantics.java
index 720201f..603eea2 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/valuesemantics/DoubleValueSemantics.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/valuesemantics/DoubleValueSemantics.java
@@ -27,6 +27,7 @@ import org.apache.isis.applib.value.semantics.EncoderDecoder;
 import org.apache.isis.applib.value.semantics.Parser;
 import org.apache.isis.applib.value.semantics.Renderer;
 import org.apache.isis.applib.value.semantics.ValueSemanticsAbstract;
+import org.apache.isis.commons.collections.Can;
 import org.apache.isis.schema.common.v2.ValueType;
 
 import lombok.val;
@@ -109,5 +110,10 @@ implements
         return 25;
     }
 
+    @Override
+    public Can<Double> getExamples() {
+        return Can.of(Double.MIN_VALUE, Double.MAX_VALUE);
+    }
+
 
 }
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/valuesemantics/EnumValueSemanticsAbstract.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/valuesemantics/EnumValueSemanticsAbstract.java
index fb9e7ad..95fb8c9 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/valuesemantics/EnumValueSemanticsAbstract.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/valuesemantics/EnumValueSemanticsAbstract.java
@@ -33,6 +33,7 @@ import org.apache.isis.applib.value.semantics.Parser;
 import org.apache.isis.applib.value.semantics.Renderer;
 import org.apache.isis.applib.value.semantics.ValueSemanticsAbstract;
 import org.apache.isis.applib.value.semantics.ValueSemanticsProvider;
+import org.apache.isis.commons.collections.Can;
 import org.apache.isis.commons.internal.base._Strings;
 import org.apache.isis.commons.internal.exceptions._Exceptions;
 import org.apache.isis.core.config.progmodel.ProgrammingModelConstants.ObjectSupportMethod;
@@ -200,4 +201,11 @@ implements
         return max;
     }
 
+    @Override
+    public Can<T> getExamples() {
+        return Stream.of(correspondingClass.getEnumConstants())
+                .limit(2)
+                .collect(Can.toCan());
+    }
+
 }
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/valuesemantics/FloatValueSemantics.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/valuesemantics/FloatValueSemantics.java
index e229622..8e9c255 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/valuesemantics/FloatValueSemantics.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/valuesemantics/FloatValueSemantics.java
@@ -27,6 +27,7 @@ import org.apache.isis.applib.value.semantics.EncoderDecoder;
 import org.apache.isis.applib.value.semantics.Parser;
 import org.apache.isis.applib.value.semantics.Renderer;
 import org.apache.isis.applib.value.semantics.ValueSemanticsAbstract;
+import org.apache.isis.commons.collections.Can;
 import org.apache.isis.schema.common.v2.ValueType;
 
 import lombok.val;
@@ -109,5 +110,10 @@ implements
         return 20;
     }
 
+    @Override
+    public Can<Float> getExamples() {
+        return Can.of(Float.MIN_VALUE, Float.MAX_VALUE);
+    }
+
 
 }
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/valuesemantics/IntValueSemantics.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/valuesemantics/IntValueSemantics.java
index c664968..bd1712a 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/valuesemantics/IntValueSemantics.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/valuesemantics/IntValueSemantics.java
@@ -28,6 +28,7 @@ import org.apache.isis.applib.value.semantics.EncoderDecoder;
 import org.apache.isis.applib.value.semantics.Parser;
 import org.apache.isis.applib.value.semantics.Renderer;
 import org.apache.isis.applib.value.semantics.ValueSemanticsAbstract;
+import org.apache.isis.commons.collections.Can;
 import org.apache.isis.commons.internal.base._Strings;
 import org.apache.isis.schema.common.v2.ValueType;
 
@@ -115,4 +116,9 @@ implements
         return 16;
     }
 
+    @Override
+    public Can<Integer> getExamples() {
+        return Can.of(Integer.MIN_VALUE, Integer.MAX_VALUE);
+    }
+
 }
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/valuesemantics/InteractionDtoValueSemantics.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/valuesemantics/InteractionDtoValueSemantics.java
index efb854e..3417b21 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/valuesemantics/InteractionDtoValueSemantics.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/valuesemantics/InteractionDtoValueSemantics.java
@@ -26,6 +26,7 @@ import org.apache.isis.applib.util.schema.InteractionDtoUtils;
 import org.apache.isis.applib.value.semantics.EncoderDecoder;
 import org.apache.isis.applib.value.semantics.Renderer;
 import org.apache.isis.applib.value.semantics.ValueSemanticsAbstract;
+import org.apache.isis.commons.collections.Can;
 import org.apache.isis.schema.common.v2.ValueType;
 import org.apache.isis.schema.ixn.v2.InteractionDto;
 
@@ -66,4 +67,9 @@ implements
         return render(value, InteractionDtoUtils::toXml);
     }
 
+    @Override
+    public Can<InteractionDto> getExamples() {
+        return Can.of(new InteractionDto(), new InteractionDto());
+    }
+
 }
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/valuesemantics/LocalResourcePathValueSemantics.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/valuesemantics/LocalResourcePathValueSemantics.java
index cfb8fd0..8b146fe 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/valuesemantics/LocalResourcePathValueSemantics.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/valuesemantics/LocalResourcePathValueSemantics.java
@@ -29,6 +29,7 @@ import org.apache.isis.applib.value.semantics.EncoderDecoder;
 import org.apache.isis.applib.value.semantics.Parser;
 import org.apache.isis.applib.value.semantics.Renderer;
 import org.apache.isis.applib.value.semantics.ValueSemanticsAbstract;
+import org.apache.isis.commons.collections.Can;
 import org.apache.isis.commons.internal.base._Strings;
 import org.apache.isis.schema.common.v2.ValueType;
 
@@ -111,5 +112,12 @@ implements
         return 2083;
     }
 
+    @Override
+    public Can<LocalResourcePath> getExamples() {
+        return Can.of(
+                new LocalResourcePath("img/a"),
+                new LocalResourcePath("img/b"));
+    }
+
 
 }
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/LocaleValueSemantics.java
similarity index 56%
copy from core/metamodel/src/main/java/org/apache/isis/core/metamodel/valuesemantics/UUIDValueSemantics.java
copy to core/metamodel/src/main/java/org/apache/isis/core/metamodel/valuesemantics/LocaleValueSemantics.java
index 0be0511..a1c33ea 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/LocaleValueSemantics.java
@@ -18,7 +18,8 @@
  */
 package org.apache.isis.core.metamodel.valuesemantics;
 
-import java.util.UUID;
+import java.util.Locale;
+import java.util.stream.Stream;
 
 import javax.inject.Named;
 
@@ -29,23 +30,24 @@ import org.apache.isis.applib.value.semantics.Parser;
 import org.apache.isis.applib.value.semantics.Renderer;
 import org.apache.isis.applib.value.semantics.ValueSemanticsAbstract;
 import org.apache.isis.applib.value.semantics.ValueSemanticsProvider;
+import org.apache.isis.commons.collections.Can;
 import org.apache.isis.commons.internal.base._Strings;
 import org.apache.isis.schema.common.v2.ValueType;
 
 import lombok.val;
 
 @Component
-@Named("isis.val.UUIDValueSemantics")
-public class UUIDValueSemantics
-extends ValueSemanticsAbstract<UUID>
+@Named("isis.val.LocaleValueSemantics")
+public class LocaleValueSemantics
+extends ValueSemanticsAbstract<Locale>
 implements
-    EncoderDecoder<UUID>,
-    Parser<UUID>,
-    Renderer<UUID> {
+    EncoderDecoder<Locale>,
+    Parser<Locale>,
+    Renderer<Locale> {
 
     @Override
-    public Class<UUID> getCorrespondingClass() {
-        return UUID.class;
+    public Class<Locale> getCorrespondingClass() {
+        return Locale.class;
     }
 
     @Override
@@ -56,34 +58,34 @@ implements
     // -- ENCODER DECODER
 
     @Override
-    public String toEncodedString(final UUID object) {
-        return object.toString();
+    public String toEncodedString(final Locale object) {
+        return object.toLanguageTag();
     }
 
     @Override
-    public UUID fromEncodedString(final String data) {
-        return UUID.fromString(data);
+    public Locale fromEncodedString(final String data) {
+        return Locale.forLanguageTag(data);
     }
 
     // -- RENDERER
 
     @Override
-    public String simpleTextPresentation(final ValueSemanticsProvider.Context context, final UUID value) {
-        return value == null ? "" : value.toString();
+    public String simpleTextPresentation(final ValueSemanticsProvider.Context context, final Locale value) {
+        return value == null ? "" : value.getDisplayLanguage(context.getInteractionContext().getLocale());
     }
 
     // -- PARSER
 
     @Override
-    public String parseableTextRepresentation(final ValueSemanticsProvider.Context context, final UUID value) {
-        return value == null ? null : value.toString();
+    public String parseableTextRepresentation(final ValueSemanticsProvider.Context context, final Locale value) {
+        return value == null ? null : toEncodedString(value);
     }
 
     @Override
-    public UUID parseTextRepresentation(final ValueSemanticsProvider.Context context, final String text) {
+    public Locale parseTextRepresentation(final ValueSemanticsProvider.Context context, final String text) {
         val input = _Strings.blankToNullOrTrim(text);
         return input!=null
-                ? UUID.fromString(input)
+                ? fromEncodedString(input)
                 : null;
     }
 
@@ -94,10 +96,31 @@ implements
 
     @Override
     public int maxLength() {
-        return 36;
+        return 80;
+    }
+
+    // -- EXAMPLES
+
+    @Override
+    public Can<Locale> getExamples() {
+        return Can.of(Locale.US, Locale.GERMAN);
+    }
+
+    // -- UTILITY
+
+    /**
+     * Stream subset of {@link Locale#getAvailableLocales()} that supports round-tripping.
+     */
+    public static Stream<Locale> streamSupportedValues() {
+        return Stream.of(Locale.getAvailableLocales())
+                .filter(LocaleValueSemantics::isRoundtripSupported);
+    }
+
+    // -- HELPER
+
+    private static boolean isRoundtripSupported(final Locale locale) {
+        return locale.equals(Locale.forLanguageTag(locale.toLanguageTag()));
     }
 
-    //    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/core/metamodel/src/main/java/org/apache/isis/core/metamodel/valuesemantics/LongValueSemantics.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/valuesemantics/LongValueSemantics.java
index ea9772b..2d696ae 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/valuesemantics/LongValueSemantics.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/valuesemantics/LongValueSemantics.java
@@ -28,6 +28,7 @@ import org.apache.isis.applib.value.semantics.EncoderDecoder;
 import org.apache.isis.applib.value.semantics.Parser;
 import org.apache.isis.applib.value.semantics.Renderer;
 import org.apache.isis.applib.value.semantics.ValueSemanticsAbstract;
+import org.apache.isis.commons.collections.Can;
 import org.apache.isis.commons.internal.base._Strings;
 import org.apache.isis.schema.common.v2.ValueType;
 
@@ -115,4 +116,9 @@ implements
         return 28;
     }
 
+    @Override
+    public Can<Long> getExamples() {
+        return Can.of(Long.MIN_VALUE, Long.MAX_VALUE);
+    }
+
 }
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/valuesemantics/MarkupValueSemantics.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/valuesemantics/MarkupValueSemantics.java
index eac8f1a..00847de 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/valuesemantics/MarkupValueSemantics.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/valuesemantics/MarkupValueSemantics.java
@@ -28,6 +28,7 @@ import org.apache.isis.applib.value.semantics.Parser;
 import org.apache.isis.applib.value.semantics.Renderer;
 import org.apache.isis.applib.value.semantics.ValueSemanticsAbstract;
 import org.apache.isis.applib.value.semantics.ValueSemanticsProvider;
+import org.apache.isis.commons.collections.Can;
 import org.apache.isis.schema.common.v2.ValueType;
 
 @Component
@@ -91,5 +92,12 @@ implements
         return 0;
     }
 
+    @Override
+    public Can<Markup> getExamples() {
+        return Can.of(
+                Markup.valueOf("a Markup"),
+                Markup.valueOf("another Markup"));
+    }
+
 
 }
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/valuesemantics/OidDtoValueSemantics.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/valuesemantics/OidDtoValueSemantics.java
index 341f06d..4768aba 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/valuesemantics/OidDtoValueSemantics.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/valuesemantics/OidDtoValueSemantics.java
@@ -25,6 +25,7 @@ import org.springframework.stereotype.Component;
 
 import org.apache.isis.applib.services.bookmark.Bookmark;
 import org.apache.isis.applib.value.semantics.ValueSemanticsAbstract;
+import org.apache.isis.commons.collections.Can;
 import org.apache.isis.core.metamodel.valuetypes.ValueSemanticsAdapter;
 import org.apache.isis.schema.common.v2.OidDto;
 
@@ -55,4 +56,11 @@ extends ValueSemanticsAdapter<OidDto, Bookmark, Void> {
         return value!=null ? Bookmark.forOidDto(value) : null;
     }
 
+    @Override
+    public Can<OidDto> getExamples() {
+        return Can.of(
+                Bookmark.parseElseFail("a:b").toOidDto(),
+                Bookmark.parseElseFail("c:d").toOidDto());
+    }
+
 }
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/valuesemantics/PasswordValueSemantics.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/valuesemantics/PasswordValueSemantics.java
index c02c8c9..9202ad2 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/valuesemantics/PasswordValueSemantics.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/valuesemantics/PasswordValueSemantics.java
@@ -27,6 +27,7 @@ import org.apache.isis.applib.value.semantics.EncoderDecoder;
 import org.apache.isis.applib.value.semantics.Parser;
 import org.apache.isis.applib.value.semantics.Renderer;
 import org.apache.isis.applib.value.semantics.ValueSemanticsAbstract;
+import org.apache.isis.commons.collections.Can;
 import org.apache.isis.commons.internal.base._Strings;
 import org.apache.isis.schema.common.v2.ValueType;
 
@@ -94,4 +95,9 @@ implements
         return 12;
     }
 
+    @Override
+    public Can<Password> getExamples() {
+        return Can.of(Password.of("a Password"), Password.of("another Password"));
+    }
+
 }
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/valuesemantics/ShortValueSemantics.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/valuesemantics/ShortValueSemantics.java
index 8198507..e1eaab6 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/valuesemantics/ShortValueSemantics.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/valuesemantics/ShortValueSemantics.java
@@ -28,6 +28,7 @@ import org.apache.isis.applib.value.semantics.EncoderDecoder;
 import org.apache.isis.applib.value.semantics.Parser;
 import org.apache.isis.applib.value.semantics.Renderer;
 import org.apache.isis.applib.value.semantics.ValueSemanticsAbstract;
+import org.apache.isis.commons.collections.Can;
 import org.apache.isis.commons.internal.base._Strings;
 import org.apache.isis.schema.common.v2.ValueType;
 
@@ -115,4 +116,11 @@ implements
         return 9;
     }
 
+    @Override
+    public Can<Short> getExamples() {
+        return Can.of(
+                Short.MIN_VALUE,
+                Short.MAX_VALUE);
+    }
+
 }
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/valuesemantics/StringValueSemantics.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/valuesemantics/StringValueSemantics.java
index 4115551..3414287 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/valuesemantics/StringValueSemantics.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/valuesemantics/StringValueSemantics.java
@@ -26,6 +26,7 @@ import org.apache.isis.applib.value.semantics.EncoderDecoder;
 import org.apache.isis.applib.value.semantics.Parser;
 import org.apache.isis.applib.value.semantics.Renderer;
 import org.apache.isis.applib.value.semantics.ValueSemanticsAbstract;
+import org.apache.isis.commons.collections.Can;
 import org.apache.isis.schema.common.v2.ValueType;
 
 @Component
@@ -83,4 +84,9 @@ implements
         return 25;
     }
 
+    @Override
+    public Can<String> getExamples() {
+        return Can.of("a String", "another String");
+    }
+
 }
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/valuesemantics/TreeNodeValueSemantics.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/valuesemantics/TreeNodeValueSemantics.java
index 696081d..603404d 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/valuesemantics/TreeNodeValueSemantics.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/valuesemantics/TreeNodeValueSemantics.java
@@ -18,17 +18,22 @@
  */
 package org.apache.isis.core.metamodel.valuesemantics;
 
+import java.util.Optional;
+import java.util.stream.Stream;
+
 import javax.inject.Inject;
 import javax.inject.Named;
 
 import org.springframework.stereotype.Component;
 
+import org.apache.isis.applib.graph.tree.TreeAdapter;
 import org.apache.isis.applib.graph.tree.TreeNode;
 import org.apache.isis.applib.graph.tree.TreeState;
 import org.apache.isis.applib.services.urlencoding.UrlEncodingService;
 import org.apache.isis.applib.value.semantics.EncoderDecoder;
 import org.apache.isis.applib.value.semantics.Renderer;
 import org.apache.isis.applib.value.semantics.ValueSemanticsAbstract;
+import org.apache.isis.commons.collections.Can;
 import org.apache.isis.commons.internal.base._Casts;
 import org.apache.isis.commons.internal.memento._Mementos;
 import org.apache.isis.commons.internal.memento._Mementos.Memento;
@@ -85,6 +90,25 @@ implements
                 memento.get("treeState", TreeState.class));
     }
 
+    // -- EXAMPLES
+
+    @Override
+    public Can<TreeNode<?>> getExamples() {
+
+        class TreeAdapterString implements TreeAdapter<String> {
+            @Override public Optional<String> parentOf(final String value) {
+                return null; }
+            @Override public int childCountOf(final String value) {
+                return 0; }
+            @Override public Stream<String> childrenOf(final String value) {
+                return Stream.empty(); }
+        }
+
+        return Can.of(
+                TreeNode.of("TreeRoot", TreeAdapterString.class, TreeState.rootCollapsed()),
+                TreeNode.of("another TreeRoot", TreeAdapterString.class, TreeState.rootCollapsed()));
+    }
+
     // -- HELPER
 
     private _Mementos.Memento newMemento(){
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/valuesemantics/URLValueSemantics.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/valuesemantics/URLValueSemantics.java
index 5f74870..a3afe84 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/valuesemantics/URLValueSemantics.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/valuesemantics/URLValueSemantics.java
@@ -19,6 +19,7 @@
 package org.apache.isis.core.metamodel.valuesemantics;
 
 import java.net.MalformedURLException;
+import java.net.URL;
 
 import javax.inject.Named;
 
@@ -29,9 +30,11 @@ import org.apache.isis.applib.value.semantics.Parser;
 import org.apache.isis.applib.value.semantics.Renderer;
 import org.apache.isis.applib.value.semantics.ValueSemanticsAbstract;
 import org.apache.isis.applib.value.semantics.ValueSemanticsProvider;
+import org.apache.isis.commons.collections.Can;
 import org.apache.isis.commons.internal.base._Strings;
 import org.apache.isis.schema.common.v2.ValueType;
 
+import lombok.SneakyThrows;
 import lombok.val;
 
 @Component
@@ -109,4 +112,12 @@ implements
         return 2083;
     }
 
+    @SneakyThrows
+    @Override
+    public Can<URL> getExamples() {
+        return Can.of(
+                new URL("https://a.b.c"),
+                new URL("https://b.c.d"));
+    }
+
 }
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 0be0511..a92fc29 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
@@ -29,6 +29,7 @@ import org.apache.isis.applib.value.semantics.Parser;
 import org.apache.isis.applib.value.semantics.Renderer;
 import org.apache.isis.applib.value.semantics.ValueSemanticsAbstract;
 import org.apache.isis.applib.value.semantics.ValueSemanticsProvider;
+import org.apache.isis.commons.collections.Can;
 import org.apache.isis.commons.internal.base._Strings;
 import org.apache.isis.schema.common.v2.ValueType;
 
@@ -97,6 +98,13 @@ implements
         return 36;
     }
 
+    @Override
+    public Can<UUID> getExamples() {
+        return Can.of(
+                UUID.randomUUID(),
+                UUID.randomUUID());
+    }
+
     //    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/core/metamodel/src/main/java/org/apache/isis/core/metamodel/valuesemantics/temporal/LocalDateTimeValueSemantics.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/valuesemantics/temporal/LocalDateTimeValueSemantics.java
index f8f1d7e..7ae71c4 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/valuesemantics/temporal/LocalDateTimeValueSemantics.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/valuesemantics/temporal/LocalDateTimeValueSemantics.java
@@ -26,6 +26,7 @@ import javax.inject.Named;
 import org.springframework.stereotype.Component;
 
 import org.apache.isis.applib.value.semantics.OrderRelation;
+import org.apache.isis.commons.collections.Can;
 import org.apache.isis.schema.common.v2.ValueType;
 
 @Component
@@ -62,4 +63,11 @@ implements OrderRelation<LocalDateTime, Duration> {
         return ALMOST_A_SECOND;
     }
 
+    @Override
+    public Can<LocalDateTime> getExamples() {
+        return Can.of(
+                LocalDateTime.now(),
+                LocalDateTime.now().plusDays(2).plusSeconds(15));
+    }
+
 }
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/valuesemantics/temporal/LocalDateValueSemantics.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/valuesemantics/temporal/LocalDateValueSemantics.java
index f9f92ea..1a2ca76 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/valuesemantics/temporal/LocalDateValueSemantics.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/valuesemantics/temporal/LocalDateValueSemantics.java
@@ -26,6 +26,7 @@ import javax.inject.Named;
 import org.springframework.stereotype.Component;
 
 import org.apache.isis.applib.value.semantics.OrderRelation;
+import org.apache.isis.commons.collections.Can;
 import org.apache.isis.schema.common.v2.ValueType;
 
 @Component
@@ -62,4 +63,11 @@ implements OrderRelation<LocalDate, Duration> {
         return Duration.ZERO; // not used for dates, as these are integer based
     }
 
+    @Override
+    public Can<LocalDate> getExamples() {
+        return Can.of(
+                LocalDate.now(),
+                LocalDate.now().plusDays(2));
+    }
+
 }
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/valuesemantics/temporal/LocalTimeValueSemantics.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/valuesemantics/temporal/LocalTimeValueSemantics.java
index 24f236b..f5dfd9c 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/valuesemantics/temporal/LocalTimeValueSemantics.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/valuesemantics/temporal/LocalTimeValueSemantics.java
@@ -25,6 +25,7 @@ import javax.inject.Named;
 
 import org.springframework.stereotype.Component;
 
+import org.apache.isis.commons.collections.Can;
 import org.apache.isis.schema.common.v2.ValueType;
 
 @Component
@@ -60,4 +61,11 @@ extends TemporalValueSemanticsProvider<LocalTime> {
         return ALMOST_A_SECOND;
     }
 
+    @Override
+    public Can<LocalTime> getExamples() {
+        return Can.of(
+                LocalTime.now(),
+                LocalTime.now().plusSeconds(15));
+    }
+
 }
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/valuesemantics/temporal/OffsetDateTimeValueSemantics.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/valuesemantics/temporal/OffsetDateTimeValueSemantics.java
index e64168b..fd22054 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/valuesemantics/temporal/OffsetDateTimeValueSemantics.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/valuesemantics/temporal/OffsetDateTimeValueSemantics.java
@@ -25,6 +25,7 @@ import javax.inject.Named;
 
 import org.springframework.stereotype.Component;
 
+import org.apache.isis.commons.collections.Can;
 import org.apache.isis.schema.common.v2.ValueType;
 
 @Component
@@ -60,4 +61,11 @@ extends TemporalValueSemanticsProvider<OffsetDateTime> {
         return ALMOST_A_SECOND;
     }
 
+    @Override
+    public Can<OffsetDateTime> getExamples() {
+        return Can.of(
+                OffsetDateTime.now(),
+                OffsetDateTime.now().plusDays(2).plusSeconds(15));
+    }
+
 }
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/valuesemantics/temporal/OffsetTimeValueSemantics.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/valuesemantics/temporal/OffsetTimeValueSemantics.java
index 8ae0eb6..fcecaf3 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/valuesemantics/temporal/OffsetTimeValueSemantics.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/valuesemantics/temporal/OffsetTimeValueSemantics.java
@@ -25,6 +25,7 @@ import javax.inject.Named;
 
 import org.springframework.stereotype.Component;
 
+import org.apache.isis.commons.collections.Can;
 import org.apache.isis.schema.common.v2.ValueType;
 
 @Component
@@ -60,5 +61,11 @@ extends TemporalValueSemanticsProvider<OffsetTime> {
         return ALMOST_A_SECOND;
     }
 
+    @Override
+    public Can<OffsetTime> getExamples() {
+        return Can.of(
+                OffsetTime.now(),
+                OffsetTime.now().plusSeconds(15));
+    }
 
 }
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/valuesemantics/temporal/ZonedDateTimeValueSemantics.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/valuesemantics/temporal/ZonedDateTimeValueSemantics.java
index 33db215..12ba84b 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/valuesemantics/temporal/ZonedDateTimeValueSemantics.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/valuesemantics/temporal/ZonedDateTimeValueSemantics.java
@@ -25,6 +25,7 @@ import javax.inject.Named;
 
 import org.springframework.stereotype.Component;
 
+import org.apache.isis.commons.collections.Can;
 import org.apache.isis.schema.common.v2.ValueType;
 
 @Component
@@ -60,4 +61,11 @@ extends TemporalValueSemanticsProvider<ZonedDateTime> {
         return ALMOST_A_SECOND;
     }
 
+    @Override
+    public Can<ZonedDateTime> getExamples() {
+        return Can.of(
+                ZonedDateTime.now(),
+                ZonedDateTime.now().plusDays(2).plusSeconds(15));
+    }
+
 }
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/valuesemantics/temporal/legacy/JavaSqlDateValueSemantics.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/valuesemantics/temporal/legacy/JavaSqlDateValueSemantics.java
index 2c1420b..0433a7c 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/valuesemantics/temporal/legacy/JavaSqlDateValueSemantics.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/valuesemantics/temporal/legacy/JavaSqlDateValueSemantics.java
@@ -27,6 +27,7 @@ import javax.inject.Named;
 import org.springframework.stereotype.Component;
 
 import org.apache.isis.applib.value.semantics.ValueSemanticsAbstract;
+import org.apache.isis.commons.collections.Can;
 import org.apache.isis.core.metamodel.valuesemantics.temporal.LocalDateValueSemantics;
 import org.apache.isis.core.metamodel.valuetypes.TemporalSemanticsAdapter;
 
@@ -63,5 +64,11 @@ extends TemporalSemanticsAdapter<Date, LocalDate> {
         return value.toLocalDate();
     }
 
+    @Override
+    public Can<Date> getExamples() {
+        return Can.of(
+                new java.sql.Date(new java.util.Date().getTime()),
+                new java.sql.Date(0L));
+    }
 
 }
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/valuesemantics/temporal/legacy/JavaSqlTimeStampValueSemantics.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/valuesemantics/temporal/legacy/JavaSqlTimeStampValueSemantics.java
index 997dd86..d1677eb 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/valuesemantics/temporal/legacy/JavaSqlTimeStampValueSemantics.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/valuesemantics/temporal/legacy/JavaSqlTimeStampValueSemantics.java
@@ -27,6 +27,7 @@ import javax.inject.Named;
 import org.springframework.stereotype.Component;
 
 import org.apache.isis.applib.value.semantics.ValueSemanticsAbstract;
+import org.apache.isis.commons.collections.Can;
 import org.apache.isis.core.metamodel.valuesemantics.temporal.LocalDateTimeValueSemantics;
 import org.apache.isis.core.metamodel.valuetypes.TemporalSemanticsAdapter;
 
@@ -57,4 +58,11 @@ extends TemporalSemanticsAdapter<Timestamp, LocalDateTime> {
         return value.toLocalDateTime();
     }
 
+    @Override
+    public Can<Timestamp> getExamples() {
+        return Can.of(
+                new Timestamp(new java.util.Date().getTime()),
+                new Timestamp(0L));
+    }
+
 }
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/valuesemantics/temporal/legacy/JavaSqlTimeValueSemantics.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/valuesemantics/temporal/legacy/JavaSqlTimeValueSemantics.java
index 2abba15..cfe07dd 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/valuesemantics/temporal/legacy/JavaSqlTimeValueSemantics.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/valuesemantics/temporal/legacy/JavaSqlTimeValueSemantics.java
@@ -27,6 +27,7 @@ import javax.inject.Named;
 import org.springframework.stereotype.Component;
 
 import org.apache.isis.applib.value.semantics.ValueSemanticsAbstract;
+import org.apache.isis.commons.collections.Can;
 import org.apache.isis.core.metamodel.valuesemantics.temporal.LocalTimeValueSemantics;
 import org.apache.isis.core.metamodel.valuetypes.TemporalSemanticsAdapter;
 
@@ -61,4 +62,11 @@ extends TemporalSemanticsAdapter<Time, LocalTime>  {
         return value.toLocalTime();
     }
 
+    @Override
+    public Can<Time> getExamples() {
+        return Can.of(
+                new java.sql.Time(new java.util.Date().getTime()),
+                new java.sql.Time(0L));
+    }
+
 }
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/valuesemantics/temporal/legacy/JavaUtilDateValueSemantics.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/valuesemantics/temporal/legacy/JavaUtilDateValueSemantics.java
index 8d9ccc0..128a626 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/valuesemantics/temporal/legacy/JavaUtilDateValueSemantics.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/valuesemantics/temporal/legacy/JavaUtilDateValueSemantics.java
@@ -28,6 +28,7 @@ import javax.inject.Named;
 import org.springframework.stereotype.Component;
 
 import org.apache.isis.applib.value.semantics.ValueSemanticsAbstract;
+import org.apache.isis.commons.collections.Can;
 import org.apache.isis.core.metamodel.valuesemantics.temporal.LocalDateTimeValueSemantics;
 import org.apache.isis.core.metamodel.valuetypes.TemporalSemanticsAdapter;
 
@@ -68,4 +69,11 @@ extends TemporalSemanticsAdapter<java.util.Date, LocalDateTime>  {
                         value.toInstant(), ZoneId.systemDefault());
     }
 
+    @Override
+    public Can<Date> getExamples() {
+        return Can.of(
+                new java.util.Date(),
+                new java.util.Date(0L));
+    }
+
 }
diff --git a/extensions/security/secman/applib/src/main/java/org/apache/isis/extensions/secman/applib/user/dom/ApplicationUser.java b/extensions/security/secman/applib/src/main/java/org/apache/isis/extensions/secman/applib/user/dom/ApplicationUser.java
index 5282c8a..052311b 100644
--- a/extensions/security/secman/applib/src/main/java/org/apache/isis/extensions/secman/applib/user/dom/ApplicationUser.java
+++ b/extensions/security/secman/applib/src/main/java/org/apache/isis/extensions/secman/applib/user/dom/ApplicationUser.java
@@ -23,6 +23,7 @@ import java.lang.annotation.Retention;
 import java.lang.annotation.RetentionPolicy;
 import java.lang.annotation.Target;
 import java.util.List;
+import java.util.Locale;
 import java.util.Objects;
 import java.util.Set;
 
@@ -386,6 +387,33 @@ public abstract class ApplicationUser
     public abstract String getFaxNumber();
     public abstract void setFaxNumber(String faxNumber);
 
+    // -- LOCALE
+
+    @Property(
+            domainEvent = UserLocale.DomainEvent.class,
+            editing = Editing.ENABLED,
+            maxLength = UserLocale.MAX_LENGTH
+    )
+    @PropertyLayout(
+            fieldSetId = "identity",
+            sequence = "2"
+    )
+    @Parameter(
+            optionality = Optionality.OPTIONAL
+    )
+    @ParameterLayout(
+            named = "Locale"
+    )
+    @Target({ ElementType.METHOD, ElementType.FIELD, ElementType.PARAMETER, ElementType.ANNOTATION_TYPE })
+    @Retention(RetentionPolicy.RUNTIME)
+    public @interface UserLocale {
+        int MAX_LENGTH = 120;
+        class DomainEvent extends PropertyDomainEvent<Locale> {}
+    }
+
+    @UserLocale
+    public abstract Locale getLocale();
+    public abstract void setLocale(Locale locale);
 
     // -- AT PATH
 
diff --git a/extensions/security/secman/applib/src/main/java/org/apache/isis/extensions/secman/applib/user/dom/mixins/ApplicationUser_updateLocale.java b/extensions/security/secman/applib/src/main/java/org/apache/isis/extensions/secman/applib/user/dom/mixins/ApplicationUser_updateLocale.java
new file mode 100644
index 0000000..bf79eb7
--- /dev/null
+++ b/extensions/security/secman/applib/src/main/java/org/apache/isis/extensions/secman/applib/user/dom/mixins/ApplicationUser_updateLocale.java
@@ -0,0 +1,72 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ */
+package org.apache.isis.extensions.secman.applib.user.dom.mixins;
+
+import java.util.List;
+import java.util.Locale;
+import java.util.stream.Collectors;
+
+import org.apache.isis.applib.annotation.Action;
+import org.apache.isis.applib.annotation.ActionLayout;
+import org.apache.isis.applib.annotation.MemberSupport;
+import org.apache.isis.applib.annotation.MinLength;
+import org.apache.isis.applib.annotation.PromptStyle;
+import org.apache.isis.applib.annotation.SemanticsOf;
+import org.apache.isis.core.metamodel.valuesemantics.LocaleValueSemantics;
+import org.apache.isis.extensions.secman.applib.IsisModuleExtSecmanApplib;
+import org.apache.isis.extensions.secman.applib.user.dom.ApplicationUser;
+import org.apache.isis.extensions.secman.applib.user.dom.mixins.ApplicationUser_updateLocale.DomainEvent;
+
+import lombok.RequiredArgsConstructor;
+
+@Action(
+        domainEvent = DomainEvent.class,
+        semantics = SemanticsOf.IDEMPOTENT
+)
+@ActionLayout(
+        associateWith = "locale",
+        promptStyle = PromptStyle.INLINE_AS_IF_EDIT,
+        sequence = "1"
+)
+@RequiredArgsConstructor
+public class ApplicationUser_updateLocale {
+
+    public static class DomainEvent
+            extends IsisModuleExtSecmanApplib.ActionDomainEvent<ApplicationUser_updateLocale> {}
+
+    private final ApplicationUser target;
+
+    @MemberSupport public ApplicationUser act(
+            final Locale locale) {
+        target.setLocale(locale);
+        return target;
+    }
+
+    @MemberSupport public String disableAct() {
+        return target.isForSelfOrRunAsAdministrator()? null: "Can only update your own user record.";
+    }
+    @MemberSupport public Locale defaultLocale() { return target.getLocale(); }
+
+    @MemberSupport public List<Locale> autoCompleteLocale(@MinLength(1) final String search) {
+        return LocaleValueSemantics.streamSupportedValues()
+                .filter(locale->locale.toLanguageTag().toLowerCase().contains(search.toLowerCase()))
+                .collect(Collectors.toList());
+    }
+
+}
diff --git a/extensions/security/secman/persistence-jdo/src/main/java/org/apache/isis/extensions/secman/jdo/user/dom/ApplicationUser.java b/extensions/security/secman/persistence-jdo/src/main/java/org/apache/isis/extensions/secman/jdo/user/dom/ApplicationUser.java
index c651265..2d1d7f4 100644
--- a/extensions/security/secman/persistence-jdo/src/main/java/org/apache/isis/extensions/secman/jdo/user/dom/ApplicationUser.java
+++ b/extensions/security/secman/persistence-jdo/src/main/java/org/apache/isis/extensions/secman/jdo/user/dom/ApplicationUser.java
@@ -18,6 +18,7 @@
  */
 package org.apache.isis.extensions.secman.jdo.user.dom;
 
+import java.util.Locale;
 import java.util.SortedSet;
 import java.util.TreeSet;
 
@@ -112,7 +113,7 @@ public class ApplicationUser
         return username;
     }
     @Override
-    public void setUsername(String username) { this.username = username; }
+    public void setUsername(final String username) { this.username = username; }
 
 
     // -- FAMILY NAME
@@ -126,7 +127,7 @@ public class ApplicationUser
         return familyName;
     }
     @Override
-    public void setFamilyName(String familyName) {
+    public void setFamilyName(final String familyName) {
         this.familyName = familyName;
     }
 
@@ -142,7 +143,7 @@ public class ApplicationUser
         return givenName;
     }
     @Override
-    public void setGivenName(String givenName) {
+    public void setGivenName(final String givenName) {
         this.givenName = givenName;
     }
 
@@ -158,7 +159,7 @@ public class ApplicationUser
         return knownAs;
     }
     @Override
-    public void setKnownAs(String knownAs) {
+    public void setKnownAs(final String knownAs) {
         this.knownAs = knownAs;
     }
 
@@ -174,7 +175,7 @@ public class ApplicationUser
         return emailAddress;
     }
     @Override
-    public void setEmailAddress(String emailAddress) {
+    public void setEmailAddress(final String emailAddress) {
         this.emailAddress = emailAddress;
     }
 
@@ -190,7 +191,7 @@ public class ApplicationUser
         return phoneNumber;
     }
     @Override
-    public void setPhoneNumber(String phoneNumber) {
+    public void setPhoneNumber(final String phoneNumber) {
         this.phoneNumber = phoneNumber;
     }
 
@@ -206,10 +207,24 @@ public class ApplicationUser
         return faxNumber;
     }
     @Override
-    public void setFaxNumber(String faxNumber) {
+    public void setFaxNumber(final String faxNumber) {
         this.faxNumber = faxNumber;
     }
 
+    // -- LOCALE
+
+    @Column(allowsNull="true")
+    private Locale locale;
+
+    @UserLocale
+    @Override
+    public Locale getLocale() {
+        return locale;
+    }
+    @Override
+    public void setLocale(final Locale locale) {
+        this.locale = locale;
+    }
 
     // -- AT PATH
 
@@ -222,7 +237,7 @@ public class ApplicationUser
         return atPath;
     }
     @Override
-    public void setAtPath(String atPath) {
+    public void setAtPath(final String atPath) {
         this.atPath = atPath;
     }
 
@@ -238,7 +253,7 @@ public class ApplicationUser
         return accountType;
     }
     @Override
-    public void setAccountType(org.apache.isis.extensions.secman.applib.user.dom.AccountType accountType) {
+    public void setAccountType(final org.apache.isis.extensions.secman.applib.user.dom.AccountType accountType) {
         this.accountType = accountType;
     }
 
@@ -254,7 +269,7 @@ public class ApplicationUser
         return status;
     }
     @Override
-    public void setStatus(ApplicationUserStatus status) {
+    public void setStatus(final ApplicationUserStatus status) {
         this.status = status;
     }
 
@@ -270,7 +285,7 @@ public class ApplicationUser
         return encryptedPassword;
     }
     @Override
-    public void setEncryptedPassword(String encryptedPassword) {
+    public void setEncryptedPassword(final String encryptedPassword) {
         this.encryptedPassword = encryptedPassword;
     }
 
diff --git a/extensions/security/secman/persistence-jpa/src/main/java/org/apache/isis/extensions/secman/jpa/user/dom/ApplicationUser.java b/extensions/security/secman/persistence-jpa/src/main/java/org/apache/isis/extensions/secman/jpa/user/dom/ApplicationUser.java
index 971eaa2..76f8039 100644
--- a/extensions/security/secman/persistence-jpa/src/main/java/org/apache/isis/extensions/secman/jpa/user/dom/ApplicationUser.java
+++ b/extensions/security/secman/persistence-jpa/src/main/java/org/apache/isis/extensions/secman/jpa/user/dom/ApplicationUser.java
@@ -18,6 +18,7 @@
  */
 package org.apache.isis.extensions.secman.jpa.user.dom;
 
+import java.util.Locale;
 import java.util.Set;
 import java.util.TreeSet;
 
@@ -211,6 +212,20 @@ public class ApplicationUser
         this.faxNumber = faxNumber;
     }
 
+    // -- LOCALE
+
+    @Column(nullable = true)
+    private Locale locale;
+
+    @UserLocale
+    @Override
+    public Locale getLocale() {
+        return locale;
+    }
+    @Override
+    public void setLocale(final Locale locale) {
+        this.locale = locale;
+    }
 
     // -- AT PATH
 
diff --git a/extensions/vw/fullcalendar/applib/pom.xml b/extensions/vw/fullcalendar/applib/pom.xml
index df915d4..be831f1 100644
--- a/extensions/vw/fullcalendar/applib/pom.xml
+++ b/extensions/vw/fullcalendar/applib/pom.xml
@@ -36,6 +36,11 @@
 
     <dependencies>
 
+		<dependency>
+            <groupId>org.apache.isis.commons</groupId>
+            <artifactId>isis-commons</artifactId>
+        </dependency>
+
         <dependency>
             <groupId>org.apache.isis.core</groupId>
             <artifactId>isis-applib</artifactId>
diff --git a/extensions/vw/fullcalendar/applib/src/main/java/org/apache/isis/extensions/fullcalendar/applib/value/CalendarEventSemanticsProvider.java b/extensions/vw/fullcalendar/applib/src/main/java/org/apache/isis/extensions/fullcalendar/applib/value/CalendarEventSemanticsProvider.java
index 1c34729..283ee44 100644
--- a/extensions/vw/fullcalendar/applib/src/main/java/org/apache/isis/extensions/fullcalendar/applib/value/CalendarEventSemanticsProvider.java
+++ b/extensions/vw/fullcalendar/applib/src/main/java/org/apache/isis/extensions/fullcalendar/applib/value/CalendarEventSemanticsProvider.java
@@ -34,6 +34,7 @@ import org.apache.isis.applib.annotation.SemanticsOf;
 import org.apache.isis.applib.value.semantics.DefaultsProvider;
 import org.apache.isis.applib.value.semantics.Renderer;
 import org.apache.isis.applib.value.semantics.ValueSemanticsAbstract;
+import org.apache.isis.commons.collections.Can;
 import org.apache.isis.schema.common.v2.ValueType;
 
 import lombok.RequiredArgsConstructor;
@@ -91,6 +92,14 @@ implements
         return render(value, v->v.toString());
     }
 
+    // -- EXAMPLES
+
+    @Override
+    public Can<CalendarEvent> getExamples() {
+        //TODO provide examples
+        return Can.empty();
+    }
+
     // -- EMBEDDING
 
     // typed tuple of base-types
@@ -177,7 +186,4 @@ implements
 
     }
 
-
-
-
 }
diff --git a/regressiontests/stable/src/main/java/org/apache/isis/testdomain/model/valuetypes/ValueTypeExample.java b/regressiontests/stable/src/main/java/org/apache/isis/testdomain/model/valuetypes/ValueTypeExample.java
index 1216545..69c96fa 100644
--- a/regressiontests/stable/src/main/java/org/apache/isis/testdomain/model/valuetypes/ValueTypeExample.java
+++ b/regressiontests/stable/src/main/java/org/apache/isis/testdomain/model/valuetypes/ValueTypeExample.java
@@ -30,6 +30,7 @@ import java.time.OffsetDateTime;
 import java.time.OffsetTime;
 import java.time.ZonedDateTime;
 import java.util.List;
+import java.util.Locale;
 import java.util.Optional;
 import java.util.UUID;
 import java.util.stream.Stream;
@@ -212,6 +213,17 @@ public abstract class ValueTypeExample<T> {
         private UUID updateValue = UUID.randomUUID();
     }
 
+    @DomainObject(
+            logicalTypeName = "isis.testdomain.valuetypes.ValueTypeExampleLocale",
+            nature = Nature.BEAN)
+    public static class ValueTypeExampleLocale
+    extends ValueTypeExample<Locale> {
+        @Property @Getter @Setter
+        private Locale value = Locale.US;
+        @Getter
+        private Locale updateValue = Locale.GERMAN;
+    }
+
     // -- EXAMPLES - NUMBERS
 
     @DomainObject(
diff --git a/regressiontests/stable/src/main/java/org/apache/isis/testdomain/model/valuetypes/ValueTypeExampleService.java b/regressiontests/stable/src/main/java/org/apache/isis/testdomain/model/valuetypes/ValueTypeExampleService.java
index ad71080..7747b4f 100644
--- a/regressiontests/stable/src/main/java/org/apache/isis/testdomain/model/valuetypes/ValueTypeExampleService.java
+++ b/regressiontests/stable/src/main/java/org/apache/isis/testdomain/model/valuetypes/ValueTypeExampleService.java
@@ -28,6 +28,7 @@ import javax.inject.Inject;
 import org.junit.jupiter.params.provider.Arguments;
 import org.springframework.stereotype.Service;
 
+import org.apache.isis.applib.value.semantics.ValueSemanticsResolver;
 import org.apache.isis.commons.internal.base._Strings;
 
 import lombok.Value;
@@ -36,12 +37,9 @@ import lombok.val;
 @Service
 public class ValueTypeExampleService {
 
+    @Inject ValueSemanticsResolver valueSemanticsResolver;
     @Inject List<ValueTypeExample<?>> examples;
 
-    public Stream<ValueTypeExample<?>> streamExamples() {
-        return examples.stream();
-    }
-
     @Value(staticConstructor = "of")
     public static class Scenario implements Comparable<Scenario> {
         static Scenario of(final ValueTypeExample<?> example) {
@@ -58,6 +56,10 @@ public class ValueTypeExampleService {
         }
     }
 
+    public Stream<ValueTypeExample<?>> streamExamples() {
+        return examples.stream();
+    }
+
     public Stream<Scenario> streamScenarios() {
         val sortedScenarios = streamExamples()
             .map(Scenario::of)
diff --git a/valuetypes/asciidoc/metamodel/src/main/java/org/apache/isis/valuetypes/asciidoc/metamodel/semantics/AsciiDocValueSemantics.java b/valuetypes/asciidoc/metamodel/src/main/java/org/apache/isis/valuetypes/asciidoc/metamodel/semantics/AsciiDocValueSemantics.java
index 943697a..ebea831 100644
--- a/valuetypes/asciidoc/metamodel/src/main/java/org/apache/isis/valuetypes/asciidoc/metamodel/semantics/AsciiDocValueSemantics.java
+++ b/valuetypes/asciidoc/metamodel/src/main/java/org/apache/isis/valuetypes/asciidoc/metamodel/semantics/AsciiDocValueSemantics.java
@@ -27,6 +27,7 @@ import org.apache.isis.applib.value.semantics.Parser;
 import org.apache.isis.applib.value.semantics.Renderer;
 import org.apache.isis.applib.value.semantics.ValueSemanticsAbstract;
 import org.apache.isis.applib.value.semantics.ValueSemanticsProvider;
+import org.apache.isis.commons.collections.Can;
 import org.apache.isis.schema.common.v2.ValueType;
 import org.apache.isis.valuetypes.asciidoc.applib.value.AsciiDoc;
 
@@ -85,4 +86,11 @@ implements
         return AsciiDoc.valueOf(encodedString);
     }
 
+    @Override
+    public Can<AsciiDoc> getExamples() {
+        return Can.of(
+                AsciiDoc.valueOf("a AsciiDoc"),
+                AsciiDoc.valueOf("another AsciiDoc"));
+    }
+
 }
diff --git a/valuetypes/jodatime/integration/src/main/java/org/apache/isis/valuetypes/jodatime/integration/valuesemantics/JodaDateTimeValueSemantics.java b/valuetypes/jodatime/integration/src/main/java/org/apache/isis/valuetypes/jodatime/integration/valuesemantics/JodaDateTimeValueSemantics.java
index 1152e6e..f2d68c8 100644
--- a/valuetypes/jodatime/integration/src/main/java/org/apache/isis/valuetypes/jodatime/integration/valuesemantics/JodaDateTimeValueSemantics.java
+++ b/valuetypes/jodatime/integration/src/main/java/org/apache/isis/valuetypes/jodatime/integration/valuesemantics/JodaDateTimeValueSemantics.java
@@ -27,6 +27,7 @@ import org.joda.time.DateTime;
 import org.springframework.stereotype.Component;
 
 import org.apache.isis.applib.value.semantics.ValueSemanticsAbstract;
+import org.apache.isis.commons.collections.Can;
 import org.apache.isis.core.metamodel.valuesemantics.temporal.ZonedDateTimeValueSemantics;
 import org.apache.isis.core.metamodel.valuetypes.TemporalSemanticsAdapter;
 import org.apache.isis.valuetypes.jodatime.applib.value.JodaTimeConverters;
@@ -58,4 +59,11 @@ extends TemporalSemanticsAdapter<org.joda.time.DateTime, ZonedDateTime>  {
         return JodaTimeConverters.fromJoda(value);
     }
 
+    @Override
+    public Can<DateTime> getExamples() {
+        return Can.of(
+                org.joda.time.DateTime.now(),
+                org.joda.time.DateTime.now().plusDays(2).plusSeconds(15));
+    }
+
 }
diff --git a/valuetypes/jodatime/integration/src/main/java/org/apache/isis/valuetypes/jodatime/integration/valuesemantics/JodaLocalDateTimeValueSemantics.java b/valuetypes/jodatime/integration/src/main/java/org/apache/isis/valuetypes/jodatime/integration/valuesemantics/JodaLocalDateTimeValueSemantics.java
index f97d789..703207a 100644
--- a/valuetypes/jodatime/integration/src/main/java/org/apache/isis/valuetypes/jodatime/integration/valuesemantics/JodaLocalDateTimeValueSemantics.java
+++ b/valuetypes/jodatime/integration/src/main/java/org/apache/isis/valuetypes/jodatime/integration/valuesemantics/JodaLocalDateTimeValueSemantics.java
@@ -21,9 +21,11 @@ package org.apache.isis.valuetypes.jodatime.integration.valuesemantics;
 import javax.inject.Inject;
 import javax.inject.Named;
 
+import org.joda.time.LocalDateTime;
 import org.springframework.stereotype.Component;
 
 import org.apache.isis.applib.value.semantics.ValueSemanticsAbstract;
+import org.apache.isis.commons.collections.Can;
 import org.apache.isis.core.metamodel.valuesemantics.temporal.LocalDateTimeValueSemantics;
 import org.apache.isis.core.metamodel.valuetypes.TemporalSemanticsAdapter;
 import org.apache.isis.valuetypes.jodatime.applib.value.JodaTimeConverters;
@@ -55,5 +57,12 @@ extends TemporalSemanticsAdapter<org.joda.time.LocalDateTime, java.time.LocalDat
         return JodaTimeConverters.fromJoda(value);
     }
 
+    @Override
+    public Can<LocalDateTime> getExamples() {
+        return Can.of(
+                org.joda.time.LocalDateTime.now(),
+                org.joda.time.LocalDateTime.now().plusDays(2).plusSeconds(15));
+    }
+
 }
 
diff --git a/valuetypes/jodatime/integration/src/main/java/org/apache/isis/valuetypes/jodatime/integration/valuesemantics/JodaLocalDateValueSemantics.java b/valuetypes/jodatime/integration/src/main/java/org/apache/isis/valuetypes/jodatime/integration/valuesemantics/JodaLocalDateValueSemantics.java
index b37c6f9..bf7be7b 100644
--- a/valuetypes/jodatime/integration/src/main/java/org/apache/isis/valuetypes/jodatime/integration/valuesemantics/JodaLocalDateValueSemantics.java
+++ b/valuetypes/jodatime/integration/src/main/java/org/apache/isis/valuetypes/jodatime/integration/valuesemantics/JodaLocalDateValueSemantics.java
@@ -21,9 +21,11 @@ package org.apache.isis.valuetypes.jodatime.integration.valuesemantics;
 import javax.inject.Inject;
 import javax.inject.Named;
 
+import org.joda.time.LocalDate;
 import org.springframework.stereotype.Component;
 
 import org.apache.isis.applib.value.semantics.ValueSemanticsAbstract;
+import org.apache.isis.commons.collections.Can;
 import org.apache.isis.core.metamodel.valuesemantics.temporal.LocalDateValueSemantics;
 import org.apache.isis.core.metamodel.valuetypes.TemporalSemanticsAdapter;
 import org.apache.isis.valuetypes.jodatime.applib.value.JodaTimeConverters;
@@ -55,5 +57,12 @@ extends TemporalSemanticsAdapter<org.joda.time.LocalDate, java.time.LocalDate>
         return JodaTimeConverters.fromJoda(value);
     }
 
+    @Override
+    public Can<LocalDate> getExamples() {
+        return Can.of(
+                org.joda.time.LocalDate.now(),
+                org.joda.time.LocalDate.now().plusDays(2));
+    }
+
 
 }
diff --git a/valuetypes/jodatime/integration/src/main/java/org/apache/isis/valuetypes/jodatime/integration/valuesemantics/JodaLocalTimeValueSemantics.java b/valuetypes/jodatime/integration/src/main/java/org/apache/isis/valuetypes/jodatime/integration/valuesemantics/JodaLocalTimeValueSemantics.java
index bc9b0d9..f5e7350 100644
--- a/valuetypes/jodatime/integration/src/main/java/org/apache/isis/valuetypes/jodatime/integration/valuesemantics/JodaLocalTimeValueSemantics.java
+++ b/valuetypes/jodatime/integration/src/main/java/org/apache/isis/valuetypes/jodatime/integration/valuesemantics/JodaLocalTimeValueSemantics.java
@@ -21,9 +21,11 @@ package org.apache.isis.valuetypes.jodatime.integration.valuesemantics;
 import javax.inject.Inject;
 import javax.inject.Named;
 
+import org.joda.time.LocalTime;
 import org.springframework.stereotype.Component;
 
 import org.apache.isis.applib.value.semantics.ValueSemanticsAbstract;
+import org.apache.isis.commons.collections.Can;
 import org.apache.isis.core.metamodel.valuesemantics.temporal.LocalTimeValueSemantics;
 import org.apache.isis.core.metamodel.valuetypes.TemporalSemanticsAdapter;
 import org.apache.isis.valuetypes.jodatime.applib.value.JodaTimeConverters;
@@ -55,4 +57,11 @@ extends TemporalSemanticsAdapter<org.joda.time.LocalTime, java.time.LocalTime>
         return JodaTimeConverters.fromJoda(value);
     }
 
+    @Override
+    public Can<LocalTime> getExamples() {
+        return Can.of(
+                org.joda.time.LocalTime.now(),
+                org.joda.time.LocalTime.now().plusSeconds(15));
+    }
+
 }
diff --git a/valuetypes/markdown/metamodel/src/main/java/org/apache/isis/valuetypes/markdown/metamodel/semantics/MarkdownValueSemantics.java b/valuetypes/markdown/metamodel/src/main/java/org/apache/isis/valuetypes/markdown/metamodel/semantics/MarkdownValueSemantics.java
index a21b110..bcaa605 100644
--- a/valuetypes/markdown/metamodel/src/main/java/org/apache/isis/valuetypes/markdown/metamodel/semantics/MarkdownValueSemantics.java
+++ b/valuetypes/markdown/metamodel/src/main/java/org/apache/isis/valuetypes/markdown/metamodel/semantics/MarkdownValueSemantics.java
@@ -26,6 +26,7 @@ import org.apache.isis.applib.value.semantics.EncoderDecoder;
 import org.apache.isis.applib.value.semantics.Parser;
 import org.apache.isis.applib.value.semantics.Renderer;
 import org.apache.isis.applib.value.semantics.ValueSemanticsAbstract;
+import org.apache.isis.commons.collections.Can;
 import org.apache.isis.schema.common.v2.ValueType;
 import org.apache.isis.valuetypes.markdown.applib.value.Markdown;
 
@@ -96,4 +97,11 @@ implements
         return 0;
     }
 
+    @Override
+    public Can<Markdown> getExamples() {
+        return Can.of(
+                Markdown.valueOf("a Markdown"),
+                Markdown.valueOf("another Markdown"));
+    }
+
 }