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 2020/01/14 19:22:11 UTC

[isis] 01/02: ISIS-2263: re-implement java.time facet factories

This is an automated email from the ASF dual-hosted git repository.

ahuber pushed a commit to branch 2263-Update_RO_spec
in repository https://gitbox.apache.org/repos/asf/isis.git

commit af17748288bc14b3a2cbe8cabe41bf40eb3cbf1f
Author: Andi Huber <ah...@apache.org>
AuthorDate: Tue Jan 14 15:40:49 2020 +0100

    ISIS-2263: re-implement java.time facet factories
---
 .../xmlsnapshot/XmlSnapshotServiceAbstract.java    |   9 +-
 .../applib/services/urlencoding/MementosTest.java  |   6 +-
 .../XmlSnapshotServiceAbstractTest.java            |   4 +-
 .../apache/isis/applib/util/schema/Roundtrip.java  |  64 ++---
 .../isis/schema/timeadapters/XmlTimeUtil.java      |  96 ++++++++
 .../value/datejdk8local/Jdk8LocalDateUtil.java     | 170 -------------
 ...ateValueFacetUsingSemanticsProviderFactory.java |  45 ----
 .../Jdk8LocalDateValueSemanticsProvider.java       | 252 -------------------
 .../facets/value/datejdk8local/TimeFormatter.java  |  27 --
 .../datetimejdk8local/Jdk8LocalDateTimeUtil.java   | 157 ------------
 ...imeValueFacetUsingSemanticsProviderFactory.java |  45 ----
 .../Jdk8LocalDateTimeValueSemanticsProvider.java   | 272 ---------------------
 .../value/datetimejdk8local/TimeFormatter.java     |  27 --
 .../facets/value/datetimejdk8local/TimeParser.java |  27 --
 ...imeValueFacetUsingSemanticsProviderFactory.java |  45 ----
 .../Jdk8OffsetDateTimeValueSemanticsProvider.java  | 103 --------
 ...fsetDateTimeValueSemanticsProviderAbstract.java | 121 ---------
 .../facets/value/temporal/TemporalAdjust.java      | 108 ++++++++
 .../facets/value/temporal/TemporalAdjustUtil.java  |  61 +++++
 .../TemporalValueFacet.java}                       |  27 +-
 ...ralValueFacetUsingSemanticsProviderFactory.java |  64 +++++
 .../TemporalValueSemanticsProviderAbstract.java    | 234 ++++++++++++++++++
 ...teValueFacetUsingSemanticsProviderFactory.java} |  14 +-
 .../localdate/LocalDateValueSemanticsProvider.java |  53 ++++
 ...meValueFacetUsingSemanticsProviderFactory.java} |  14 +-
 .../LocalDateTimeValueSemanticsProvider.java       |  64 +++++
 ...meValueFacetUsingSemanticsProviderFactory.java} |  14 +-
 .../localtime/LocalTimeValueSemanticsProvider.java |  63 +++++
 ...meValueFacetUsingSemanticsProviderFactory.java} |  14 +-
 .../OffsetDateTimeValueSemanticsProvider.java      |  65 +++++
 ...meValueFacetUsingSemanticsProviderFactory.java} |  16 +-
 .../OffsetTimeValueSemanticsProvider.java          |  60 +++++
 ...meValueFacetUsingSemanticsProviderFactory.java} |  16 +-
 .../ZonedDateTimeValueSemanticsProvider.java       |  61 +++++
 .../time/TimeValueSemanticsProviderAbstract.java   |   3 +-
 .../dflt/ProgrammingModelFacetsJava8.java          |  96 ++++----
 ...HelperTest_newPropertyDomainEvent_forClear.java |   7 +-
 ...elperTest_newPropertyDomainEvent_forModify.java |  11 +-
 .../core/runtimeservices/i18n/po/PoWriter.java     |  11 +-
 .../applib/bean/FixtureDatumFactoriesForTime.java  |  76 ++++++
 .../unittestsupport/applib/dom/valuetypes/VT.java  |   2 +-
 41 files changed, 1186 insertions(+), 1438 deletions(-)

diff --git a/api/applib/src/main/java/org/apache/isis/applib/services/xmlsnapshot/XmlSnapshotServiceAbstract.java b/api/applib/src/main/java/org/apache/isis/applib/services/xmlsnapshot/XmlSnapshotServiceAbstract.java
index a8d0168..7003d18 100644
--- a/api/applib/src/main/java/org/apache/isis/applib/services/xmlsnapshot/XmlSnapshotServiceAbstract.java
+++ b/api/applib/src/main/java/org/apache/isis/applib/services/xmlsnapshot/XmlSnapshotServiceAbstract.java
@@ -21,6 +21,8 @@ package org.apache.isis.applib.services.xmlsnapshot;
 import java.io.StringReader;
 import java.math.BigDecimal;
 import java.math.BigInteger;
+import java.time.LocalDate;
+import java.time.format.DateTimeFormatter;
 import java.util.Locale;
 
 import javax.xml.transform.OutputKeys;
@@ -30,8 +32,6 @@ import javax.xml.transform.TransformerFactory;
 import javax.xml.transform.dom.DOMResult;
 import javax.xml.transform.stream.StreamSource;
 
-import org.joda.time.format.DateTimeFormat;
-import org.joda.time.format.DateTimeFormatter;
 import org.w3c.dom.Document;
 import org.w3c.dom.Element;
 import org.w3c.dom.Node;
@@ -75,8 +75,9 @@ public abstract class XmlSnapshotServiceAbstract implements XmlSnapshotService {
         }
         if("isis:LocalDate".equals(dataType)) {
             final String str = getChildTextValue(chldEl);
-            final DateTimeFormatter forPattern = DateTimeFormat.forPattern("dd-MMM-yyyy").withLocale(Locale.ENGLISH);
-            return (T)forPattern.parseLocalDate(str);
+            final DateTimeFormatter parser = DateTimeFormatter
+                    .ofPattern("dd-MMM-yyyy", Locale.ENGLISH);
+            return (T)parser.parse(str, LocalDate::from);
         }
         if("isis:Byte".equals(dataType)) {
             final String str = getChildTextValue(chldEl);
diff --git a/api/applib/src/test/java/org/apache/isis/applib/services/urlencoding/MementosTest.java b/api/applib/src/test/java/org/apache/isis/applib/services/urlencoding/MementosTest.java
index b6fa72a..f426698 100644
--- a/api/applib/src/test/java/org/apache/isis/applib/services/urlencoding/MementosTest.java
+++ b/api/applib/src/test/java/org/apache/isis/applib/services/urlencoding/MementosTest.java
@@ -22,9 +22,9 @@ package org.apache.isis.applib.services.urlencoding;
 import java.io.Serializable;
 import java.math.BigDecimal;
 import java.math.BigInteger;
+import java.time.LocalDate;
 import java.util.Date;
 
-import org.joda.time.LocalDate;
 import org.junit.Before;
 import org.junit.Test;
 
@@ -93,7 +93,7 @@ public class MementosTest {
         memento.put("someBooleanFalse", Boolean.FALSE);
         memento.put("someBigInteger", new BigInteger("123456789012345678901234567890"));
         memento.put("someBigDecimal", new BigDecimal("123456789012345678901234567890.123456789"));
-        memento.put("someLocalDate", new LocalDate(2013,9,3));
+        memento.put("someLocalDate", LocalDate.of(2013,9,3));
         memento.put("someJavaUtilDate", new Date(300_000_000));
 
         memento.put("someBookmark", new Bookmark("CUS", "12345"));
@@ -117,7 +117,7 @@ public class MementosTest {
         assertThat(memento2.get("someBooleanFalse", Boolean.class), is(Boolean.FALSE));
         assertThat(memento2.get("someBigInteger", BigInteger.class), is(new BigInteger("123456789012345678901234567890")));
         assertThat(memento2.get("someBigDecimal", BigDecimal.class), is(new BigDecimal("123456789012345678901234567890.123456789")));
-        assertThat(memento2.get("someLocalDate", LocalDate.class), is(new LocalDate(2013,9,3)));
+        assertThat(memento2.get("someLocalDate", LocalDate.class), is(LocalDate.of(2013,9,3)));
         assertThat(memento2.get("someJavaUtilDate", Date.class), is(new Date(300_000_000)));
         assertThat(memento2.get("someBookmark", Bookmark.class), is(new Bookmark("CUS", "12345")));
 
diff --git a/api/applib/src/test/java/org/apache/isis/applib/services/xmlsnapshot/XmlSnapshotServiceAbstractTest.java b/api/applib/src/test/java/org/apache/isis/applib/services/xmlsnapshot/XmlSnapshotServiceAbstractTest.java
index 2b301da..2eab325 100644
--- a/api/applib/src/test/java/org/apache/isis/applib/services/xmlsnapshot/XmlSnapshotServiceAbstractTest.java
+++ b/api/applib/src/test/java/org/apache/isis/applib/services/xmlsnapshot/XmlSnapshotServiceAbstractTest.java
@@ -19,9 +19,9 @@ package org.apache.isis.applib.services.xmlsnapshot;
 import java.math.BigDecimal;
 import java.math.BigInteger;
 import java.nio.charset.Charset;
+import java.time.LocalDate;
 import java.util.Locale;
 
-import org.joda.time.LocalDate;
 import org.junit.Before;
 import org.junit.Test;
 import org.w3c.dom.Document;
@@ -65,7 +65,7 @@ public class XmlSnapshotServiceAbstractTest {
                 assertThat(
                         xmlSnapshotService.getChildElementValue(rootEl, "app:someString", String.class), is("OXF"));
                 assertThat(
-                        xmlSnapshotService.getChildElementValue(rootEl, "app:someLocalDate", LocalDate.class), is(new LocalDate(2013,4,1)));
+                        xmlSnapshotService.getChildElementValue(rootEl, "app:someLocalDate", LocalDate.class), is(LocalDate.of(2013,4,1)));
                 assertThat(
                         xmlSnapshotService.getChildElementValue(rootEl, "app:someBigDecimal", BigDecimal.class), is(new BigDecimal("123456789012345678901234567890.12345678")));
                 assertThat(
diff --git a/api/applib/src/test/java/org/apache/isis/applib/util/schema/Roundtrip.java b/api/applib/src/test/java/org/apache/isis/applib/util/schema/Roundtrip.java
index 923d65c..87a752d 100644
--- a/api/applib/src/test/java/org/apache/isis/applib/util/schema/Roundtrip.java
+++ b/api/applib/src/test/java/org/apache/isis/applib/util/schema/Roundtrip.java
@@ -21,16 +21,16 @@ import java.io.CharArrayWriter;
 import java.math.BigDecimal;
 import java.math.BigInteger;
 import java.sql.Timestamp;
+import java.time.LocalDate;
+import java.time.LocalDateTime;
+import java.time.LocalTime;
+import java.time.OffsetDateTime;
 import java.util.Arrays;
 import java.util.Date;
 import java.util.List;
 import java.util.UUID;
 
 import org.hamcrest.Matchers;
-import org.joda.time.DateTime;
-import org.joda.time.LocalDate;
-import org.joda.time.LocalDateTime;
-import org.joda.time.LocalTime;
 import org.junit.Test;
 
 import static org.hamcrest.CoreMatchers.equalTo;
@@ -133,20 +133,20 @@ public class Roundtrip {
         .addParamArg(interactionDto, "nullBigDecimal", java.math.BigDecimal.class, (java.math.BigDecimal) null, null);
 
         InteractionDtoUtils
-        .addParamArg(interactionDto, "aJodaDateTime", org.joda.time.DateTime.class, new org.joda.time.DateTime(2015, 5, 23, 9, 54, 1), null);
+        .addParamArg(interactionDto, "aOffsetDateTime", java.time.OffsetDateTime.class, OffsetDateTime.of(2015, 5, 23, 9, 54, 1, 0, null), null);
         InteractionDtoUtils
-        .addParamArg(interactionDto, "nullJodaDateTime", org.joda.time.DateTime.class, (org.joda.time.DateTime) null, null);
+        .addParamArg(interactionDto, "nullOffsetDateTime", java.time.OffsetDateTime.class, (OffsetDateTime) null, null);
 
         InteractionDtoUtils
-        .addParamArg(interactionDto, "aJodaLocalDate", org.joda.time.LocalDate.class, new org.joda.time.LocalDate(2015, 5, 23), null);
-        InteractionDtoUtils.addParamArg(interactionDto, "nullJodaLocalDate", org.joda.time.LocalDate.class, (org.joda.time.LocalDate) null, null);
+        .addParamArg(interactionDto, "aLocalDate", java.time.LocalDate.class, LocalDate.of(2015, 5, 23), null);
+        InteractionDtoUtils.addParamArg(interactionDto, "nullLocalDate", java.time.LocalDate.class, (LocalDate) null, null);
 
-        InteractionDtoUtils.addParamArg(interactionDto, "aJodaLocalDateTime", org.joda.time.LocalDateTime.class, new org.joda.time.LocalDateTime(2015, 5, 23, 9, 54, 1), null);
-        InteractionDtoUtils.addParamArg(interactionDto, "nullJodaLocalDateTime", org.joda.time.LocalDateTime.class, (org.joda.time.LocalDateTime) null, null);
+        InteractionDtoUtils.addParamArg(interactionDto, "aLocalDateTime", java.time.LocalDateTime.class, LocalDateTime.of(2015, 5, 23, 9, 54, 1), null);
+        InteractionDtoUtils.addParamArg(interactionDto, "nullLocalDateTime", java.time.LocalDateTime.class, (LocalDateTime) null, null);
 
         InteractionDtoUtils
-        .addParamArg(interactionDto, "aJodaLocalTime", org.joda.time.LocalTime.class, new org.joda.time.LocalTime(9, 54, 1), null);
-        InteractionDtoUtils.addParamArg(interactionDto, "nullJodaLocalTime", org.joda.time.LocalTime.class, (org.joda.time.LocalTime) null, null);
+        .addParamArg(interactionDto, "aLocalTime", java.time.LocalTime.class, LocalTime.of(9, 54, 1), null);
+        InteractionDtoUtils.addParamArg(interactionDto, "nullLocalTime", java.time.LocalTime.class, (LocalTime) null, null);
 
         InteractionDtoUtils.addParamArg(interactionDto, "aReference", null, new Bookmark("ORD", "12345"), null);
         InteractionDtoUtils.addParamArg(interactionDto, "nullReference", null, null, null);
@@ -292,52 +292,52 @@ public class Roundtrip {
         assertThat(InteractionDtoUtils.isNull(invocationDto, param), is(true));
 
         param++;
-        assertThat(InteractionDtoUtils.getParameterName(invocationDto, param), is("aJodaDateTime"));
-        assertThat(InteractionDtoUtils.getParameterType(invocationDto, param), Matchers.is(ValueType.JODA_DATE_TIME));
+        assertThat(InteractionDtoUtils.getParameterName(invocationDto, param), is("aOffsetDateTime"));
+        assertThat(InteractionDtoUtils.getParameterType(invocationDto, param), Matchers.is(ValueType.OFFSET_DATE_TIME));
         assertThat(InteractionDtoUtils.isNull(invocationDto, param), is(false));
         // bit hacky... regular comparison fails but toString() works... must be some additional data that differs, not sure what tho'
         assertThat(
-                InteractionDtoUtils.getParameterArgValue(invocationDto, param, DateTime.class).toString(), is(new DateTime(2015, 5, 23, 9, 54, 1).toString()));
+                InteractionDtoUtils.getParameterArgValue(invocationDto, param, OffsetDateTime.class).toString(), is(OffsetDateTime.of(2015, 5, 23, 9, 54, 1, 0, null).toString()));
 
         param++;
-        assertThat(InteractionDtoUtils.getParameterName(invocationDto, param), is("nullJodaDateTime"));
-        assertThat(InteractionDtoUtils.getParameterType(invocationDto, param), Matchers.is(ValueType.JODA_DATE_TIME));
+        assertThat(InteractionDtoUtils.getParameterName(invocationDto, param), is("nullOffsetDateTime"));
+        assertThat(InteractionDtoUtils.getParameterType(invocationDto, param), Matchers.is(ValueType.OFFSET_DATE_TIME));
         assertThat(InteractionDtoUtils.isNull(invocationDto, param), is(true));
 
         param++;
-        assertThat(InteractionDtoUtils.getParameterName(invocationDto, param), is("aJodaLocalDate"));
-        assertThat(InteractionDtoUtils.getParameterType(invocationDto, param), Matchers.is(ValueType.JODA_LOCAL_DATE));
+        assertThat(InteractionDtoUtils.getParameterName(invocationDto, param), is("aLocalDate"));
+        assertThat(InteractionDtoUtils.getParameterType(invocationDto, param), Matchers.is(ValueType.LOCAL_DATE));
         assertThat(InteractionDtoUtils.isNull(invocationDto, param), is(false));
         final LocalDate actual = InteractionDtoUtils.getParameterArgValue(invocationDto, param, LocalDate.class);
-        final LocalDate expected = new LocalDate(2015, 5, 23);
+        final LocalDate expected = LocalDate.of(2015, 5, 23);
         assertThat(actual, equalTo(expected));
 
         param++;
-        assertThat(InteractionDtoUtils.getParameterName(invocationDto, param), is("nullJodaLocalDate"));
-        assertThat(InteractionDtoUtils.getParameterType(invocationDto, param), Matchers.is(ValueType.JODA_LOCAL_DATE));
+        assertThat(InteractionDtoUtils.getParameterName(invocationDto, param), is("nullLocalDate"));
+        assertThat(InteractionDtoUtils.getParameterType(invocationDto, param), Matchers.is(ValueType.LOCAL_DATE));
         assertThat(InteractionDtoUtils.isNull(invocationDto, param), is(true));
 
         param++;
-        assertThat(InteractionDtoUtils.getParameterName(invocationDto, param), is("aJodaLocalDateTime"));
-        assertThat(InteractionDtoUtils.getParameterType(invocationDto, param), Matchers.is(ValueType.JODA_LOCAL_DATE_TIME));
+        assertThat(InteractionDtoUtils.getParameterName(invocationDto, param), is("aLocalDateTime"));
+        assertThat(InteractionDtoUtils.getParameterType(invocationDto, param), Matchers.is(ValueType.LOCAL_DATE_TIME));
         assertThat(InteractionDtoUtils.isNull(invocationDto, param), is(false));
-        assertThat(InteractionDtoUtils.getParameterArgValue(invocationDto, param, LocalDateTime.class), is(new org.joda.time.LocalDateTime(2015, 5, 23, 9, 54, 1)));
+        assertThat(InteractionDtoUtils.getParameterArgValue(invocationDto, param, LocalDateTime.class), is(LocalDateTime.of(2015, 5, 23, 9, 54, 1)));
 
         param++;
-        assertThat(InteractionDtoUtils.getParameterName(invocationDto, param), is("nullJodaLocalDateTime"));
-        assertThat(InteractionDtoUtils.getParameterType(invocationDto, param), Matchers.is(ValueType.JODA_LOCAL_DATE_TIME));
+        assertThat(InteractionDtoUtils.getParameterName(invocationDto, param), is("nullLocalDateTime"));
+        assertThat(InteractionDtoUtils.getParameterType(invocationDto, param), Matchers.is(ValueType.LOCAL_DATE_TIME));
         assertThat(InteractionDtoUtils.isNull(invocationDto, param), is(true));
 
         param++;
-        assertThat(InteractionDtoUtils.getParameterName(invocationDto, param), is("aJodaLocalTime"));
-        assertThat(InteractionDtoUtils.getParameterType(invocationDto, param), Matchers.is(ValueType.JODA_LOCAL_TIME));
+        assertThat(InteractionDtoUtils.getParameterName(invocationDto, param), is("aLocalTime"));
+        assertThat(InteractionDtoUtils.getParameterType(invocationDto, param), Matchers.is(ValueType.LOCAL_TIME));
         assertThat(InteractionDtoUtils.isNull(invocationDto, param), is(false));
         assertThat(
-                InteractionDtoUtils.getParameterArgValue(invocationDto, param, LocalTime.class), is(new org.joda.time.LocalTime(9, 54, 1)));
+                InteractionDtoUtils.getParameterArgValue(invocationDto, param, LocalTime.class), is(LocalTime.of(9, 54, 1)));
 
         param++;
-        assertThat(InteractionDtoUtils.getParameterName(invocationDto, param), is("nullJodaLocalTime"));
-        assertThat(InteractionDtoUtils.getParameterType(invocationDto, param), Matchers.is(ValueType.JODA_LOCAL_TIME));
+        assertThat(InteractionDtoUtils.getParameterName(invocationDto, param), is("nullLocalTime"));
+        assertThat(InteractionDtoUtils.getParameterType(invocationDto, param), Matchers.is(ValueType.LOCAL_TIME));
         assertThat(InteractionDtoUtils.isNull(invocationDto, param), is(true));
 
         param++;
diff --git a/api/schema/src/main/java/org/apache/isis/schema/timeadapters/XmlTimeUtil.java b/api/schema/src/main/java/org/apache/isis/schema/timeadapters/XmlTimeUtil.java
new file mode 100644
index 0000000..a097e2e
--- /dev/null
+++ b/api/schema/src/main/java/org/apache/isis/schema/timeadapters/XmlTimeUtil.java
@@ -0,0 +1,96 @@
+/*
+ *  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.schema.timeadapters;
+
+import java.time.LocalDate;
+import java.time.LocalDateTime;
+import java.time.LocalTime;
+import java.time.OffsetDateTime;
+import java.time.OffsetTime;
+import java.time.ZonedDateTime;
+
+import javax.xml.datatype.XMLGregorianCalendar;
+
+public class XmlTimeUtil {
+
+    // -- TO XML
+    
+    public static XMLGregorianCalendar fromLocalDate(LocalDate localDate) {
+        // TODO Auto-generated method stub
+        return null;
+    }
+
+    public static XMLGregorianCalendar fromLocalDateTime(LocalDateTime localDateTime) {
+        // TODO Auto-generated method stub
+        return null;
+    }
+
+    public static XMLGregorianCalendar fromOffsetDateTime(OffsetDateTime offsetDateTime) {
+        // TODO Auto-generated method stub
+        return null;
+    }
+
+    public static XMLGregorianCalendar fromLocalTime(LocalTime localTime) {
+        // TODO Auto-generated method stub
+        return null;
+    }
+
+    public static XMLGregorianCalendar fromOffsetTime(OffsetTime offsetTime) {
+        // TODO Auto-generated method stub
+        return null;
+    }
+
+    public static XMLGregorianCalendar fromZonedDateTime(ZonedDateTime zonedDateTime) {
+        // TODO Auto-generated method stub
+        return null;
+    }
+    
+    // -- FROM XML
+
+    public static LocalDate toLocalDate(XMLGregorianCalendar cal) {
+        // TODO Auto-generated method stub
+        return null;
+    }
+
+    public static LocalTime toLocalTime(XMLGregorianCalendar localTime) {
+        // TODO Auto-generated method stub
+        return null;
+    }
+
+    public static LocalDateTime toLocalDateTime(XMLGregorianCalendar localDateTime) {
+        // TODO Auto-generated method stub
+        return null;
+    }
+
+    public static OffsetDateTime toOffsetDateTime(XMLGregorianCalendar offsetDateTime) {
+        // TODO Auto-generated method stub
+        return null;
+    }
+
+    public static OffsetTime toOffsetTime(XMLGregorianCalendar offsetTime) {
+        // TODO Auto-generated method stub
+        return null;
+    }
+
+    public static ZonedDateTime toZonedDateTime(XMLGregorianCalendar zonedDateTime) {
+        // TODO Auto-generated method stub
+        return null;
+    }
+
+}
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/datejdk8local/Jdk8LocalDateUtil.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/datejdk8local/Jdk8LocalDateUtil.java
deleted file mode 100644
index da56196..0000000
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/datejdk8local/Jdk8LocalDateUtil.java
+++ /dev/null
@@ -1,170 +0,0 @@
-/*
- *  Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you under the Apache License, Version 2.0 (the
- *  "License"); you may not use this file except in compliance
- *  with the License.  You may obtain a copy of the License at
- *
- *        http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing,
- *  software distributed under the License is distributed on an
- *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- *  KIND, either express or implied.  See the License for the
- *  specific language governing permissions and limitations
- *  under the License.
- */
-
-package org.apache.isis.core.metamodel.facets.value.datejdk8local;
-
-import java.time.LocalDate;
-import java.time.format.DateTimeFormatter;
-import java.util.List;
-import java.util.Locale;
-import java.util.StringTokenizer;
-
-import org.joda.time.format.DateTimeFormat;
-
-import org.apache.isis.core.metamodel.facets.object.parseable.TextEntryParseException;
-
-final class Jdk8LocalDateUtil  {
-
-    private Jdk8LocalDateUtil(){}
-
-    // -- CONVERSION (LEGACY OF JODA TIME LIBRARY)
-
-    static TimeParser parserOfStyle(String style) {
-        return parserOf(DateTimeFormat.forStyle(style));
-    }
-
-    private static TimeParser parserOf(org.joda.time.format.DateTimeFormatter jodaFormatter) {
-        return t->
-        toJava8(jodaFormatter.withLocale(Locale.getDefault()).parseLocalDate(t));
-    }
-
-    private static LocalDate toJava8(org.joda.time.LocalDate x) {
-        return LocalDate.of(x.getYear(), x.getMonthOfYear(), x.getDayOfMonth());
-    }
-
-    static TimeFormatter formatterOfStyle(String style) {
-        return formatterOf(DateTimeFormat.forStyle(style));
-    }
-
-    private static TimeFormatter formatterOf(org.joda.time.format.DateTimeFormatter jodaFormatter) {
-        return t->
-        jodaFormatter.withLocale(Locale.getDefault()).print(toJoda(t));
-    }
-
-    private static org.joda.time.LocalDate toJoda(LocalDate x) {
-        return new org.joda.time.LocalDate(x.getYear(), x.getMonthValue(), x.getDayOfMonth());
-    }
-
-    // -- PARSING AND FORMATING GENERALIZATION
-
-    static TimeFormatter formatterOf(DateTimeFormatter formatter) {
-        return t->
-        formatter.withLocale(Locale.getDefault()).format(t);
-    }
-
-    static TimeParser parserOf(DateTimeFormatter formatter) {
-        return text->
-        LocalDate.parse(text, formatter.withLocale(Locale.getDefault()));
-    }
-
-    // //////////////////////////////////////
-
-    static LocalDate parseDate(
-            final String dateStr,
-            List<TimeParser> parsers) {
-        LocalDate parsedDate = _parseDate(dateStr, parsers);
-        return parsedDate;
-    }
-
-    private static LocalDate _parseDate(String dateStr, Iterable<TimeParser> parsers) {
-        for(TimeParser parser: parsers) {
-            try {
-                return parser.apply(dateStr);
-            } catch (final IllegalArgumentException e) {
-                // continue to next
-            }
-        }
-        throw new TextEntryParseException("Not recognised as a date: " + dateStr);
-    }
-
-    // //////////////////////////////////////
-
-    static LocalDate relativeDate(final LocalDate contextDate, final String str, final boolean add) {
-        LocalDate relativeDate = contextDate;
-        if (str.equals("")) {
-            return contextDate;
-        }
-
-        try {
-            final StringTokenizer st = new StringTokenizer(str.substring(1), " ");
-            while (st.hasMoreTokens()) {
-                final String token = st.nextToken();
-                relativeDate = adjustDate(relativeDate, token, add);
-            }
-            return relativeDate;
-        } catch (final Exception e) {
-            return contextDate;
-        }
-    }
-
-    private static LocalDate adjustDate(final LocalDate contextDate, String str, final boolean add) {
-        int hours = 0;
-        int minutes = 0;
-        int days = 0;
-        int months = 0;
-        int years = 0;
-
-        if (str.endsWith("H")) {
-            str = str.substring(0, str.length() - 1);
-            hours = Integer.valueOf(str).intValue();
-        } else if (str.endsWith("M")) {
-            str = str.substring(0, str.length() - 1);
-            minutes = Integer.valueOf(str).intValue();
-        } else if (str.endsWith("w")) {
-            str = str.substring(0, str.length() - 1);
-            days = 7 * Integer.valueOf(str).intValue();
-        } else if (str.endsWith("y")) {
-            str = str.substring(0, str.length() - 1);
-            years = Integer.valueOf(str).intValue();
-        } else if (str.endsWith("m")) {
-            str = str.substring(0, str.length() - 1);
-            months = Integer.valueOf(str).intValue();
-        } else if (str.endsWith("d")) {
-            str = str.substring(0, str.length() - 1);
-            days = Integer.valueOf(str).intValue();
-        } else {
-            days = Integer.valueOf(str).intValue();
-        }
-
-        if (add) {
-            return add(contextDate, years, months, days, hours, minutes);
-        } else {
-            return add(contextDate, -years, -months, -days, -hours, -minutes);
-        }
-    }
-
-    private static LocalDate add(final LocalDate original, final int years, final int months, final int days, final int hours, final int minutes) {
-        if(hours != 0 || minutes != 0) {
-            throw new IllegalArgumentException("cannot add non-zero hours or minutes to a LocalDate");
-        }
-        return original.plusYears(years).plusMonths(months).plusDays(days);
-    }
-
-
-    // //////////////////////////////////////
-
-    public static String titleString(final TimeFormatter formatter, final LocalDate date) {
-        return date == null ? "" : formatter.apply(date);
-    }
-
-
-
-
-
-}
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/datejdk8local/Jdk8LocalDateValueFacetUsingSemanticsProviderFactory.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/datejdk8local/Jdk8LocalDateValueFacetUsingSemanticsProviderFactory.java
deleted file mode 100644
index 703436b..0000000
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/datejdk8local/Jdk8LocalDateValueFacetUsingSemanticsProviderFactory.java
+++ /dev/null
@@ -1,45 +0,0 @@
-/*
- *  Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you under the Apache License, Version 2.0 (the
- *  "License"); you may not use this file except in compliance
- *  with the License.  You may obtain a copy of the License at
- *
- *        http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing,
- *  software distributed under the License is distributed on an
- *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- *  KIND, either express or implied.  See the License for the
- *  specific language governing permissions and limitations
- *  under the License.
- */
-
-package org.apache.isis.core.metamodel.facets.value.datejdk8local;
-
-import java.time.LocalDate;
-
-import org.apache.isis.core.metamodel.facetapi.FacetHolder;
-import org.apache.isis.core.metamodel.facets.object.value.vsp.ValueFacetUsingSemanticsProviderFactory;
-
-public class Jdk8LocalDateValueFacetUsingSemanticsProviderFactory extends ValueFacetUsingSemanticsProviderFactory<LocalDate> {
-
-    public Jdk8LocalDateValueFacetUsingSemanticsProviderFactory() {
-        // as per inherited DateTimeValueSemanticsProvider#facetType
-        super();
-    }
-
-    @Override
-    public void process(final ProcessClassContext processClassContext) {
-        final Class<?> type = processClassContext.getCls();
-        final FacetHolder holder = processClassContext.getFacetHolder();
-
-        if (type != LocalDate.class) {
-            return;
-        }
-        addFacets(new Jdk8LocalDateValueSemanticsProvider(holder));
-    }
-
-}
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/datejdk8local/Jdk8LocalDateValueSemanticsProvider.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/datejdk8local/Jdk8LocalDateValueSemanticsProvider.java
deleted file mode 100644
index e44d865..0000000
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/datejdk8local/Jdk8LocalDateValueSemanticsProvider.java
+++ /dev/null
@@ -1,252 +0,0 @@
-/*
- *  Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you under the Apache License, Version 2.0 (the
- *  "License"); you may not use this file except in compliance
- *  with the License.  You may obtain a copy of the License at
- *
- *        http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing,
- *  software distributed under the License is distributed on an
- *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- *  KIND, either express or implied.  See the License for the
- *  specific language governing permissions and limitations
- *  under the License.
- */
-
-package org.apache.isis.core.metamodel.facets.value.datejdk8local;
-
-import java.time.LocalDate;
-import java.time.format.DateTimeFormatter;
-import java.util.List;
-import java.util.Map;
-
-import org.apache.isis.applib.adapters.EncoderDecoder;
-import org.apache.isis.applib.adapters.EncodingException;
-import org.apache.isis.core.commons.internal.collections._Lists;
-import org.apache.isis.core.commons.internal.collections._Maps;
-import org.apache.isis.core.config.IsisConfiguration.Value.FormatIdentifier;
-import org.apache.isis.core.metamodel.facets.value.datejodalocal.JodaLocalDateValueFacet;
-import org.apache.isis.core.metamodel.facetapi.Facet;
-import org.apache.isis.core.metamodel.facetapi.FacetHolder;
-import org.apache.isis.core.metamodel.facets.object.value.vsp.ValueSemanticsProviderAndFacetAbstract;
-import org.apache.isis.core.metamodel.spec.ManagedObject;
-
-public class Jdk8LocalDateValueSemanticsProvider
-extends ValueSemanticsProviderAndFacetAbstract<LocalDate>
-implements Jdk8LocalDateValueFacet {
-
-    public static final int MAX_LENGTH = 12;
-    public static final int TYPICAL_LENGTH = MAX_LENGTH;
-
-    /**
-     * Introduced to allow BDD tests to provide a different format string "mid-flight".
-     *
-     * <p>
-     * REVIEW: This seems only to have any effect if 'propertyType' is set to 'date'.
-     *
-     * @see #setTitlePatternOverride(String)
-     * @deprecated - because 'propertyType' parameter is never used
-     */
-    @Deprecated
-    public static void setFormat(final String propertyType, final String pattern) {
-        setTitlePatternOverride(pattern);
-    }
-    /**
-     * A replacement for {@link #setFormat(String, String)}.
-     */
-    public static void setTitlePatternOverride(final String pattern) {
-        override_title_pattern.set(pattern);
-    }
-
-    /**
-     * Keys represent the values which can be configured, and which are used for the rendering of dates.
-     *
-     */
-    private static Map<String, TimeFormatter> named_title_formatters = _Maps.newHashMap();
-    static {
-        named_title_formatters.put("iso_encoding", Jdk8LocalDateUtil.formatterOf(DateTimeFormatter.ofPattern("yyyyMMdd")));
-        named_title_formatters.put("iso", Jdk8LocalDateUtil.formatterOf(DateTimeFormatter.ofPattern("yyyy-MM-dd")));
-        named_title_formatters.put("long", Jdk8LocalDateUtil.formatterOfStyle("L-"));
-        named_title_formatters.put("medium", Jdk8LocalDateUtil.formatterOfStyle("M-"));
-        named_title_formatters.put("short", Jdk8LocalDateUtil.formatterOfStyle("S-"));
-    }
-
-    private final static ThreadLocal<String> override_title_pattern = new ThreadLocal<String>() {
-        @Override
-        protected String initialValue() {
-            return null;
-        }
-    };
-
-
-    private final static List<TimeParser> parse_formatters = _Lists.newArrayList();
-    static {
-        parse_formatters.add(Jdk8LocalDateUtil.parserOfStyle("L-"));
-        parse_formatters.add(Jdk8LocalDateUtil.parserOfStyle("M-"));
-        parse_formatters.add(Jdk8LocalDateUtil.parserOfStyle("S-"));
-        parse_formatters.add(Jdk8LocalDateUtil.parserOf(DateTimeFormatter.ofPattern("yyyy-MM-dd")));
-        parse_formatters.add(Jdk8LocalDateUtil.parserOf(DateTimeFormatter.ofPattern("yyyyMMdd")));
-    }
-
-    public static Class<? extends Facet> type() {
-        return JodaLocalDateValueFacet.class;
-    }
-
-
-    // no default
-    private static final LocalDate DEFAULT_VALUE = null;
-
-
-    private final DateTimeFormatter encodingFormatter = DateTimeFormatter.ofPattern("yyyyMMdd");
-
-    private TimeFormatter titleStringFormatter;
-    private String titleStringFormatNameOrPattern;
-
-
-    // //////////////////////////////////////
-    // constructor
-    // //////////////////////////////////////
-
-    /**
-     * Required because implementation of {@link TimeParser} and
-     * {@link EncoderDecoder}.
-     */
-    public Jdk8LocalDateValueSemanticsProvider() {
-        this(null);
-    }
-
-    /**
-     * Uses {@link #type()} as the facet type.
-     */
-    public Jdk8LocalDateValueSemanticsProvider(final FacetHolder holder) {
-        super(type(), holder, LocalDate.class, TYPICAL_LENGTH, MAX_LENGTH, Immutability.IMMUTABLE, EqualByContent.HONOURED, DEFAULT_VALUE);
-
-        String configuredNameOrPattern = getConfiguration()
-                .getValue().getFormatOrElse(FormatIdentifier.DATE, "medium");
-        updateTitleStringFormatter(configuredNameOrPattern);
-    }
-
-
-    private void updateTitleStringFormatter(String titleStringFormatNameOrPattern) {
-        titleStringFormatter = named_title_formatters.get(titleStringFormatNameOrPattern);
-        if (titleStringFormatter == null) {
-            titleStringFormatter = Jdk8LocalDateUtil.formatterOf(DateTimeFormatter.ofPattern(titleStringFormatNameOrPattern));
-        }
-        this.titleStringFormatNameOrPattern = titleStringFormatNameOrPattern;
-    }
-
-
-    // //////////////////////////////////////////////////////////////////
-    // Parsing
-    // //////////////////////////////////////////////////////////////////
-
-    @Override
-    protected LocalDate doParse(
-            final String entry,
-            final Object context) {
-
-        updateTitleStringFormatterIfOverridden();
-
-        LocalDate contextDate = (LocalDate) context;
-
-        final String dateString = entry.trim().toUpperCase();
-        if (dateString.startsWith("+") && contextDate != null) {
-            return Jdk8LocalDateUtil.relativeDate(contextDate, dateString, true);
-        } else if (dateString.startsWith("-")  && contextDate != null) {
-            return Jdk8LocalDateUtil.relativeDate(contextDate, dateString, false);
-        } else {
-            return parseDate(dateString, contextDate);
-        }
-    }
-
-    private void updateTitleStringFormatterIfOverridden() {
-        final String overridePattern = override_title_pattern.get();
-        if (overridePattern == null ||
-                titleStringFormatNameOrPattern.equals(overridePattern)) {
-            return;
-        }
-
-        // (re)create format
-        updateTitleStringFormatter(overridePattern);
-    }
-
-    private LocalDate parseDate(final String dateStr, final Object original) {
-        return Jdk8LocalDateUtil.parseDate(dateStr, parse_formatters);
-    }
-
-
-    // ///////////////////////////////////////////////////////////////////////////
-    // TitleProvider
-    // ///////////////////////////////////////////////////////////////////////////
-
-    @Override
-    public String titleString(final Object value) {
-        if (value == null) {
-            return null;
-        }
-        final LocalDate date = (LocalDate) value;
-        //DateTimeFormatter f = titleStringFormatter.withLocale(Locale.getDefault());
-        return Jdk8LocalDateUtil.titleString(titleStringFormatter, date);
-    }
-
-    @Override
-    public String titleStringWithMask(final Object value, final String usingMask) {
-        final LocalDate date = (LocalDate) value;
-        return Jdk8LocalDateUtil.titleString(Jdk8LocalDateUtil.formatterOf(DateTimeFormatter.ofPattern(usingMask)), date);
-    }
-
-
-    // //////////////////////////////////////////////////////////////////
-    // EncoderDecoder
-    // //////////////////////////////////////////////////////////////////
-
-    @Override
-    protected String doEncode(final Object object) {
-        final LocalDate date = (LocalDate) object;
-        return encode(date);
-    }
-
-    private synchronized String encode(final LocalDate date) {
-        return encodingFormatter.format(date);
-    }
-
-    @Override
-    protected LocalDate doRestore(final String data) {
-        try {
-            return parse(data);
-        } catch (final IllegalArgumentException e) {
-            throw new EncodingException(e);
-        }
-    }
-
-    private synchronized LocalDate parse(final String data) {
-        return LocalDate.parse(data, encodingFormatter);
-    }
-
-    // //////////////////////////////////////////////////////////////////
-    // Jdk8LocalDateValueFacet
-    // //////////////////////////////////////////////////////////////////
-
-    @Override
-    public final LocalDate dateValue(final ManagedObject object) {
-        return (LocalDate) (object == null ? null : object.getPojo());
-    }
-
-    @Override
-    public final ManagedObject createValue(final LocalDate date) {
-        return getObjectManager().adapt(date);
-    }
-
-
-    // //////////////////////////////////////
-
-    @Override
-    public String toString() {
-        return "Jdk8LocalDateValueSemanticsProvider: " + titleStringFormatter;
-    }
-
-}
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/datejdk8local/TimeFormatter.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/datejdk8local/TimeFormatter.java
deleted file mode 100644
index 0769108..0000000
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/datejdk8local/TimeFormatter.java
+++ /dev/null
@@ -1,27 +0,0 @@
-/*
- *  Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you under the Apache License, Version 2.0 (the
- *  "License"); you may not use this file except in compliance
- *  with the License.  You may obtain a copy of the License at
- *
- *        http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing,
- *  software distributed under the License is distributed on an
- *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- *  KIND, either express or implied.  See the License for the
- *  specific language governing permissions and limitations
- *  under the License.
- */
-
-package org.apache.isis.core.metamodel.facets.value.datejdk8local;
-
-import java.time.LocalDate;
-import java.util.function.Function;
-
-interface TimeFormatter extends Function<LocalDate, String> {
-
-}
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/datetimejdk8local/Jdk8LocalDateTimeUtil.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/datetimejdk8local/Jdk8LocalDateTimeUtil.java
deleted file mode 100644
index 2c088a1..0000000
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/datetimejdk8local/Jdk8LocalDateTimeUtil.java
+++ /dev/null
@@ -1,157 +0,0 @@
-/*
- *  Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you under the Apache License, Version 2.0 (the
- *  "License"); you may not use this file except in compliance
- *  with the License.  You may obtain a copy of the License at
- *
- *        http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing,
- *  software distributed under the License is distributed on an
- *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- *  KIND, either express or implied.  See the License for the
- *  specific language governing permissions and limitations
- *  under the License.
- */
-
-package org.apache.isis.core.metamodel.facets.value.datetimejdk8local;
-
-import java.time.Instant;
-import java.time.LocalDateTime;
-import java.time.ZoneId;
-import java.util.Date;
-import java.util.List;
-import java.util.Locale;
-import java.util.StringTokenizer;
-
-import org.apache.isis.core.metamodel.facets.object.parseable.TextEntryParseException;
-
-final class Jdk8LocalDateTimeUtil  {
-
-    private Jdk8LocalDateTimeUtil(){}
-
-    // -- CONVERSION (LEGACY OF JODA TIME LIBRARY)
-
-    private final static ZoneId zId = ZoneId.systemDefault();
-
-    static TimeParser parserOf(org.joda.time.format.DateTimeFormatter jodaFormatter) {
-        return t->
-        toJava8(jodaFormatter.withLocale(Locale.getDefault()).parseLocalDateTime(t));
-    }
-
-    private static LocalDateTime toJava8(org.joda.time.LocalDateTime x){
-        if(x==null)
-            return null;
-        return toLocalDateTime(x.toDate().getTime());
-    }
-
-    private static LocalDateTime toLocalDateTime(long epochMilli) {
-        return LocalDateTime.ofInstant(Instant.ofEpochMilli(epochMilli),zId);
-    }
-
-    static TimeFormatter formatterOf(org.joda.time.format.DateTimeFormatter jodaFormatter) {
-        return t->
-        jodaFormatter.withLocale(Locale.getDefault()).print(toJoda(t));
-
-    }
-
-    private static org.joda.time.LocalDateTime toJoda(LocalDateTime x){
-        if(x==null)
-            return null;
-        return org.joda.time.LocalDateTime.fromDateFields(new Date(toEpochMilli(x)));
-    }
-
-    private static long toEpochMilli(LocalDateTime localDateTime){
-        return localDateTime.atZone(zId).toInstant().toEpochMilli();
-    }
-
-    // //////////////////////////////////////
-
-    static LocalDateTime parseDate(
-            final String dateStr,
-            List<TimeParser> parseFormatters) {
-        return parseDateTime(dateStr, parseFormatters);
-    }
-
-    private static LocalDateTime parseDateTime(String dateStr, Iterable<TimeParser> parsers) {
-        for(TimeParser parser: parsers) {
-            try {
-                return parser.apply(dateStr);
-            } catch (final IllegalArgumentException e) {
-                // continue to next
-            }
-        }
-        throw new TextEntryParseException("Not recognised as a date: " + dateStr);
-    }
-
-    // //////////////////////////////////////
-
-
-    static LocalDateTime relativeDateTime(final LocalDateTime contextDate, final String str, final boolean add) {
-        LocalDateTime relativeDate = contextDate;
-        if (str.equals("")) {
-            return contextDate;
-        }
-
-        try {
-            final StringTokenizer st = new StringTokenizer(str.substring(1), " ");
-            while (st.hasMoreTokens()) {
-                final String token = st.nextToken();
-                relativeDate = adjustDateTime(relativeDate, token, add);
-            }
-            return relativeDate;
-        } catch (final Exception e) {
-            return contextDate;
-        }
-    }
-
-    private static LocalDateTime adjustDateTime(final LocalDateTime contextDateTime, String str, final boolean add) {
-        int hours = 0;
-        int minutes = 0;
-        int days = 0;
-        int months = 0;
-        int years = 0;
-
-        if (str.endsWith("H")) {
-            str = str.substring(0, str.length() - 1);
-            hours = Integer.valueOf(str).intValue();
-        } else if (str.endsWith("M")) {
-            str = str.substring(0, str.length() - 1);
-            minutes = Integer.valueOf(str).intValue();
-        } else if (str.endsWith("w")) {
-            str = str.substring(0, str.length() - 1);
-            days = 7 * Integer.valueOf(str).intValue();
-        } else if (str.endsWith("y")) {
-            str = str.substring(0, str.length() - 1);
-            years = Integer.valueOf(str).intValue();
-        } else if (str.endsWith("m")) {
-            str = str.substring(0, str.length() - 1);
-            months = Integer.valueOf(str).intValue();
-        } else if (str.endsWith("d")) {
-            str = str.substring(0, str.length() - 1);
-            days = Integer.valueOf(str).intValue();
-        } else {
-            days = Integer.valueOf(str).intValue();
-        }
-
-        if (add) {
-            return add(contextDateTime, years, months, days, hours, minutes);
-        } else {
-            return add(contextDateTime, -years, -months, -days, -hours, -minutes);
-        }
-    }
-
-    private static LocalDateTime add(final LocalDateTime original, final int years, final int months, final int days, final int hours, final int minutes) {
-        return original.plusYears(years).plusMonths(months).plusDays(days).plusHours(hours).plusMinutes(minutes);
-    }
-
-    // //////////////////////////////////////
-
-    static String titleString(TimeFormatter titleFormatter, LocalDateTime dateTime) {
-        return dateTime == null ? "" : titleFormatter.apply(dateTime);
-    }
-
-}
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/datetimejdk8local/Jdk8LocalDateTimeValueFacetUsingSemanticsProviderFactory.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/datetimejdk8local/Jdk8LocalDateTimeValueFacetUsingSemanticsProviderFactory.java
deleted file mode 100644
index ab3cedd..0000000
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/datetimejdk8local/Jdk8LocalDateTimeValueFacetUsingSemanticsProviderFactory.java
+++ /dev/null
@@ -1,45 +0,0 @@
-/*
- *  Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you under the Apache License, Version 2.0 (the
- *  "License"); you may not use this file except in compliance
- *  with the License.  You may obtain a copy of the License at
- *
- *        http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing,
- *  software distributed under the License is distributed on an
- *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- *  KIND, either express or implied.  See the License for the
- *  specific language governing permissions and limitations
- *  under the License.
- */
-
-package org.apache.isis.core.metamodel.facets.value.datetimejdk8local;
-
-import java.time.LocalDateTime;
-
-import org.apache.isis.core.metamodel.facetapi.FacetHolder;
-import org.apache.isis.core.metamodel.facets.object.value.vsp.ValueFacetUsingSemanticsProviderFactory;
-
-public class Jdk8LocalDateTimeValueFacetUsingSemanticsProviderFactory extends ValueFacetUsingSemanticsProviderFactory<LocalDateTime> {
-
-    public Jdk8LocalDateTimeValueFacetUsingSemanticsProviderFactory() {
-        // as per inherited DateTimeValueSemanticsProvider#facetType
-        super();
-    }
-
-    @Override
-    public void process(final ProcessClassContext processClassContext) {
-        final Class<?> type = processClassContext.getCls();
-        final FacetHolder holder = processClassContext.getFacetHolder();
-
-        if (type != LocalDateTime.class) {
-            return;
-        }
-        addFacets(new Jdk8LocalDateTimeValueSemanticsProvider(holder));
-    }
-
-}
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/datetimejdk8local/Jdk8LocalDateTimeValueSemanticsProvider.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/datetimejdk8local/Jdk8LocalDateTimeValueSemanticsProvider.java
deleted file mode 100644
index 127b779..0000000
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/datetimejdk8local/Jdk8LocalDateTimeValueSemanticsProvider.java
+++ /dev/null
@@ -1,272 +0,0 @@
-/*
- *  Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you under the Apache License, Version 2.0 (the
- *  "License"); you may not use this file except in compliance
- *  with the License.  You may obtain a copy of the License at
- *
- *        http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing,
- *  software distributed under the License is distributed on an
- *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- *  KIND, either express or implied.  See the License for the
- *  specific language governing permissions and limitations
- *  under the License.
- */
-
-package org.apache.isis.core.metamodel.facets.value.datetimejdk8local;
-
-import java.time.LocalDateTime;
-import java.time.format.DateTimeFormatter;
-import java.util.List;
-import java.util.Map;
-
-import org.joda.time.format.DateTimeFormat;
-import org.joda.time.format.ISODateTimeFormat;
-
-import org.apache.isis.applib.adapters.EncoderDecoder;
-import org.apache.isis.applib.adapters.EncodingException;
-import org.apache.isis.core.commons.internal.collections._Lists;
-import org.apache.isis.core.commons.internal.collections._Maps;
-import org.apache.isis.core.config.IsisConfiguration.Value.FormatIdentifier;
-import org.apache.isis.core.metamodel.facetapi.Facet;
-import org.apache.isis.core.metamodel.facetapi.FacetHolder;
-import org.apache.isis.core.metamodel.facets.object.value.vsp.ValueSemanticsProviderAndFacetAbstract;
-import org.apache.isis.core.metamodel.spec.ManagedObject;
-
-
-public class Jdk8LocalDateTimeValueSemanticsProvider extends ValueSemanticsProviderAndFacetAbstract<LocalDateTime> implements Jdk8LocalDateTimeValueFacet {
-
-    public static final int MAX_LENGTH = 36;
-    public static final int TYPICAL_LENGTH = 22;
-
-    /**
-     * Introduced to allow BDD tests to provide a different format string "mid-flight".
-     *
-     * <p>
-     * REVIEW: This seems only to have any effect if 'propertyType' is set to 'date'.
-     *
-     * @see #setTitlePatternOverride(String)
-     * @deprecated - because 'propertyType' parameter is never used
-     */
-    @Deprecated
-    public static void setFormat(final String propertyType, final String pattern) {
-        setTitlePatternOverride(pattern);
-    }
-    /**
-     * A replacement for {@link #setFormat(String, String)}.
-     */
-    public static void setTitlePatternOverride(final String pattern) {
-        OVERRIDE_TITLE_PATTERN.set(pattern);
-    }
-
-    /*
-     * Key to indicate how LocalDateTime should be parsed/rendered.
-     *
-     * <p>
-     * eg:
-     * <pre>
-     * isis.value.format.datetime=iso
-     * </pre>
-     *
-     * <p>
-     * A pre-determined list of values is available, specifically 'iso_encoding', 'iso' and 'medium' (see
-     * {@link #NAMED_TITLE_FORMATTERS}).  Alternatively,  can also specify a mask, eg <tt>dd-MMM-yyyy</tt>.
-     *
-     * @see #NAMED_TITLE_FORMATTERS
-     */
-   //public final static String CFG_FORMAT_KEY = ConfigurationConstants.ROOT + "value.format.datetime";
-
-
-    /**
-     * Keys represent the values which can be configured, and which are used for the rendering of dates.
-     *
-     */
-    private static Map<String, TimeFormatter> NAMED_TITLE_FORMATTERS = _Maps.newHashMap();
-    static {
-        NAMED_TITLE_FORMATTERS.put("iso_encoding", Jdk8LocalDateTimeUtil.formatterOf(ISODateTimeFormat.basicDateTime()));
-        NAMED_TITLE_FORMATTERS.put("iso", Jdk8LocalDateTimeUtil.formatterOf(ISODateTimeFormat.basicDateTimeNoMillis()));
-        NAMED_TITLE_FORMATTERS.put("long", Jdk8LocalDateTimeUtil.formatterOf(DateTimeFormat.forStyle("LL")));
-        NAMED_TITLE_FORMATTERS.put("medium", Jdk8LocalDateTimeUtil.formatterOf(DateTimeFormat.forStyle("MM")));
-        NAMED_TITLE_FORMATTERS.put("short", Jdk8LocalDateTimeUtil.formatterOf(DateTimeFormat.forStyle("SS")));
-    }
-
-    private final static ThreadLocal<String> OVERRIDE_TITLE_PATTERN = new ThreadLocal<String>() {
-        @Override
-        protected String initialValue() {
-            return null;
-        }
-    };
-
-
-    private final static List<TimeParser> PARSE_FORMATTERS = _Lists.newArrayList();
-    static {
-        PARSE_FORMATTERS.add(Jdk8LocalDateTimeUtil.parserOf(DateTimeFormat.forStyle("LL")));
-        PARSE_FORMATTERS.add(Jdk8LocalDateTimeUtil.parserOf(DateTimeFormat.forStyle("MM")));
-        PARSE_FORMATTERS.add(Jdk8LocalDateTimeUtil.parserOf(DateTimeFormat.forStyle("SS")));
-        PARSE_FORMATTERS.add(Jdk8LocalDateTimeUtil.parserOf(ISODateTimeFormat.basicDateTimeNoMillis()));
-        PARSE_FORMATTERS.add(Jdk8LocalDateTimeUtil.parserOf(ISODateTimeFormat.basicDateTime()));
-    }
-
-    public static Class<? extends Facet> type() {
-        return Jdk8LocalDateTimeValueFacet.class;
-    }
-
-    // no default
-    private static final LocalDateTime DEFAULT_VALUE = null;
-
-    private final TimeParser encodingParser = Jdk8LocalDateTimeUtil.parserOf(ISODateTimeFormat.dateHourMinuteSecondMillis());
-    private final TimeFormatter encodingFormatter = Jdk8LocalDateTimeUtil.formatterOf(ISODateTimeFormat.dateHourMinuteSecondMillis());
-
-    private TimeFormatter titleStringFormatter;
-    private String titleStringFormatNameOrPattern;
-
-
-    // //////////////////////////////////////
-    // constructor
-    // //////////////////////////////////////
-
-    /**
-     * Required because implementation of {@link TimeParser} and
-     * {@link EncoderDecoder}.
-     */
-    public Jdk8LocalDateTimeValueSemanticsProvider() {
-        this(null);
-    }
-
-    /**
-     * Uses {@link #type()} as the facet type.
-     */
-    public Jdk8LocalDateTimeValueSemanticsProvider(final FacetHolder holder) {
-        super(type(), holder, LocalDateTime.class, TYPICAL_LENGTH, MAX_LENGTH, Immutability.IMMUTABLE, EqualByContent.HONOURED, DEFAULT_VALUE);
-
-        String configuredNameOrPattern = getConfiguration()
-                .getValue().getFormatOrElse(FormatIdentifier.DATETIME, "medium");
-        updateTitleStringFormatter(configuredNameOrPattern);
-    }
-
-
-    private void updateTitleStringFormatter(String titleStringFormatNameOrPattern) {
-        titleStringFormatter = NAMED_TITLE_FORMATTERS.get(titleStringFormatNameOrPattern);
-        if (titleStringFormatter == null) {
-            titleStringFormatter =
-                    DateTimeFormatter.ofPattern(titleStringFormatNameOrPattern)::format;
-        }
-        this.titleStringFormatNameOrPattern = titleStringFormatNameOrPattern;
-    }
-
-
-    // //////////////////////////////////////////////////////////////////
-    // Parsing
-    // //////////////////////////////////////////////////////////////////
-
-    @Override
-    protected LocalDateTime doParse(
-            final String entry,
-            final Object context) {
-
-        updateTitleStringFormatterIfOverridden();
-
-        LocalDateTime contextDateTime = (LocalDateTime) context;
-
-        final String dateString = entry.trim().toUpperCase();
-        if (dateString.startsWith("+") && contextDateTime != null) {
-            return Jdk8LocalDateTimeUtil.relativeDateTime(contextDateTime, dateString, true);
-        } else if (dateString.startsWith("-")  && contextDateTime != null) {
-            return Jdk8LocalDateTimeUtil.relativeDateTime(contextDateTime, dateString, false);
-        } else {
-            return parseDateTime(dateString, contextDateTime);
-        }
-    }
-
-    private void updateTitleStringFormatterIfOverridden() {
-        final String overridePattern = OVERRIDE_TITLE_PATTERN.get();
-        if (overridePattern == null ||
-                titleStringFormatNameOrPattern.equals(overridePattern)) {
-            return;
-        }
-
-        // (re)create format
-        updateTitleStringFormatter(overridePattern);
-    }
-
-    private LocalDateTime parseDateTime(final String dateStr, final Object original) {
-        return Jdk8LocalDateTimeUtil.parseDate(dateStr, PARSE_FORMATTERS);
-    }
-
-
-    // ///////////////////////////////////////////////////////////////////////////
-    // TitleProvider
-    // ///////////////////////////////////////////////////////////////////////////
-
-    @Override
-    public String titleString(final Object value) {
-        if (value == null) {
-            return null;
-        }
-        final LocalDateTime dateTime = (LocalDateTime) value;
-        return Jdk8LocalDateTimeUtil.titleString(titleStringFormatter, dateTime);
-    }
-
-    @Override
-    public String titleStringWithMask(final Object value, final String usingMask) {
-        final LocalDateTime dateTime = (LocalDateTime) value;
-        return Jdk8LocalDateTimeUtil.titleString(
-                DateTimeFormatter.ofPattern(usingMask)::format,
-                dateTime);
-    }
-
-
-    // //////////////////////////////////////////////////////////////////
-    // EncoderDecoder
-    // //////////////////////////////////////////////////////////////////
-
-    @Override
-    protected String doEncode(final Object object) {
-        final LocalDateTime date = (LocalDateTime) object;
-        return encode(date);
-    }
-
-    private synchronized String encode(final LocalDateTime date) {
-        return encodingFormatter.apply(date);
-    }
-
-    @Override
-    protected LocalDateTime doRestore(final String data) {
-        try {
-            return parse(data);
-        } catch (final IllegalArgumentException e) {
-            throw new EncodingException(e);
-        }
-    }
-
-    private synchronized LocalDateTime parse(final String data) {
-        return encodingParser.apply(data);
-    }
-
-    // //////////////////////////////////////////////////////////////////
-    // Jdk8LocalDateValueFacet
-    // //////////////////////////////////////////////////////////////////
-
-    @Override
-    public final LocalDateTime dateValue(final ManagedObject object) {
-        return (LocalDateTime) (object == null ? null : object.getPojo());
-    }
-
-    @Override
-    public final ManagedObject createValue(final LocalDateTime date) {
-        return getObjectManager().adapt(date);
-    }
-
-
-    // //////////////////////////////////////
-
-    @Override
-    public String toString() {
-        return "Jdk8LocalDateTimeValueSemanticsProvider: " + titleStringFormatter;
-    }
-
-}
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/datetimejdk8local/TimeFormatter.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/datetimejdk8local/TimeFormatter.java
deleted file mode 100644
index 4911dfc..0000000
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/datetimejdk8local/TimeFormatter.java
+++ /dev/null
@@ -1,27 +0,0 @@
-/*
- *  Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you under the Apache License, Version 2.0 (the
- *  "License"); you may not use this file except in compliance
- *  with the License.  You may obtain a copy of the License at
- *
- *        http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing,
- *  software distributed under the License is distributed on an
- *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- *  KIND, either express or implied.  See the License for the
- *  specific language governing permissions and limitations
- *  under the License.
- */
-
-package org.apache.isis.core.metamodel.facets.value.datetimejdk8local;
-
-import java.time.LocalDateTime;
-import java.util.function.Function;
-
-interface TimeFormatter extends Function<LocalDateTime, String> {
-
-}
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/datetimejdk8local/TimeParser.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/datetimejdk8local/TimeParser.java
deleted file mode 100644
index 2417cfd..0000000
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/datetimejdk8local/TimeParser.java
+++ /dev/null
@@ -1,27 +0,0 @@
-/*
- *  Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you under the Apache License, Version 2.0 (the
- *  "License"); you may not use this file except in compliance
- *  with the License.  You may obtain a copy of the License at
- *
- *        http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing,
- *  software distributed under the License is distributed on an
- *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- *  KIND, either express or implied.  See the License for the
- *  specific language governing permissions and limitations
- *  under the License.
- */
-
-package org.apache.isis.core.metamodel.facets.value.datetimejdk8local;
-
-import java.time.LocalDateTime;
-import java.util.function.Function;
-
-interface TimeParser extends Function<String, LocalDateTime> {
-
-}
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/datetimejdk8offset/Jdk8OffsetDateTimeValueFacetUsingSemanticsProviderFactory.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/datetimejdk8offset/Jdk8OffsetDateTimeValueFacetUsingSemanticsProviderFactory.java
deleted file mode 100644
index ab0dfa9..0000000
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/datetimejdk8offset/Jdk8OffsetDateTimeValueFacetUsingSemanticsProviderFactory.java
+++ /dev/null
@@ -1,45 +0,0 @@
-/*
- *  Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you under the Apache License, Version 2.0 (the
- *  "License"); you may not use this file except in compliance
- *  with the License.  You may obtain a copy of the License at
- *
- *        http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing,
- *  software distributed under the License is distributed on an
- *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- *  KIND, either express or implied.  See the License for the
- *  specific language governing permissions and limitations
- *  under the License.
- */
-
-package org.apache.isis.core.metamodel.facets.value.datetimejdk8offset;
-
-import java.time.OffsetDateTime;
-
-import org.apache.isis.core.metamodel.facetapi.FacetHolder;
-import org.apache.isis.core.metamodel.facets.object.value.vsp.ValueFacetUsingSemanticsProviderFactory;
-
-public class Jdk8OffsetDateTimeValueFacetUsingSemanticsProviderFactory extends ValueFacetUsingSemanticsProviderFactory<OffsetDateTime> {
-
-    public Jdk8OffsetDateTimeValueFacetUsingSemanticsProviderFactory() {
-        // as per inherited DateTimeValueSemanticsProvider#facetType
-        super();
-    }
-
-    @Override
-    public void process(final ProcessClassContext processClassContext) {
-        final Class<?> type = processClassContext.getCls();
-        final FacetHolder holder = processClassContext.getFacetHolder();
-
-        if (type != OffsetDateTime.class) {
-            return;
-        }
-        addFacets(new Jdk8OffsetDateTimeValueSemanticsProvider(holder));
-    }
-
-}
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/datetimejdk8offset/Jdk8OffsetDateTimeValueSemanticsProvider.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/datetimejdk8offset/Jdk8OffsetDateTimeValueSemanticsProvider.java
deleted file mode 100644
index 26d06b7..0000000
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/datetimejdk8offset/Jdk8OffsetDateTimeValueSemanticsProvider.java
+++ /dev/null
@@ -1,103 +0,0 @@
-/*
- *  Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you under the Apache License, Version 2.0 (the
- *  "License"); you may not use this file except in compliance
- *  with the License.  You may obtain a copy of the License at
- *
- *        http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing,
- *  software distributed under the License is distributed on an
- *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- *  KIND, either express or implied.  See the License for the
- *  specific language governing permissions and limitations
- *  under the License.
- */
-
-package org.apache.isis.core.metamodel.facets.value.datetimejdk8offset;
-
-import java.time.OffsetDateTime;
-import java.time.ZoneOffset;
-import java.time.format.DateTimeFormatter;
-import java.util.Date;
-
-import org.apache.isis.applib.adapters.EncoderDecoder;
-import org.apache.isis.applib.adapters.EncodingException;
-import org.apache.isis.core.metamodel.facetapi.FacetHolder;
-import org.apache.isis.core.metamodel.facets.value.datetimejoda.JodaDateTimeValueSemanticsProviderAbstract;
-
-public class Jdk8OffsetDateTimeValueSemanticsProvider extends JodaDateTimeValueSemanticsProviderAbstract<OffsetDateTime> {
-
-    // no default
-    private static final OffsetDateTime DEFAULT_VALUE = null;
-
-
-    /**
-     * Required because implementation of {@link TimeParser} and
-     * {@link EncoderDecoder}.
-     */
-    public Jdk8OffsetDateTimeValueSemanticsProvider() {
-        this(null);
-    }
-
-    public Jdk8OffsetDateTimeValueSemanticsProvider(final FacetHolder holder) {
-        super(holder, OffsetDateTime.class, DEFAULT_VALUE);
-    }
-
-    @Override
-    protected OffsetDateTime add(final OffsetDateTime original, final int years, final int months, final int days, final int hours, final int minutes) {
-        if(hours != 0 || minutes != 0) {
-            throw new IllegalArgumentException("cannot add non-zero hours or minutes to a DateTime");
-        }
-        return original.plusYears(years).plusMonths(months).plusDays(days);
-    }
-
-    @Override
-    protected OffsetDateTime now() {
-        return OffsetDateTime.now();
-    }
-
-    @Override
-    protected Date dateValue(final Object value) {
-        long epochMilli = ((OffsetDateTime) value).toInstant().toEpochMilli();
-        return new Date(epochMilli);
-    }
-
-    @Override
-    protected OffsetDateTime setDate(final Date date) {
-        return OffsetDateTime.ofInstant(date.toInstant(), ZoneOffset.UTC);
-    }
-
-    // //////////////////////////////////////////////////////////////////
-    // EncoderDecoder
-    // //////////////////////////////////////////////////////////////////
-
-    private final DateTimeFormatter encodingFormatter = DateTimeFormatter.ofPattern("yyyyMMdd'T'HHmmss.SSSZ");
-
-    @Override
-    protected String doEncode(final Object object) {
-        final OffsetDateTime date = (OffsetDateTime) object;
-        return encode(date);
-    }
-
-    private synchronized String encode(final OffsetDateTime date) {
-        return encodingFormatter.format(date);
-    }
-
-    @Override
-    protected OffsetDateTime doRestore(final String data) {
-        try {
-            return parse(data);
-        } catch (final IllegalArgumentException e) {
-            throw new EncodingException(e);
-        }
-    }
-
-    private synchronized OffsetDateTime parse(final String data) {
-        return OffsetDateTime.parse(data, encodingFormatter);
-    }
-
-}
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/datetimejdk8offset/Jdk8OffsetDateTimeValueSemanticsProviderAbstract.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/datetimejdk8offset/Jdk8OffsetDateTimeValueSemanticsProviderAbstract.java
deleted file mode 100644
index 93111e0..0000000
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/datetimejdk8offset/Jdk8OffsetDateTimeValueSemanticsProviderAbstract.java
+++ /dev/null
@@ -1,121 +0,0 @@
-/*
- *  Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you under the Apache License, Version 2.0 (the
- *  "License"); you may not use this file except in compliance
- *  with the License.  You may obtain a copy of the License at
- *
- *        http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing,
- *  software distributed under the License is distributed on an
- *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- *  KIND, either express or implied.  See the License for the
- *  specific language governing permissions and limitations
- *  under the License.
- */
-
-package org.apache.isis.core.metamodel.facets.value.datetimejdk8offset;
-
-import java.text.DateFormat;
-import java.util.ArrayList;
-import java.util.Calendar;
-import java.util.List;
-import java.util.Locale;
-import java.util.Map;
-
-import org.apache.isis.core.commons.internal.collections._Maps;
-import org.apache.isis.core.config.IsisConfiguration.Value.FormatIdentifier;
-import org.apache.isis.core.metamodel.facetapi.FacetHolder;
-import org.apache.isis.core.metamodel.facets.value.ValueSemanticsProviderAbstractTemporal;
-
-public abstract class Jdk8OffsetDateTimeValueSemanticsProviderAbstract<T> extends ValueSemanticsProviderAbstractTemporal<T> {
-
-    private static final Map<String, DateFormat> FORMATS = _Maps.newHashMap();
-
-    static {
-        FORMATS.put(ISO_ENCODING_FORMAT, createDateEncodingFormat("yyyyMMdd"));
-        FORMATS.put("iso", createDateFormat("yyyy-MM-dd"));
-        FORMATS.put("medium", DateFormat.getDateInstance(DateFormat.MEDIUM));
-    }
-
-    public Jdk8OffsetDateTimeValueSemanticsProviderAbstract(final FacetHolder holder, final Class<T> adaptedClass, final T defaultValue) {
-        super(FormatIdentifier.DATE, holder, adaptedClass, 12, Immutability.IMMUTABLE, EqualByContent.HONOURED, defaultValue);
-
-        String formatRequired = getConfiguration()
-                .getValue().getFormatOrElse(FormatIdentifier.DATE, "medium");
-        
-        if (formatRequired == null) {
-            format = formats().get(defaultFormat());
-        } else {
-            setMask(formatRequired);
-        }
-    }
-
-
-    // //////////////////////////////////////////////////////////////////
-    // temporal-specific stuff
-    // //////////////////////////////////////////////////////////////////
-
-    @Override
-    protected void clearFields(final Calendar cal) {
-        cal.set(Calendar.HOUR, 0);
-        cal.set(Calendar.HOUR_OF_DAY, 0);
-        cal.set(Calendar.MINUTE, 0);
-        cal.set(Calendar.SECOND, 0);
-        cal.set(Calendar.AM_PM, 0);
-        cal.set(Calendar.MILLISECOND, 0);
-    }
-
-    @Override
-    protected String defaultFormat() {
-        return "medium";
-    }
-
-    @Override
-    protected boolean ignoreTimeZone() {
-        return true;
-    }
-
-    @Override
-    protected Map<String, DateFormat> formats() {
-        return FORMATS;
-    }
-
-    @Override
-    public String toString() {
-        return "DateValueSemanticsProvider: " + format;
-    }
-
-    @Override
-    protected DateFormat format() {
-        final Locale locale = Locale.getDefault();
-
-        final DateFormat dateFormat = DateFormat.getDateInstance(DateFormat.MEDIUM, locale);
-        dateFormat.setTimeZone(UTC_TIME_ZONE);
-        return dateFormat;
-    }
-
-    @Override
-    protected List<DateFormat> formatsToTry() {
-
-        final Locale locale = Locale.getDefault();
-
-        List<DateFormat> formats = new ArrayList<>();
-
-        formats.add(DateFormat.getDateInstance(DateFormat.LONG, locale));
-        formats.add(DateFormat.getDateInstance(DateFormat.MEDIUM, locale));
-        formats.add(DateFormat.getDateInstance(DateFormat.SHORT, locale));
-        formats.add(createDateFormat("yyyy-MM-dd"));
-        formats.add(createDateFormat("yyyyMMdd"));
-
-        for (DateFormat format : formats) {
-            format.setTimeZone(UTC_TIME_ZONE);
-        }
-
-        return formats;
-    }
-
-}
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/temporal/TemporalAdjust.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/temporal/TemporalAdjust.java
new file mode 100644
index 0000000..f03b100
--- /dev/null
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/temporal/TemporalAdjust.java
@@ -0,0 +1,108 @@
+package org.apache.isis.core.metamodel.facets.value.temporal;
+
+import java.time.LocalDate;
+import java.time.LocalDateTime;
+import java.time.LocalTime;
+import java.time.OffsetDateTime;
+import java.time.OffsetTime;
+import java.time.ZonedDateTime;
+
+import org.apache.isis.core.commons.internal.exceptions._Exceptions;
+
+import lombok.Value;
+
+@Value(staticConstructor = "of")
+public class TemporalAdjust {
+
+    private int years;
+    private int months;
+    private int days;
+    private int hours;
+    private int minutes;
+    
+    public static TemporalAdjust parse(String str) {
+        int hours = 0;
+        int minutes = 0;
+        int days = 0;
+        int months = 0;
+        int years = 0;
+
+        if (str.endsWith("H")) {
+            str = str.substring(0, str.length() - 1);
+            hours = Integer.valueOf(str).intValue();
+        } else if (str.endsWith("M")) {
+            str = str.substring(0, str.length() - 1);
+            minutes = Integer.valueOf(str).intValue();
+        } else if (str.endsWith("w")) {
+            str = str.substring(0, str.length() - 1);
+            days = 7 * Integer.valueOf(str).intValue();
+        } else if (str.endsWith("y")) {
+            str = str.substring(0, str.length() - 1);
+            years = Integer.valueOf(str).intValue();
+        } else if (str.endsWith("m")) {
+            str = str.substring(0, str.length() - 1);
+            months = Integer.valueOf(str).intValue();
+        } else if (str.endsWith("d")) {
+            str = str.substring(0, str.length() - 1);
+            days = Integer.valueOf(str).intValue();
+        } else {
+            days = Integer.valueOf(str).intValue();
+        }
+        
+        return TemporalAdjust.of(years, months, days, hours, minutes);
+    }
+    
+    public TemporalAdjust sign(int sign) {
+        if(sign==1) {
+            return this;
+        }
+        if(sign==-1) {
+            return of(-this.years, -this.months, -this.days, -this.hours, -this.minutes);
+        }
+        throw _Exceptions.unsupportedOperation();
+    }
+    
+    
+    public LocalDate adjustLocalDate(final LocalDate temporal) {
+        if(hours != 0 || minutes != 0) {
+            throw _Exceptions.illegalState("cannot add non-zero hours or minutes to a %s", 
+                    temporal.getClass().getName());
+        }
+        return temporal.plusYears(years).plusMonths(months).plusDays(days);
+    }
+    
+    public LocalTime adjustLocalTime(final LocalTime temporal) {
+        if(years != 0 || months != 0 || days != 0) {
+            throw _Exceptions.illegalState("cannot add non-zero years, months or days to a %s", 
+                    temporal.getClass().getName());
+        }
+        return temporal.plusHours(hours).plusMinutes(minutes);
+    }
+    
+    public OffsetTime adjustOffsetTime(final OffsetTime temporal) {
+        if(years != 0 || months != 0 || days != 0) {
+            throw _Exceptions.illegalState("cannot add non-zero years, months or days to a %s", 
+                    temporal.getClass().getName());
+        }
+        return temporal.plusHours(hours).plusMinutes(minutes);
+    }
+
+    public LocalDateTime adjustLocalDateTime(final LocalDateTime temporal) {
+        return temporal.plusYears(years).plusMonths(months).plusDays(days)
+                .plusHours(hours).plusMinutes(minutes);
+    }
+
+    public OffsetDateTime adjustOffsetDateTime(final OffsetDateTime temporal) {
+        return temporal.plusYears(years).plusMonths(months).plusDays(days)
+                .plusHours(hours).plusMinutes(minutes);
+    }
+    
+    public ZonedDateTime adjustZonedDateTime(final ZonedDateTime temporal) {
+        return temporal.plusYears(years).plusMonths(months).plusDays(days)
+                .plusHours(hours).plusMinutes(minutes);
+    }
+    
+    
+    
+
+}
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/temporal/TemporalAdjustUtil.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/temporal/TemporalAdjustUtil.java
new file mode 100644
index 0000000..9b114f3
--- /dev/null
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/temporal/TemporalAdjustUtil.java
@@ -0,0 +1,61 @@
+package org.apache.isis.core.metamodel.facets.value.temporal;
+
+import java.time.temporal.Temporal;
+import java.util.StringTokenizer;
+import java.util.function.BiFunction;
+
+import lombok.val;
+import lombok.experimental.UtilityClass;
+
+@UtilityClass
+final class TemporalAdjustUtil {
+    
+    static <T extends Temporal> T parseAdjustment(
+            final BiFunction<TemporalAdjust, T, T> adjuster,
+            final T contextTemporal, 
+            final String temporalString) {
+        
+        if (temporalString.startsWith("+")) {
+            return TemporalAdjustUtil.relativeTemporal(adjuster, contextTemporal, temporalString, 1);
+        } 
+        if (temporalString.startsWith("-")) {
+            return TemporalAdjustUtil.relativeTemporal(adjuster, contextTemporal, temporalString, -1);
+        }
+        return null;
+    }
+    
+    private static <T extends Temporal> T relativeTemporal(
+            final BiFunction<TemporalAdjust, T, T> adjuster,
+            final T contextTemporal, 
+            final String str, 
+            final int sign) {
+        
+        T relativeDate = contextTemporal;
+        if (str.equals("")) {
+            return contextTemporal;
+        }
+
+        try {
+            final StringTokenizer st = new StringTokenizer(str.substring(1), " ");
+            while (st.hasMoreTokens()) {
+                final String token = st.nextToken();
+                relativeDate = adjustTemporal(adjuster, relativeDate, token, sign);
+            }
+            return relativeDate;
+        } catch (final Exception e) {
+            return contextTemporal;
+        }
+    }
+
+    private static <T extends Temporal> T adjustTemporal(
+            final BiFunction<TemporalAdjust, T, T> adjuster,
+            final T contextDate, 
+            final String str, 
+            final int sign) {
+        
+        val temporalAdjust = TemporalAdjust.parse(str).sign(sign);
+        return adjuster.apply(temporalAdjust, contextDate);
+    }
+
+
+}
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/datejdk8local/Jdk8LocalDateValueFacet.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/temporal/TemporalValueFacet.java
similarity index 61%
copy from core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/datejdk8local/Jdk8LocalDateValueFacet.java
copy to core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/temporal/TemporalValueFacet.java
index f67c452..6e9cec9 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/datejdk8local/Jdk8LocalDateValueFacet.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/temporal/TemporalValueFacet.java
@@ -16,18 +16,31 @@
  *  specific language governing permissions and limitations
  *  under the License.
  */
+package org.apache.isis.core.metamodel.facets.value.temporal;
 
-package org.apache.isis.core.metamodel.facets.value.datejdk8local;
-
-import java.time.LocalDate;
+import java.time.temporal.Temporal;
 
 import org.apache.isis.core.metamodel.facetapi.Facet;
 import org.apache.isis.core.metamodel.spec.ManagedObject;
 
-public interface Jdk8LocalDateValueFacet extends Facet {
-
-    LocalDate dateValue(ManagedObject object);
+/**
+ * Common base for {@link java.time.temporal.Temporal} types.
+ * 
+ * @since 2.0
+ *
+ * @param <T> implementing {@link java.time.temporal.Temporal} type
+ */
+public interface TemporalValueFacet<T extends Temporal> extends Facet {
 
-    ManagedObject createValue(LocalDate date);
+    T temporalValue(ManagedObject object);
+    ManagedObject createValue(T temporal);
+    
+//    TemporalCategory getTemporalCategory();
+//    
+//    static enum TemporalCategory {
+//        TIME_ONLY,
+//        DATE_ONLY,
+//        DATE_TIME
+//    }
 
 }
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/temporal/TemporalValueFacetUsingSemanticsProviderFactory.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/temporal/TemporalValueFacetUsingSemanticsProviderFactory.java
new file mode 100644
index 0000000..a47be49
--- /dev/null
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/temporal/TemporalValueFacetUsingSemanticsProviderFactory.java
@@ -0,0 +1,64 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ */
+package org.apache.isis.core.metamodel.facets.value.temporal;
+
+import java.time.temporal.Temporal;
+import java.util.function.Function;
+
+import org.apache.isis.core.metamodel.facetapi.FacetHolder;
+import org.apache.isis.core.metamodel.facets.object.value.vsp.ValueFacetUsingSemanticsProviderFactory;
+import org.apache.isis.core.metamodel.facets.object.value.vsp.ValueSemanticsProviderAndFacetAbstract;
+
+import lombok.NonNull;
+import lombok.val;
+
+/**
+ * Common base for {@link java.time.temporal.Temporal} types.
+ * 
+ * @since 2.0
+ *
+ * @param <T> implementing {@link java.time.temporal.Temporal} type
+ */
+public abstract class TemporalValueFacetUsingSemanticsProviderFactory<T extends Temporal>
+extends ValueFacetUsingSemanticsProviderFactory<T> {
+
+    @NonNull protected final Class<T> valueType;
+    @NonNull protected final Function<FacetHolder, ValueSemanticsProviderAndFacetAbstract<T>> facetFactory;
+    
+    public TemporalValueFacetUsingSemanticsProviderFactory(Class<T> valueType,
+            Function<FacetHolder, ValueSemanticsProviderAndFacetAbstract<T>> facetFactory) {
+        super();
+        this.valueType = valueType;
+        this.facetFactory = facetFactory;
+    }
+
+    @Override
+    public final void process(final ProcessClassContext processClassContext) {
+        val type = processClassContext.getCls();
+        if (!valueType.isAssignableFrom(type)) {
+            return;
+        }
+        val facetHolder = processClassContext.getFacetHolder();
+        addFacets(facetFactory.apply(facetHolder));
+    }
+    
+     
+    
+
+}
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/temporal/TemporalValueSemanticsProviderAbstract.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/temporal/TemporalValueSemanticsProviderAbstract.java
new file mode 100644
index 0000000..1ae7121
--- /dev/null
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/temporal/TemporalValueSemanticsProviderAbstract.java
@@ -0,0 +1,234 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ */
+package org.apache.isis.core.metamodel.facets.value.temporal;
+
+import java.time.format.DateTimeFormatter;
+import java.time.temporal.Temporal;
+import java.time.temporal.TemporalQuery;
+import java.util.Locale;
+import java.util.Map;
+import java.util.Optional;
+import java.util.function.BiFunction;
+import java.util.function.Function;
+
+import javax.annotation.Nullable;
+
+import org.apache.isis.applib.adapters.EncodingException;
+import org.apache.isis.core.commons.collections.Can;
+import org.apache.isis.core.commons.internal.base._Casts;
+import org.apache.isis.core.commons.internal.collections._Maps;
+import org.apache.isis.core.commons.internal.exceptions._Exceptions;
+import org.apache.isis.core.config.IsisConfiguration.Value.FormatIdentifier;
+import org.apache.isis.core.metamodel.facetapi.Facet;
+import org.apache.isis.core.metamodel.facetapi.FacetHolder;
+import org.apache.isis.core.metamodel.facets.object.parseable.TextEntryParseException;
+import org.apache.isis.core.metamodel.facets.object.value.vsp.ValueSemanticsProviderAndFacetAbstract;
+import org.apache.isis.core.metamodel.spec.ManagedObject;
+
+import lombok.Getter;
+import lombok.NonNull;
+import lombok.Setter;
+import lombok.val;
+import lombok.extern.log4j.Log4j2;
+
+/**
+ * Common base for {@link java.time.temporal.Temporal} types.
+ * 
+ * @since 2.0
+ *
+ * @param <T> implementing {@link java.time.temporal.Temporal} type
+ */
+@Log4j2
+public abstract class TemporalValueSemanticsProviderAbstract<T extends Temporal> 
+extends ValueSemanticsProviderAndFacetAbstract<T>
+implements TemporalValueFacet<T> {
+    
+    @Getter private DateTimeFormatter encodingFormatter;
+    @Getter @Setter private DateTimeFormatter titleFormatter;
+    
+    /**
+     * Keys represent the values which can be configured, 
+     * and which are used for the rendering of dates.
+     */
+    protected final Map<String, DateTimeFormatter> namedFormatters;
+    protected Can<Function<String, T>> parsers;
+    
+    protected final TemporalQuery<T> query;
+    protected final BiFunction<TemporalAdjust, T, T> adjuster;
+    
+    public TemporalValueSemanticsProviderAbstract(
+            Class<? extends Facet> adapterFacetType, 
+            FacetHolder holder,
+            Class<T> valueType, 
+            int typicalLength, 
+            int maxLength,
+            TemporalQuery<T> query,
+            BiFunction<TemporalAdjust, T, T> adjuster) {
+        
+        super(adapterFacetType, holder, valueType, typicalLength, maxLength, 
+                Immutability.IMMUTABLE, EqualByContent.HONOURED, /*DEFAULT_VALUE*/ null);
+        
+        this.query = query;
+        this.adjuster = adjuster;
+        
+        namedFormatters = _Maps.newLinkedHashMap();
+        namedFormatters.put("internal_encoding", this.getEncodingFormatter());
+        updateParsers();
+    }
+    
+    protected void setEncodingFormatter(DateTimeFormatter encodingFormatter) {
+        this.encodingFormatter = encodingFormatter;
+    }
+    
+    protected void addNamedFormat(String name, String pattern) {
+        namedFormatters.put(name, DateTimeFormatter.ofPattern(pattern, Locale.getDefault()));
+    }
+    
+    protected Optional<DateTimeFormatter> lookupNamedFormatter(String formatName) {
+        return Optional.ofNullable(namedFormatters.get(formatName));
+    }
+    
+    protected DateTimeFormatter lookupNamedFormatterElseFail(String formatName) {
+        return lookupNamedFormatter(formatName)
+                .orElseThrow(()->_Exceptions.noSuchElement("unknown format name %s", formatName));
+    }
+    
+    protected DateTimeFormatter formatterFromConfig(FormatIdentifier formatIdentifier, String namedFallback) {
+        
+        val configuredNameOrPattern = getConfiguration()
+                .getValue()
+                .getFormatOrElse(formatIdentifier, namedFallback);
+        
+        val formatter = lookupNamedFormatter(configuredNameOrPattern).orElse(null);
+        if(formatter!=null) {
+            return formatter;
+        }
+        
+        try {
+            return DateTimeFormatter.ofPattern(configuredNameOrPattern, Locale.getDefault());
+        } catch (Exception e) {
+            log.warn(e);
+        }
+        
+        return lookupNamedFormatterElseFail(namedFallback);
+
+    }
+    
+    
+    protected void updateParsers() {
+        parsers = Can.ofCollection(namedFormatters.values())
+                .map(formatter->{
+                    return $->formatter.parse($, query);
+                });
+    }
+    
+    // -- TEMPORAL VALUE FACET
+
+    @Override
+    public final T temporalValue(final ManagedObject adapter) {
+        return _Casts.uncheckedCast(ManagedObject.unwrapSingle(adapter));
+    }
+
+    @Override
+    public final ManagedObject createValue(final T temporal) {
+        return getObjectManager().adapt(temporal);
+    }
+    
+    // -- ENCODER/DECODER
+
+    @Override
+    protected String doEncode(final Object object) {
+        final T temporal = _Casts.uncheckedCast(object);
+        return encodingFormatter.format(temporal);
+    }
+
+    @Override
+    protected T doRestore(final String data) {
+        try {
+            return encodingFormatter.parse(data, query);
+        } catch (final IllegalArgumentException e) {
+            throw new EncodingException(e);
+        }
+    }
+    
+    // -- PARSING
+
+    @Override
+    protected T doParse(
+            final String entry,
+            final Object context) {
+
+        T contextTemporal = _Casts.uncheckedCast(context);
+
+        val temporalString = entry.trim().toUpperCase();
+        if(contextTemporal != null) {
+            val adjusted = TemporalAdjustUtil
+                    .parseAdjustment(adjuster, contextTemporal, temporalString);
+            if(adjusted!=null) {
+                return adjusted;
+            }
+        }
+        return parse(temporalString, parsers);
+    }
+    
+    private T parse(String dateStr, Iterable<Function<String, T>> parsers) {
+        for(val parser: parsers) {
+            try {
+                return parser.apply(dateStr);
+            } catch (final IllegalArgumentException e) {
+                // continue to next
+            }
+        }
+        val msg = String.format("Not recognised as a %s: %s", 
+                super.getAdaptedClass().getName(), 
+                dateStr);
+        throw new TextEntryParseException(msg);
+    }
+    
+    // -- TITLE
+
+    @Override
+    public String titleString(final Object value) {
+        if (value == null) {
+            return null;
+        }
+        val temporal = _Casts.<T>uncheckedCast(value);
+        return titleString(titleFormatter, temporal);
+    }
+
+    @Override
+    public String titleStringWithMask(final Object value, final String usingMask) {
+        val temporal = _Casts.<T>uncheckedCast(value);
+        val formatter = DateTimeFormatter.ofPattern(usingMask, Locale.getDefault());
+        return titleString(formatter, temporal);
+    }
+    
+    private String titleString(@NonNull DateTimeFormatter formatter, @Nullable T temporal) {
+        return temporal != null ? formatter.format(temporal) : "";
+    }
+
+    // --
+
+    @Override
+    public String toString() {
+        return this.getClass().getSimpleName()+ ": " + titleFormatter;
+    }
+    
+    
+}
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/datejdk8local/Jdk8LocalDateValueFacet.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/temporal/localdate/LocalDateValueFacetUsingSemanticsProviderFactory.java
similarity index 65%
copy from core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/datejdk8local/Jdk8LocalDateValueFacet.java
copy to core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/temporal/localdate/LocalDateValueFacetUsingSemanticsProviderFactory.java
index f67c452..a22118d 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/datejdk8local/Jdk8LocalDateValueFacet.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/temporal/localdate/LocalDateValueFacetUsingSemanticsProviderFactory.java
@@ -17,17 +17,17 @@
  *  under the License.
  */
 
-package org.apache.isis.core.metamodel.facets.value.datejdk8local;
+package org.apache.isis.core.metamodel.facets.value.temporal.localdate;
 
 import java.time.LocalDate;
 
-import org.apache.isis.core.metamodel.facetapi.Facet;
-import org.apache.isis.core.metamodel.spec.ManagedObject;
+import org.apache.isis.core.metamodel.facets.value.temporal.TemporalValueFacetUsingSemanticsProviderFactory;
 
-public interface Jdk8LocalDateValueFacet extends Facet {
+public class LocalDateValueFacetUsingSemanticsProviderFactory 
+extends TemporalValueFacetUsingSemanticsProviderFactory<LocalDate> {
 
-    LocalDate dateValue(ManagedObject object);
-
-    ManagedObject createValue(LocalDate date);
+    public LocalDateValueFacetUsingSemanticsProviderFactory() {
+        super(LocalDate.class, LocalDateValueSemanticsProvider::new);
+    }
 
 }
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/temporal/localdate/LocalDateValueSemanticsProvider.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/temporal/localdate/LocalDateValueSemanticsProvider.java
new file mode 100644
index 0000000..9af407f
--- /dev/null
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/temporal/localdate/LocalDateValueSemanticsProvider.java
@@ -0,0 +1,53 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ */
+
+package org.apache.isis.core.metamodel.facets.value.temporal.localdate;
+
+import java.time.LocalDate;
+
+import org.apache.isis.core.config.IsisConfiguration.Value.FormatIdentifier;
+import org.apache.isis.core.metamodel.facetapi.FacetHolder;
+import org.apache.isis.core.metamodel.facets.value.temporal.TemporalAdjust;
+import org.apache.isis.core.metamodel.facets.value.temporal.TemporalValueFacet;
+import org.apache.isis.core.metamodel.facets.value.temporal.TemporalValueSemanticsProviderAbstract;
+
+public class LocalDateValueSemanticsProvider
+extends TemporalValueSemanticsProviderAbstract<LocalDate> {
+
+    public static final int MAX_LENGTH = 12;
+    public static final int TYPICAL_LENGTH = MAX_LENGTH;
+
+    public LocalDateValueSemanticsProvider(final FacetHolder holder) {
+        super(TemporalValueFacet.class, holder, LocalDate.class, TYPICAL_LENGTH, MAX_LENGTH,
+                LocalDate::from,
+                TemporalAdjust::adjustLocalDate);
+        
+        super.addNamedFormat("long", "L-");
+        super.addNamedFormat("medium", "M-");
+        super.addNamedFormat("short", "S-");
+        super.addNamedFormat("iso", "yyyy-MM-dd");
+        super.addNamedFormat("iso_encoding", "yyyy-MM-dd");
+        super.updateParsers();
+
+        setEncodingFormatter(lookupNamedFormatterElseFail("iso_encoding"));
+        setTitleFormatter(formatterFromConfig(FormatIdentifier.DATE, "medium"));
+    }
+
+
+}
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/datetimejdk8local/Jdk8LocalDateTimeValueFacet.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/temporal/localdatetime/LocalDateTimeValueFacetUsingSemanticsProviderFactory.java
similarity index 64%
rename from core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/datetimejdk8local/Jdk8LocalDateTimeValueFacet.java
rename to core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/temporal/localdatetime/LocalDateTimeValueFacetUsingSemanticsProviderFactory.java
index 1a69d2f..04e0d71 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/datetimejdk8local/Jdk8LocalDateTimeValueFacet.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/temporal/localdatetime/LocalDateTimeValueFacetUsingSemanticsProviderFactory.java
@@ -17,17 +17,17 @@
  *  under the License.
  */
 
-package org.apache.isis.core.metamodel.facets.value.datetimejdk8local;
+package org.apache.isis.core.metamodel.facets.value.temporal.localdatetime;
 
 import java.time.LocalDateTime;
 
-import org.apache.isis.core.metamodel.facetapi.Facet;
-import org.apache.isis.core.metamodel.spec.ManagedObject;
+import org.apache.isis.core.metamodel.facets.value.temporal.TemporalValueFacetUsingSemanticsProviderFactory;
 
-public interface Jdk8LocalDateTimeValueFacet extends Facet {
+public class LocalDateTimeValueFacetUsingSemanticsProviderFactory 
+extends TemporalValueFacetUsingSemanticsProviderFactory<LocalDateTime> {
 
-    LocalDateTime dateValue(ManagedObject object);
-
-    ManagedObject createValue(LocalDateTime date);
+    public LocalDateTimeValueFacetUsingSemanticsProviderFactory() {
+        super(LocalDateTime.class, LocalDateTimeValueSemanticsProvider::new);
+    }
 
 }
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/temporal/localdatetime/LocalDateTimeValueSemanticsProvider.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/temporal/localdatetime/LocalDateTimeValueSemanticsProvider.java
new file mode 100644
index 0000000..42bc101
--- /dev/null
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/temporal/localdatetime/LocalDateTimeValueSemanticsProvider.java
@@ -0,0 +1,64 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ */
+
+package org.apache.isis.core.metamodel.facets.value.temporal.localdatetime;
+
+import java.time.LocalDateTime;
+import java.time.format.DateTimeFormatter;
+import java.util.Locale;
+
+import org.apache.isis.core.config.IsisConfiguration.Value.FormatIdentifier;
+import org.apache.isis.core.metamodel.facetapi.FacetHolder;
+import org.apache.isis.core.metamodel.facets.value.temporal.TemporalAdjust;
+import org.apache.isis.core.metamodel.facets.value.temporal.TemporalValueFacet;
+import org.apache.isis.core.metamodel.facets.value.temporal.TemporalValueSemanticsProviderAbstract;
+
+import lombok.val;
+
+
+public class LocalDateTimeValueSemanticsProvider 
+extends TemporalValueSemanticsProviderAbstract<LocalDateTime> {
+
+    public static final int MAX_LENGTH = 36;
+    public static final int TYPICAL_LENGTH = 22;
+    
+    public LocalDateTimeValueSemanticsProvider(final FacetHolder holder) {
+        super(TemporalValueFacet.class, holder, LocalDateTime.class, TYPICAL_LENGTH, MAX_LENGTH,
+                LocalDateTime::from,
+                TemporalAdjust::adjustLocalDateTime);
+        
+        val dateHourMinuteSecondMillis = "yyyy-MM-dd'T'HH:mm:ss.SSS";
+        val basicDateTimeNoMillis = "yyyyMMdd'T'HHmmssZ";
+        val basicDateTime = "yyyyMMdd'T'HHmmss.SSSZ";
+        
+        super.addNamedFormat("long", "LL");
+        super.addNamedFormat("medium", "MM");
+        super.addNamedFormat("short", "SS");
+        super.addNamedFormat("iso", basicDateTimeNoMillis);
+        super.addNamedFormat("iso_encoding", basicDateTime);
+        
+        super.updateParsers();
+
+        setEncodingFormatter(
+                DateTimeFormatter.ofPattern(dateHourMinuteSecondMillis, Locale.getDefault()));
+        setTitleFormatter(formatterFromConfig(FormatIdentifier.DATETIME, "medium"));
+        
+    }
+
+}
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/datejdk8local/TimeParser.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/temporal/localtime/LocalTimeValueFacetUsingSemanticsProviderFactory.java
similarity index 63%
rename from core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/datejdk8local/TimeParser.java
rename to core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/temporal/localtime/LocalTimeValueFacetUsingSemanticsProviderFactory.java
index b8d945a..94a8d9f 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/datejdk8local/TimeParser.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/temporal/localtime/LocalTimeValueFacetUsingSemanticsProviderFactory.java
@@ -17,11 +17,17 @@
  *  under the License.
  */
 
-package org.apache.isis.core.metamodel.facets.value.datejdk8local;
+package org.apache.isis.core.metamodel.facets.value.temporal.localtime;
 
-import java.time.LocalDate;
-import java.util.function.Function;
+import java.time.LocalTime;
 
-interface TimeParser extends Function<String, LocalDate> {
+import org.apache.isis.core.metamodel.facets.value.temporal.TemporalValueFacetUsingSemanticsProviderFactory;
+
+public class LocalTimeValueFacetUsingSemanticsProviderFactory 
+extends TemporalValueFacetUsingSemanticsProviderFactory<LocalTime> {
+
+    public LocalTimeValueFacetUsingSemanticsProviderFactory() {
+        super(LocalTime.class, LocalTimeValueSemanticsProvider::new);
+    }
 
 }
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/temporal/localtime/LocalTimeValueSemanticsProvider.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/temporal/localtime/LocalTimeValueSemanticsProvider.java
new file mode 100644
index 0000000..1eee4c0
--- /dev/null
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/temporal/localtime/LocalTimeValueSemanticsProvider.java
@@ -0,0 +1,63 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ */
+
+package org.apache.isis.core.metamodel.facets.value.temporal.localtime;
+
+import java.time.LocalTime;
+import java.time.format.DateTimeFormatter;
+import java.util.Locale;
+
+import org.apache.isis.core.config.IsisConfiguration.Value.FormatIdentifier;
+import org.apache.isis.core.metamodel.facetapi.FacetHolder;
+import org.apache.isis.core.metamodel.facets.value.temporal.TemporalAdjust;
+import org.apache.isis.core.metamodel.facets.value.temporal.TemporalValueFacet;
+import org.apache.isis.core.metamodel.facets.value.temporal.TemporalValueSemanticsProviderAbstract;
+
+import lombok.val;
+
+public class LocalTimeValueSemanticsProvider
+extends TemporalValueSemanticsProviderAbstract<LocalTime> {
+
+    public static final int MAX_LENGTH = 12;
+    public static final int TYPICAL_LENGTH = MAX_LENGTH;
+
+    public LocalTimeValueSemanticsProvider(final FacetHolder holder) {
+        super(TemporalValueFacet.class, holder, LocalTime.class, TYPICAL_LENGTH, MAX_LENGTH,
+                LocalTime::from,
+                TemporalAdjust::adjustLocalTime);
+        
+        val hourMinuteSecondMillis = "HH:mm:ss.SSS";
+        val basicTimeNoMillis = "HHmmssZ";
+        val basicTime = "HHmmss.SSSZ";
+        
+        super.addNamedFormat("long", "-L");
+        super.addNamedFormat("medium", "-M");
+        super.addNamedFormat("short", "-S");
+        super.addNamedFormat("iso", basicTimeNoMillis);
+        super.addNamedFormat("iso_encoding", basicTime);
+        super.updateParsers();
+
+        setEncodingFormatter(
+                DateTimeFormatter.ofPattern(hourMinuteSecondMillis, Locale.getDefault()));
+        setTitleFormatter(formatterFromConfig(FormatIdentifier.TIME, "medium"));
+
+    }
+
+
+}
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/datetimejdk8offset/Jdk8OffsetDateTimeValueFacet.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/temporal/offsetdatetime/OffsetDateTimeValueFacetUsingSemanticsProviderFactory.java
similarity index 64%
rename from core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/datetimejdk8offset/Jdk8OffsetDateTimeValueFacet.java
rename to core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/temporal/offsetdatetime/OffsetDateTimeValueFacetUsingSemanticsProviderFactory.java
index 8c48349..5700867 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/datetimejdk8offset/Jdk8OffsetDateTimeValueFacet.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/temporal/offsetdatetime/OffsetDateTimeValueFacetUsingSemanticsProviderFactory.java
@@ -17,17 +17,17 @@
  *  under the License.
  */
 
-package org.apache.isis.core.metamodel.facets.value.datetimejdk8offset;
+package org.apache.isis.core.metamodel.facets.value.temporal.offsetdatetime;
 
 import java.time.OffsetDateTime;
 
-import org.apache.isis.core.metamodel.facetapi.Facet;
-import org.apache.isis.core.metamodel.spec.ManagedObject;
+import org.apache.isis.core.metamodel.facets.value.temporal.TemporalValueFacetUsingSemanticsProviderFactory;
 
-public interface Jdk8OffsetDateTimeValueFacet extends Facet {
+public class OffsetDateTimeValueFacetUsingSemanticsProviderFactory 
+extends TemporalValueFacetUsingSemanticsProviderFactory<OffsetDateTime> {
 
-    OffsetDateTime dateValue(ManagedObject object);
-
-    ManagedObject createValue(OffsetDateTime date);
+    public OffsetDateTimeValueFacetUsingSemanticsProviderFactory() {
+        super(OffsetDateTime.class, OffsetDateTimeValueSemanticsProvider::new);
+    }
 
 }
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/temporal/offsetdatetime/OffsetDateTimeValueSemanticsProvider.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/temporal/offsetdatetime/OffsetDateTimeValueSemanticsProvider.java
new file mode 100644
index 0000000..6b5bbdd
--- /dev/null
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/temporal/offsetdatetime/OffsetDateTimeValueSemanticsProvider.java
@@ -0,0 +1,65 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ */
+
+package org.apache.isis.core.metamodel.facets.value.temporal.offsetdatetime;
+
+import java.time.OffsetDateTime;
+import java.time.format.DateTimeFormatter;
+import java.util.Locale;
+
+import org.apache.isis.core.config.IsisConfiguration.Value.FormatIdentifier;
+import org.apache.isis.core.metamodel.facetapi.FacetHolder;
+import org.apache.isis.core.metamodel.facets.value.temporal.TemporalAdjust;
+import org.apache.isis.core.metamodel.facets.value.temporal.TemporalValueFacet;
+import org.apache.isis.core.metamodel.facets.value.temporal.TemporalValueSemanticsProviderAbstract;
+
+import lombok.val;
+
+
+public class OffsetDateTimeValueSemanticsProvider 
+extends TemporalValueSemanticsProviderAbstract<OffsetDateTime> {
+
+    public static final int MAX_LENGTH = 36;
+    public static final int TYPICAL_LENGTH = 22;
+    
+    public OffsetDateTimeValueSemanticsProvider(final FacetHolder holder) {
+        super(TemporalValueFacet.class, holder, OffsetDateTime.class, TYPICAL_LENGTH, MAX_LENGTH,
+                OffsetDateTime::from,
+                TemporalAdjust::adjustOffsetDateTime);
+        
+        val basicDateTimeNoMillis = "yyyyMMdd'T'HHmmssZ";
+        val basicDateTime = "yyyyMMdd'T'HHmmss.SSSZ";
+        
+        super.addNamedFormat("long", "LL");
+        super.addNamedFormat("medium", "MM");
+        super.addNamedFormat("short", "SS");
+        super.addNamedFormat("iso", basicDateTimeNoMillis);
+        super.addNamedFormat("iso_encoding", basicDateTime);
+        
+        super.updateParsers();
+
+        setEncodingFormatter(
+                DateTimeFormatter.ofPattern(basicDateTime, Locale.getDefault()));
+        
+        setTitleFormatter(formatterFromConfig(FormatIdentifier.DATETIME, "medium"));
+        
+        
+    }
+
+}
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/datejdk8local/Jdk8LocalDateValueFacet.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/temporal/offsettime/OffsetTimeValueFacetUsingSemanticsProviderFactory.java
similarity index 63%
copy from core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/datejdk8local/Jdk8LocalDateValueFacet.java
copy to core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/temporal/offsettime/OffsetTimeValueFacetUsingSemanticsProviderFactory.java
index f67c452..76b77e3 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/datejdk8local/Jdk8LocalDateValueFacet.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/temporal/offsettime/OffsetTimeValueFacetUsingSemanticsProviderFactory.java
@@ -17,17 +17,17 @@
  *  under the License.
  */
 
-package org.apache.isis.core.metamodel.facets.value.datejdk8local;
+package org.apache.isis.core.metamodel.facets.value.temporal.offsettime;
 
-import java.time.LocalDate;
+import java.time.OffsetTime;
 
-import org.apache.isis.core.metamodel.facetapi.Facet;
-import org.apache.isis.core.metamodel.spec.ManagedObject;
+import org.apache.isis.core.metamodel.facets.value.temporal.TemporalValueFacetUsingSemanticsProviderFactory;
 
-public interface Jdk8LocalDateValueFacet extends Facet {
+public class OffsetTimeValueFacetUsingSemanticsProviderFactory 
+extends TemporalValueFacetUsingSemanticsProviderFactory<OffsetTime> {
 
-    LocalDate dateValue(ManagedObject object);
-
-    ManagedObject createValue(LocalDate date);
+    public OffsetTimeValueFacetUsingSemanticsProviderFactory() {
+        super(OffsetTime.class, OffsetTimeValueSemanticsProvider::new);
+    }
 
 }
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/temporal/offsettime/OffsetTimeValueSemanticsProvider.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/temporal/offsettime/OffsetTimeValueSemanticsProvider.java
new file mode 100644
index 0000000..60bac06
--- /dev/null
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/temporal/offsettime/OffsetTimeValueSemanticsProvider.java
@@ -0,0 +1,60 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ */
+
+package org.apache.isis.core.metamodel.facets.value.temporal.offsettime;
+
+import java.time.OffsetTime;
+
+import org.apache.isis.core.config.IsisConfiguration.Value.FormatIdentifier;
+import org.apache.isis.core.metamodel.facetapi.FacetHolder;
+import org.apache.isis.core.metamodel.facets.value.temporal.TemporalAdjust;
+import org.apache.isis.core.metamodel.facets.value.temporal.TemporalValueFacet;
+import org.apache.isis.core.metamodel.facets.value.temporal.TemporalValueSemanticsProviderAbstract;
+
+import lombok.val;
+
+public class OffsetTimeValueSemanticsProvider
+extends TemporalValueSemanticsProviderAbstract<OffsetTime> {
+
+    public static final int MAX_LENGTH = 12;
+    public static final int TYPICAL_LENGTH = MAX_LENGTH;
+
+    public OffsetTimeValueSemanticsProvider(final FacetHolder holder) {
+        super(TemporalValueFacet.class, holder, OffsetTime.class, TYPICAL_LENGTH, MAX_LENGTH,
+                OffsetTime::from,
+                TemporalAdjust::adjustOffsetTime);
+        
+        val basicTimeNoMillis = "HHmmssZ";
+        val basicTime = "HHmmss.SSSZ";
+        
+        super.addNamedFormat("long", "-L");
+        super.addNamedFormat("medium", "-M");
+        super.addNamedFormat("short", "-S");
+        super.addNamedFormat("iso", basicTimeNoMillis);
+        super.addNamedFormat("iso_encoding", basicTime);
+        super.updateParsers();
+        
+        setEncodingFormatter(lookupNamedFormatterElseFail("iso_encoding"));
+        setTitleFormatter(formatterFromConfig(FormatIdentifier.TIME, "medium"));
+    }
+
+
+
+
+}
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/datejdk8local/Jdk8LocalDateValueFacet.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/temporal/zoneddatetime/ZonedDateTimeValueFacetUsingSemanticsProviderFactory.java
similarity index 62%
rename from core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/datejdk8local/Jdk8LocalDateValueFacet.java
rename to core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/temporal/zoneddatetime/ZonedDateTimeValueFacetUsingSemanticsProviderFactory.java
index f67c452..f6520f7 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/datejdk8local/Jdk8LocalDateValueFacet.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/temporal/zoneddatetime/ZonedDateTimeValueFacetUsingSemanticsProviderFactory.java
@@ -17,17 +17,17 @@
  *  under the License.
  */
 
-package org.apache.isis.core.metamodel.facets.value.datejdk8local;
+package org.apache.isis.core.metamodel.facets.value.temporal.zoneddatetime;
 
-import java.time.LocalDate;
+import java.time.ZonedDateTime;
 
-import org.apache.isis.core.metamodel.facetapi.Facet;
-import org.apache.isis.core.metamodel.spec.ManagedObject;
+import org.apache.isis.core.metamodel.facets.value.temporal.TemporalValueFacetUsingSemanticsProviderFactory;
 
-public interface Jdk8LocalDateValueFacet extends Facet {
+public class ZonedDateTimeValueFacetUsingSemanticsProviderFactory 
+extends TemporalValueFacetUsingSemanticsProviderFactory<ZonedDateTime> {
 
-    LocalDate dateValue(ManagedObject object);
-
-    ManagedObject createValue(LocalDate date);
+    public ZonedDateTimeValueFacetUsingSemanticsProviderFactory() {
+        super(ZonedDateTime.class, ZonedDateTimeValueSemanticsProvider::new);
+    }
 
 }
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/temporal/zoneddatetime/ZonedDateTimeValueSemanticsProvider.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/temporal/zoneddatetime/ZonedDateTimeValueSemanticsProvider.java
new file mode 100644
index 0000000..04dd12e
--- /dev/null
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/temporal/zoneddatetime/ZonedDateTimeValueSemanticsProvider.java
@@ -0,0 +1,61 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ */
+
+package org.apache.isis.core.metamodel.facets.value.temporal.zoneddatetime;
+
+import java.time.ZonedDateTime;
+
+import org.apache.isis.core.config.IsisConfiguration.Value.FormatIdentifier;
+import org.apache.isis.core.metamodel.facetapi.FacetHolder;
+import org.apache.isis.core.metamodel.facets.value.temporal.TemporalAdjust;
+import org.apache.isis.core.metamodel.facets.value.temporal.TemporalValueFacet;
+import org.apache.isis.core.metamodel.facets.value.temporal.TemporalValueSemanticsProviderAbstract;
+
+import lombok.val;
+
+
+public class ZonedDateTimeValueSemanticsProvider 
+extends TemporalValueSemanticsProviderAbstract<ZonedDateTime> {
+
+    public static final int MAX_LENGTH = 36;
+    public static final int TYPICAL_LENGTH = 22;
+    
+    //TODO adjust formats and config options (just copied over from OffsetDateTime... )
+    public ZonedDateTimeValueSemanticsProvider(final FacetHolder holder) {
+        super(TemporalValueFacet.class, holder, ZonedDateTime.class, TYPICAL_LENGTH, MAX_LENGTH,
+                ZonedDateTime::from,
+                TemporalAdjust::adjustZonedDateTime);
+        
+        val basicDateTimeNoMillis = "yyyyMMdd'T'HHmmssZ";
+        val basicDateTime = "yyyyMMdd'T'HHmmss.SSSZ";
+        
+        super.addNamedFormat("long", "LL");
+        super.addNamedFormat("medium", "MM");
+        super.addNamedFormat("short", "SS");
+        super.addNamedFormat("iso", basicDateTimeNoMillis);
+        super.addNamedFormat("iso_encoding", basicDateTime);
+        
+        super.updateParsers();
+
+        setEncodingFormatter(lookupNamedFormatterElseFail("iso_encoding"));
+        setTitleFormatter(formatterFromConfig(FormatIdentifier.TIME, "medium"));
+        
+    }
+
+}
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/time/TimeValueSemanticsProviderAbstract.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/time/TimeValueSemanticsProviderAbstract.java
index 6da2493..3fda3df 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/time/TimeValueSemanticsProviderAbstract.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/value/time/TimeValueSemanticsProviderAbstract.java
@@ -30,7 +30,8 @@ import org.apache.isis.core.config.IsisConfiguration.Value.FormatIdentifier;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
 import org.apache.isis.core.metamodel.facets.value.ValueSemanticsProviderAbstractTemporal;
 
-public abstract class TimeValueSemanticsProviderAbstract<T> extends ValueSemanticsProviderAbstractTemporal<T> {
+public abstract class TimeValueSemanticsProviderAbstract<T> 
+extends ValueSemanticsProviderAbstractTemporal<T> {
 
     private static final Object DEFAULT_VALUE = null; // no default
     private static final int TYPICAL_LENGTH = 8;
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/progmodels/dflt/ProgrammingModelFacetsJava8.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/progmodels/dflt/ProgrammingModelFacetsJava8.java
index d807f3b..6bc4609 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/progmodels/dflt/ProgrammingModelFacetsJava8.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/progmodels/dflt/ProgrammingModelFacetsJava8.java
@@ -23,6 +23,7 @@ import org.apache.isis.applib.Identifier;
 import org.apache.isis.applib.services.inject.ServiceInjector;
 import org.apache.isis.core.commons.internal.ioc.BeanSort;
 import org.apache.isis.core.metamodel.authorization.standard.AuthorizationFacetFactory;
+import org.apache.isis.core.metamodel.facets.OrphanedSupportingMethodValidator;
 import org.apache.isis.core.metamodel.facets.actions.action.ActionAnnotationFacetFactory;
 import org.apache.isis.core.metamodel.facets.actions.action.ActionChoicesForCollectionParameterFacetFactory;
 import org.apache.isis.core.metamodel.facets.actions.defaults.method.ActionDefaultsFacetViaMethodFactory;
@@ -32,7 +33,17 @@ import org.apache.isis.core.metamodel.facets.actions.notcontributed.derived.NotC
 import org.apache.isis.core.metamodel.facets.actions.notcontributed.derived.NotContributedFacetDerivedFromMixinFacetFactory;
 import org.apache.isis.core.metamodel.facets.actions.notinservicemenu.derived.NotInServiceMenuFacetDerivedFromDomainServiceFacetFactory;
 import org.apache.isis.core.metamodel.facets.actions.validate.method.ActionValidationFacetViaMethodFactory;
+import org.apache.isis.core.metamodel.facets.all.i18n.TranslationFacetFactory;
+import org.apache.isis.core.metamodel.facets.collections.accessor.CollectionAccessorFacetViaAccessorFactory;
+import org.apache.isis.core.metamodel.facets.collections.clear.CollectionClearFacetFactory;
+import org.apache.isis.core.metamodel.facets.collections.collection.CollectionAnnotationFacetFactory;
+import org.apache.isis.core.metamodel.facets.collections.javautilcollection.CollectionFacetFactory;
+import org.apache.isis.core.metamodel.facets.collections.layout.CollectionLayoutFacetFactory;
+import org.apache.isis.core.metamodel.facets.collections.modify.CollectionAddToRemoveFromAndValidateFacetFactory;
+import org.apache.isis.core.metamodel.facets.collections.parented.ParentedFacetSinceCollectionFactory;
+import org.apache.isis.core.metamodel.facets.collections.sortedby.annotation.SortedByFacetAnnotationFactory;
 import org.apache.isis.core.metamodel.facets.fallback.FallbackFacetFactory;
+import org.apache.isis.core.metamodel.facets.jaxb.JaxbFacetFactory;
 import org.apache.isis.core.metamodel.facets.members.cssclass.annotprop.CssClassFacetOnActionFromConfiguredRegexFactory;
 import org.apache.isis.core.metamodel.facets.members.cssclassfa.annotprop.CssClassFaFacetOnMemberFactory;
 import org.apache.isis.core.metamodel.facets.members.describedas.annotprop.DescribedAsFacetOnMemberFactory;
@@ -40,12 +51,38 @@ import org.apache.isis.core.metamodel.facets.members.disabled.method.DisableForC
 import org.apache.isis.core.metamodel.facets.members.hidden.method.HideForContextFacetViaMethodFactory;
 import org.apache.isis.core.metamodel.facets.members.order.annotprop.MemberOrderFacetFactory;
 import org.apache.isis.core.metamodel.facets.object.ViewModelSemanticCheckingFacetFactory;
+import org.apache.isis.core.metamodel.facets.object.bookmarkpolicy.bookmarkable.BookmarkPolicyFacetFallbackFactory;
+import org.apache.isis.core.metamodel.facets.object.callbacks.CreatedCallbackFacetFactory;
+import org.apache.isis.core.metamodel.facets.object.callbacks.LoadCallbackFacetFactory;
+import org.apache.isis.core.metamodel.facets.object.callbacks.PersistCallbackFacetFactory;
+import org.apache.isis.core.metamodel.facets.object.callbacks.PersistCallbackViaSaveMethodFacetFactory;
+import org.apache.isis.core.metamodel.facets.object.callbacks.RemoveCallbackFacetFactory;
+import org.apache.isis.core.metamodel.facets.object.callbacks.UpdateCallbackFacetFactory;
+import org.apache.isis.core.metamodel.facets.object.choices.enums.EnumFacetUsingValueFacetUsingSemanticsProviderFactory;
+import org.apache.isis.core.metamodel.facets.object.cssclass.method.CssClassFacetMethodFactory;
+import org.apache.isis.core.metamodel.facets.object.defaults.annotcfg.DefaultedFacetAnnotationElseConfigurationFactory;
+import org.apache.isis.core.metamodel.facets.object.disabled.method.DisabledObjectFacetViaMethodFactory;
+import org.apache.isis.core.metamodel.facets.object.domainobject.DomainObjectAnnotationFacetFactory;
+import org.apache.isis.core.metamodel.facets.object.domainobjectlayout.DomainObjectLayoutFacetFactory;
+import org.apache.isis.core.metamodel.facets.object.domainservice.annotation.DomainServiceFacetAnnotationFactory;
 import org.apache.isis.core.metamodel.facets.object.domainservicelayout.DomainServiceLayoutFacetFactory;
+import org.apache.isis.core.metamodel.facets.object.facets.annotation.FacetsFacetAnnotationFactory;
 import org.apache.isis.core.metamodel.facets.object.grid.GridFacetFactory;
+import org.apache.isis.core.metamodel.facets.object.hidden.method.HiddenObjectFacetViaMethodFactory;
 import org.apache.isis.core.metamodel.facets.object.icon.method.IconFacetMethodFactory;
+import org.apache.isis.core.metamodel.facets.object.ignore.annotation.RemoveAnnotatedMethodsFacetFactory;
+import org.apache.isis.core.metamodel.facets.object.ignore.javalang.IteratorFilteringFacetFactory;
+import org.apache.isis.core.metamodel.facets.object.ignore.javalang.RemoveMethodsFacetFactory;
+import org.apache.isis.core.metamodel.facets.object.layout.LayoutFacetFactory;
 import org.apache.isis.core.metamodel.facets.object.mixin.MixinFacetForMixinAnnotationFactory;
+import org.apache.isis.core.metamodel.facets.object.navparent.annotation.NavigableParentAnnotationFacetFactory;
+import org.apache.isis.core.metamodel.facets.object.objectspecid.classname.ObjectSpecIdFacetDerivedFromClassNameFactory;
+import org.apache.isis.core.metamodel.facets.object.objectvalidprops.impl.ObjectValidPropertiesFacetImplFactory;
+import org.apache.isis.core.metamodel.facets.object.recreatable.RecreatableObjectFacetFactory;
 import org.apache.isis.core.metamodel.facets.object.title.annotation.TitleAnnotationFacetFactory;
 import org.apache.isis.core.metamodel.facets.object.title.methods.TitleFacetViaMethodsFactory;
+import org.apache.isis.core.metamodel.facets.object.validating.validateobject.method.ValidateObjectFacetMethodFactory;
+import org.apache.isis.core.metamodel.facets.object.value.annotcfg.ValueFacetAnnotationOrConfigurationFactory;
 import org.apache.isis.core.metamodel.facets.param.autocomplete.method.ActionParameterAutoCompleteFacetViaMethodFactory;
 import org.apache.isis.core.metamodel.facets.param.bigdecimal.javaxvaldigits.BigDecimalFacetOnParameterFromJavaxValidationAnnotationFactory;
 import org.apache.isis.core.metamodel.facets.param.choices.method.ActionChoicesFacetViaMethodFactory;
@@ -59,12 +96,14 @@ import org.apache.isis.core.metamodel.facets.param.name.ParameterNameFacetFactor
 import org.apache.isis.core.metamodel.facets.param.parameter.ParameterAnnotationFacetFactory;
 import org.apache.isis.core.metamodel.facets.param.validate.method.ActionParameterValidationFacetViaMethodFactory;
 import org.apache.isis.core.metamodel.facets.properties.accessor.PropertyAccessorFacetViaAccessorFactory;
+import org.apache.isis.core.metamodel.facets.properties.autocomplete.method.PropertyAutoCompleteFacetMethodFactory;
 import org.apache.isis.core.metamodel.facets.properties.bigdecimal.javaxvaldigits.BigDecimalFacetOnPropertyFromJavaxValidationDigitsAnnotationFactory;
 import org.apache.isis.core.metamodel.facets.properties.choices.method.PropertyChoicesFacetViaMethodFactory;
 import org.apache.isis.core.metamodel.facets.properties.defaults.method.PropertyDefaultFacetViaMethodFactory;
 import org.apache.isis.core.metamodel.facets.properties.disabled.inferred.DisabledFacetOnPropertyInferredFactory;
 import org.apache.isis.core.metamodel.facets.properties.mandatory.dflt.MandatoryFacetOnProperyDefaultFactory;
 import org.apache.isis.core.metamodel.facets.properties.property.PropertyAnnotationFacetFactory;
+import org.apache.isis.core.metamodel.facets.properties.propertylayout.PropertyLayoutFacetFactory;
 import org.apache.isis.core.metamodel.facets.properties.update.PropertyModifyFacetFactory;
 import org.apache.isis.core.metamodel.facets.properties.update.PropertySetAndClearFacetFactory;
 import org.apache.isis.core.metamodel.facets.properties.validating.dflt.PropertyValidateFacetDefaultFactory;
@@ -79,11 +118,8 @@ import org.apache.isis.core.metamodel.facets.value.bytes.ByteWrapperValueFacetUs
 import org.apache.isis.core.metamodel.facets.value.chars.CharPrimitiveValueFacetUsingSemanticsProviderFactory;
 import org.apache.isis.core.metamodel.facets.value.chars.CharWrapperValueFacetUsingSemanticsProviderFactory;
 import org.apache.isis.core.metamodel.facets.value.clobs.ClobValueFacetUsingSemanticsProviderFactory;
-import org.apache.isis.core.metamodel.facets.value.datejdk8local.Jdk8LocalDateValueFacetUsingSemanticsProviderFactory;
 import org.apache.isis.core.metamodel.facets.value.datejodalocal.JodaLocalDateValueFacetUsingSemanticsProviderFactory;
 import org.apache.isis.core.metamodel.facets.value.datesql.JavaSqlDateValueFacetUsingSemanticsProviderFactory;
-import org.apache.isis.core.metamodel.facets.value.datetimejdk8local.Jdk8LocalDateTimeValueFacetUsingSemanticsProviderFactory;
-import org.apache.isis.core.metamodel.facets.value.datetimejdk8offset.Jdk8OffsetDateTimeValueFacetUsingSemanticsProviderFactory;
 import org.apache.isis.core.metamodel.facets.value.datetimejoda.JodaDateTimeValueFacetUsingSemanticsProviderFactory;
 import org.apache.isis.core.metamodel.facets.value.datetimejodalocal.JodaLocalDateTimeValueFacetUsingSemanticsProviderFactory;
 import org.apache.isis.core.metamodel.facets.value.dateutil.JavaUtilDateValueFacetUsingSemanticsProviderFactory;
@@ -102,51 +138,18 @@ import org.apache.isis.core.metamodel.facets.value.password.PasswordValueFacetUs
 import org.apache.isis.core.metamodel.facets.value.shortint.ShortPrimitiveValueFacetUsingSemanticsProviderFactory;
 import org.apache.isis.core.metamodel.facets.value.shortint.ShortWrapperValueFacetUsingSemanticsProviderFactory;
 import org.apache.isis.core.metamodel.facets.value.string.StringValueFacetUsingSemanticsProviderFactory;
+import org.apache.isis.core.metamodel.facets.value.temporal.localdate.LocalDateValueFacetUsingSemanticsProviderFactory;
+import org.apache.isis.core.metamodel.facets.value.temporal.localdatetime.LocalDateTimeValueFacetUsingSemanticsProviderFactory;
+import org.apache.isis.core.metamodel.facets.value.temporal.localtime.LocalTimeValueFacetUsingSemanticsProviderFactory;
+import org.apache.isis.core.metamodel.facets.value.temporal.offsetdatetime.OffsetDateTimeValueFacetUsingSemanticsProviderFactory;
+import org.apache.isis.core.metamodel.facets.value.temporal.offsettime.OffsetTimeValueFacetUsingSemanticsProviderFactory;
+import org.apache.isis.core.metamodel.facets.value.temporal.zoneddatetime.ZonedDateTimeValueFacetUsingSemanticsProviderFactory;
 import org.apache.isis.core.metamodel.facets.value.timejodalocal.JodaLocalTimeValueFacetSimpleFactory;
 import org.apache.isis.core.metamodel.facets.value.timesql.JavaSqlTimeValueFacetUsingSemanticsProviderFactory;
 import org.apache.isis.core.metamodel.facets.value.timestampsql.JavaSqlTimeStampValueFacetUsingSemanticsProviderFactory;
 import org.apache.isis.core.metamodel.facets.value.url.URLValueFacetUsingSemanticsProviderFactory;
 import org.apache.isis.core.metamodel.facets.value.uuid.UUIDValueFacetUsingSemanticsProviderFactory;
 import org.apache.isis.core.metamodel.postprocessors.param.DeriveFacetsPostProcessor;
-import org.apache.isis.core.metamodel.facets.OrphanedSupportingMethodValidator;
-import org.apache.isis.core.metamodel.facets.all.i18n.TranslationFacetFactory;
-import org.apache.isis.core.metamodel.facets.collections.accessor.CollectionAccessorFacetViaAccessorFactory;
-import org.apache.isis.core.metamodel.facets.collections.clear.CollectionClearFacetFactory;
-import org.apache.isis.core.metamodel.facets.collections.collection.CollectionAnnotationFacetFactory;
-import org.apache.isis.core.metamodel.facets.collections.javautilcollection.CollectionFacetFactory;
-import org.apache.isis.core.metamodel.facets.collections.layout.CollectionLayoutFacetFactory;
-import org.apache.isis.core.metamodel.facets.collections.modify.CollectionAddToRemoveFromAndValidateFacetFactory;
-import org.apache.isis.core.metamodel.facets.collections.parented.ParentedFacetSinceCollectionFactory;
-import org.apache.isis.core.metamodel.facets.collections.sortedby.annotation.SortedByFacetAnnotationFactory;
-import org.apache.isis.core.metamodel.facets.jaxb.JaxbFacetFactory;
-import org.apache.isis.core.metamodel.facets.object.bookmarkpolicy.bookmarkable.BookmarkPolicyFacetFallbackFactory;
-import org.apache.isis.core.metamodel.facets.object.callbacks.CreatedCallbackFacetFactory;
-import org.apache.isis.core.metamodel.facets.object.callbacks.LoadCallbackFacetFactory;
-import org.apache.isis.core.metamodel.facets.object.callbacks.PersistCallbackFacetFactory;
-import org.apache.isis.core.metamodel.facets.object.callbacks.PersistCallbackViaSaveMethodFacetFactory;
-import org.apache.isis.core.metamodel.facets.object.callbacks.RemoveCallbackFacetFactory;
-import org.apache.isis.core.metamodel.facets.object.callbacks.UpdateCallbackFacetFactory;
-import org.apache.isis.core.metamodel.facets.object.choices.enums.EnumFacetUsingValueFacetUsingSemanticsProviderFactory;
-import org.apache.isis.core.metamodel.facets.object.cssclass.method.CssClassFacetMethodFactory;
-import org.apache.isis.core.metamodel.facets.object.defaults.annotcfg.DefaultedFacetAnnotationElseConfigurationFactory;
-import org.apache.isis.core.metamodel.facets.object.disabled.method.DisabledObjectFacetViaMethodFactory;
-import org.apache.isis.core.metamodel.facets.object.domainobject.DomainObjectAnnotationFacetFactory;
-import org.apache.isis.core.metamodel.facets.object.domainobjectlayout.DomainObjectLayoutFacetFactory;
-import org.apache.isis.core.metamodel.facets.object.domainservice.annotation.DomainServiceFacetAnnotationFactory;
-import org.apache.isis.core.metamodel.facets.object.facets.annotation.FacetsFacetAnnotationFactory;
-import org.apache.isis.core.metamodel.facets.object.hidden.method.HiddenObjectFacetViaMethodFactory;
-import org.apache.isis.core.metamodel.facets.object.ignore.annotation.RemoveAnnotatedMethodsFacetFactory;
-import org.apache.isis.core.metamodel.facets.object.ignore.javalang.IteratorFilteringFacetFactory;
-import org.apache.isis.core.metamodel.facets.object.ignore.javalang.RemoveMethodsFacetFactory;
-import org.apache.isis.core.metamodel.facets.object.layout.LayoutFacetFactory;
-import org.apache.isis.core.metamodel.facets.object.navparent.annotation.NavigableParentAnnotationFacetFactory;
-import org.apache.isis.core.metamodel.facets.object.objectspecid.classname.ObjectSpecIdFacetDerivedFromClassNameFactory;
-import org.apache.isis.core.metamodel.facets.object.objectvalidprops.impl.ObjectValidPropertiesFacetImplFactory;
-import org.apache.isis.core.metamodel.facets.object.recreatable.RecreatableObjectFacetFactory;
-import org.apache.isis.core.metamodel.facets.object.validating.validateobject.method.ValidateObjectFacetMethodFactory;
-import org.apache.isis.core.metamodel.facets.object.value.annotcfg.ValueFacetAnnotationOrConfigurationFactory;
-import org.apache.isis.core.metamodel.facets.properties.autocomplete.method.PropertyAutoCompleteFacetMethodFactory;
-import org.apache.isis.core.metamodel.facets.properties.propertylayout.PropertyLayoutFacetFactory;
 import org.apache.isis.core.metamodel.progmodel.ProgrammingModelAbstract;
 import org.apache.isis.core.metamodel.services.title.TitlesAndTranslationsValidator;
 import org.apache.isis.core.metamodel.spec.feature.Contributed;
@@ -334,9 +337,12 @@ public final class ProgrammingModelFacetsJava8 extends ProgrammingModelAbstract
         addFactory(FacetProcessingOrder.G1_VALUE_TYPES, JodaLocalTimeValueFacetSimpleFactory.class);
 
         // java 8 time values
-        addFactory(FacetProcessingOrder.G1_VALUE_TYPES, Jdk8LocalDateValueFacetUsingSemanticsProviderFactory.class);
-        addFactory(FacetProcessingOrder.G1_VALUE_TYPES, Jdk8OffsetDateTimeValueFacetUsingSemanticsProviderFactory.class);
-        addFactory(FacetProcessingOrder.G1_VALUE_TYPES, Jdk8LocalDateTimeValueFacetUsingSemanticsProviderFactory.class);
+        addFactory(FacetProcessingOrder.G1_VALUE_TYPES, LocalTimeValueFacetUsingSemanticsProviderFactory.class);
+        addFactory(FacetProcessingOrder.G1_VALUE_TYPES, OffsetTimeValueFacetUsingSemanticsProviderFactory.class);
+        addFactory(FacetProcessingOrder.G1_VALUE_TYPES, LocalDateValueFacetUsingSemanticsProviderFactory.class);
+        addFactory(FacetProcessingOrder.G1_VALUE_TYPES, LocalDateTimeValueFacetUsingSemanticsProviderFactory.class);
+        addFactory(FacetProcessingOrder.G1_VALUE_TYPES, OffsetDateTimeValueFacetUsingSemanticsProviderFactory.class);
+        addFactory(FacetProcessingOrder.G1_VALUE_TYPES, ZonedDateTimeValueFacetUsingSemanticsProviderFactory.class);
 
         addFactory(FacetProcessingOrder.Z0_BEFORE_FINALLY, AuthorizationFacetFactory.class);
 
diff --git a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/DomainEventHelperTest_newPropertyDomainEvent_forClear.java b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/DomainEventHelperTest_newPropertyDomainEvent_forClear.java
index c17aff9..3dfc238 100644
--- a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/DomainEventHelperTest_newPropertyDomainEvent_forClear.java
+++ b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/DomainEventHelperTest_newPropertyDomainEvent_forClear.java
@@ -18,7 +18,8 @@
  */
 package org.apache.isis.core.metamodel.facets;
 
-import org.joda.time.LocalDate;
+import java.time.LocalDate;
+
 import org.junit.Test;
 
 import static org.hamcrest.CoreMatchers.is;
@@ -43,7 +44,7 @@ public class DomainEventHelperTest_newPropertyDomainEvent_forClear {
 
         SomeDomainObject sdo = new SomeDomainObject();
         Identifier identifier = Identifier.propertyOrCollectionIdentifier(SomeDomainObject.class, "someDateProperty");
-        LocalDate oldValue = new LocalDate(2013,4,1);
+        LocalDate oldValue = LocalDate.of(2013,4,1);
         LocalDate newValue = null;
 
         Utils.domainEventHelper();
@@ -61,7 +62,7 @@ public class DomainEventHelperTest_newPropertyDomainEvent_forClear {
 
         SomeDomainObject sdo = new SomeDomainObject();
         Identifier identifier = Identifier.propertyOrCollectionIdentifier(SomeDomainObject.class, "someDateProperty");
-        LocalDate oldValue = new LocalDate(2013,4,1);
+        LocalDate oldValue = LocalDate.of(2013,4,1);
         LocalDate newValue = null;
 
         Utils.domainEventHelper();
diff --git a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/DomainEventHelperTest_newPropertyDomainEvent_forModify.java b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/DomainEventHelperTest_newPropertyDomainEvent_forModify.java
index dcf4048..319edc6 100644
--- a/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/DomainEventHelperTest_newPropertyDomainEvent_forModify.java
+++ b/core/metamodel/src/test/java/org/apache/isis/core/metamodel/facets/DomainEventHelperTest_newPropertyDomainEvent_forModify.java
@@ -18,7 +18,8 @@
  */
 package org.apache.isis.core.metamodel.facets;
 
-import org.joda.time.LocalDate;
+import java.time.LocalDate;
+
 import org.junit.Test;
 
 import static org.hamcrest.CoreMatchers.is;
@@ -39,8 +40,8 @@ public class DomainEventHelperTest_newPropertyDomainEvent_forModify {
 
         SomeDomainObject sdo = new SomeDomainObject();
         Identifier identifier = Identifier.propertyOrCollectionIdentifier(SomeDomainObject.class, "someDateProperty");
-        LocalDate oldValue = new LocalDate(2013,4,1);
-        LocalDate newValue = new LocalDate(2013,5,2);
+        LocalDate oldValue = LocalDate.of(2013,4,1);
+        LocalDate newValue = LocalDate.of(2013,5,2);
 
         Utils.domainEventHelper();
         final PropertyDomainEvent<Object, Object> ev =
@@ -57,8 +58,8 @@ public class DomainEventHelperTest_newPropertyDomainEvent_forModify {
 
         SomeDomainObject sdo = new SomeDomainObject();
         Identifier identifier = Identifier.propertyOrCollectionIdentifier(SomeDomainObject.class, "someDateProperty");
-        LocalDate oldValue = new LocalDate(2013,4,1);
-        LocalDate newValue = new LocalDate(2013,5,2);
+        LocalDate oldValue = LocalDate.of(2013,4,1);
+        LocalDate newValue = LocalDate.of(2013,5,2);
 
         Utils.domainEventHelper();
         final PropertyDomainEvent<SomeDomainObject, LocalDate> ev =
diff --git a/core/runtimeservices/src/main/java/org/apache/isis/core/runtimeservices/i18n/po/PoWriter.java b/core/runtimeservices/src/main/java/org/apache/isis/core/runtimeservices/i18n/po/PoWriter.java
index 9651285..36f5be9 100644
--- a/core/runtimeservices/src/main/java/org/apache/isis/core/runtimeservices/i18n/po/PoWriter.java
+++ b/core/runtimeservices/src/main/java/org/apache/isis/core/runtimeservices/i18n/po/PoWriter.java
@@ -18,11 +18,12 @@
  */
 package org.apache.isis.core.runtimeservices.i18n.po;
 
+import java.time.LocalDateTime;
+import java.time.format.DateTimeFormatter;
+import java.util.Locale;
 import java.util.SortedMap;
 import java.util.SortedSet;
 
-import org.joda.time.LocalDateTime;
-
 import org.apache.isis.applib.services.i18n.TranslationService;
 import org.apache.isis.core.commons.internal.collections._Maps;
 import org.apache.isis.core.commons.internal.collections._Sets;
@@ -80,11 +81,15 @@ class PoWriter extends PoAbstract {
         log.info(buf.toString());
     }
 
+    final static DateTimeFormatter timestampFormat = 
+            DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss+Z", Locale.US);
+    
     /**
      * As per <a href="http://pology.nedohodnik.net/doc/user/en_US/ch-poformat.html">section 2.6</a>.
      */
     protected void header(final StringBuilder buf) {
-        final String createdAt = LocalDateTime.now().toString("yyyy-MM-dd HH:mm:ss+Z");
+        
+        final String createdAt = LocalDateTime.now().format(timestampFormat);
         buf.append("#, fuzzy").append("\n");
         buf.append("msgid \"\"").append("\n");
         buf.append("msgstr \"\"").append("\n");
diff --git a/testing/unittestsupport/applib/src/main/java/org/apache/isis/testing/unittestsupport/applib/bean/FixtureDatumFactoriesForTime.java b/testing/unittestsupport/applib/src/main/java/org/apache/isis/testing/unittestsupport/applib/bean/FixtureDatumFactoriesForTime.java
new file mode 100644
index 0000000..b0f35a7
--- /dev/null
+++ b/testing/unittestsupport/applib/src/main/java/org/apache/isis/testing/unittestsupport/applib/bean/FixtureDatumFactoriesForTime.java
@@ -0,0 +1,76 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ */
+package org.apache.isis.testing.unittestsupport.applib.bean;
+
+import java.time.LocalDate;
+import java.time.LocalDateTime;
+import java.time.LocalTime;
+import java.time.OffsetDateTime;
+import java.time.ZoneOffset;
+
+/**
+ * 
+ * @since 2.0
+ *
+ */
+public class FixtureDatumFactoriesForTime {
+
+    public static PojoTester.FixtureDatumFactory<LocalTime> localTimes() {
+        return new PojoTester.FixtureDatumFactory<>(
+                LocalTime.class,
+                LocalTime.of(11, 15),
+                LocalTime.of(12, 20),
+                LocalTime.of(13, 30),
+                LocalTime.of(14, 45)
+        );
+    }
+    
+	public static PojoTester.FixtureDatumFactory<LocalDate> localDates() {
+		return new PojoTester.FixtureDatumFactory<>(
+				LocalDate.class,
+				LocalDate.of(2012, 7, 19),
+				LocalDate.of(2012, 7, 20),
+				LocalDate.of(2012, 8, 19),
+				LocalDate.of(2013, 7, 19)
+		);
+	}
+
+	public static PojoTester.FixtureDatumFactory<LocalDateTime> localDateTimes() {
+		return new PojoTester.FixtureDatumFactory<>(
+				LocalDateTime.class,
+				LocalDateTime.of(2012, 7, 19, 11, 15),
+				LocalDateTime.of(2012, 7, 20, 12, 20),
+				LocalDateTime.of(2012, 8, 19, 13, 30),
+				LocalDateTime.of(2013, 7, 19, 14, 45)
+		);
+	}
+
+
+	public static PojoTester.FixtureDatumFactory<OffsetDateTime> offsetDateTimes() {
+		return new PojoTester.FixtureDatumFactory<>(
+		        OffsetDateTime.class,
+				OffsetDateTime.of(2012, 7, 19, 11, 15, 0, 0, ZoneOffset.UTC),
+				OffsetDateTime.of(2012, 7, 20, 12, 20, 0, 0, ZoneOffset.UTC),
+				OffsetDateTime.of(2012, 8, 19, 13, 30, 0, 0, ZoneOffset.UTC),
+				OffsetDateTime.of(2013, 7, 19, 14, 45, 0, 0, ZoneOffset.UTC)
+		);
+	}
+
+
+}
diff --git a/testing/unittestsupport/applib/src/main/java/org/apache/isis/testing/unittestsupport/applib/dom/valuetypes/VT.java b/testing/unittestsupport/applib/src/main/java/org/apache/isis/testing/unittestsupport/applib/dom/valuetypes/VT.java
index a454635..66202d5 100644
--- a/testing/unittestsupport/applib/src/main/java/org/apache/isis/testing/unittestsupport/applib/dom/valuetypes/VT.java
+++ b/testing/unittestsupport/applib/src/main/java/org/apache/isis/testing/unittestsupport/applib/dom/valuetypes/VT.java
@@ -35,7 +35,7 @@ public final class VT {
 //    }
 //
 //    public static LocalDate ld(int yyyy, int mm, int dd) {
-//        return new LocalDate(yyyy,mm,dd);
+//        return LocalDate.of(yyyy,mm,dd);
 //    }
 //
 //    // //////////////////////////////////////