Index: trunk/src/org/openstreetmap/josm/actions/downloadtasks/DownloadOsmChangeTask.java
===================================================================
--- trunk/src/org/openstreetmap/josm/actions/downloadtasks/DownloadOsmChangeTask.java	(revision 17837)
+++ trunk/src/org/openstreetmap/josm/actions/downloadtasks/DownloadOsmChangeTask.java	(revision 17838)
@@ -6,5 +6,4 @@
 import java.time.Instant;
 import java.util.Arrays;
-import java.util.Date;
 import java.util.HashMap;
 import java.util.Iterator;
@@ -160,5 +159,5 @@
                 if (history != null && date != null) {
                     // Lookup for the primitive version at the specified timestamp
-                    HistoryOsmPrimitive hp = history.getByDate(Date.from(date));
+                    HistoryOsmPrimitive hp = history.getByDate(date);
                     if (hp != null) {
                         PrimitiveData data;
Index: trunk/src/org/openstreetmap/josm/data/osm/history/History.java
===================================================================
--- trunk/src/org/openstreetmap/josm/data/osm/history/History.java	(revision 17837)
+++ trunk/src/org/openstreetmap/josm/data/osm/history/History.java	(revision 17838)
@@ -3,7 +3,7 @@
 
 import java.text.MessageFormat;
+import java.time.Instant;
 import java.util.ArrayList;
 import java.util.Comparator;
-import java.util.Date;
 import java.util.List;
 import java.util.stream.Collectors;
@@ -86,6 +86,6 @@
      * @return a new partial copy of this history, from the given date
      */
-    public History from(final Date fromDate) {
-        return filter(this, primitive -> primitive.getTimestamp().compareTo(fromDate) >= 0);
+    public History from(final Instant fromDate) {
+        return filter(this, primitive -> primitive.getInstant().compareTo(fromDate) >= 0);
     }
 
@@ -95,6 +95,6 @@
      * @return a new partial copy of this history, until the given date
      */
-    public History until(final Date untilDate) {
-        return filter(this, primitive -> primitive.getTimestamp().compareTo(untilDate) <= 0);
+    public History until(final Instant untilDate) {
+        return filter(this, primitive -> primitive.getInstant().compareTo(untilDate) <= 0);
     }
 
@@ -105,5 +105,5 @@
      * @return a new partial copy of this history, between the given dates
      */
-    public History between(Date fromDate, Date untilDate) {
+    public History between(Instant fromDate, Instant untilDate) {
         return this.from(fromDate).until(untilDate);
     }
@@ -196,14 +196,14 @@
      * @return the history primitive at given <code>date</code>
      */
-    public HistoryOsmPrimitive getByDate(Date date) {
+    public HistoryOsmPrimitive getByDate(Instant date) {
         History h = sortAscending();
 
         if (h.versions.isEmpty())
             return null;
-        if (h.get(0).getTimestamp().compareTo(date) > 0)
+        if (h.get(0).getInstant().compareTo(date) > 0)
             return null;
         for (int i = 1; i < h.versions.size(); i++) {
-            if (h.get(i-1).getTimestamp().compareTo(date) <= 0
-                    && h.get(i).getTimestamp().compareTo(date) >= 0)
+            if (h.get(i-1).getInstant().compareTo(date) <= 0
+                    && h.get(i).getInstant().compareTo(date) >= 0)
                 return h.get(i);
         }
Index: trunk/src/org/openstreetmap/josm/data/osm/history/HistoryNode.java
===================================================================
--- trunk/src/org/openstreetmap/josm/data/osm/history/HistoryNode.java	(revision 17837)
+++ trunk/src/org/openstreetmap/josm/data/osm/history/HistoryNode.java	(revision 17838)
@@ -2,5 +2,5 @@
 package org.openstreetmap.josm.data.osm.history;
 
-import java.util.Date;
+import java.time.Instant;
 
 import org.openstreetmap.josm.data.coor.LatLon;
@@ -31,5 +31,5 @@
      * @throws IllegalArgumentException if preconditions are violated
      */
-    public HistoryNode(long id, long version, boolean visible, User user, long changesetId, Date timestamp, LatLon coords) {
+    public HistoryNode(long id, long version, boolean visible, User user, long changesetId, Instant timestamp, LatLon coords) {
         this(id, version, visible, user, changesetId, timestamp, coords, true);
     }
@@ -50,5 +50,5 @@
      * @since 5440
      */
-    public HistoryNode(long id, long version, boolean visible, User user, long changesetId, Date timestamp, LatLon coords,
+    public HistoryNode(long id, long version, boolean visible, User user, long changesetId, Instant timestamp, LatLon coords,
             boolean checkHistoricParams) {
         super(id, version, visible, user, changesetId, timestamp, checkHistoricParams);
Index: trunk/src/org/openstreetmap/josm/data/osm/history/HistoryOsmPrimitive.java
===================================================================
--- trunk/src/org/openstreetmap/josm/data/osm/history/HistoryOsmPrimitive.java	(revision 17837)
+++ trunk/src/org/openstreetmap/josm/data/osm/history/HistoryOsmPrimitive.java	(revision 17838)
@@ -5,4 +5,5 @@
 
 import java.text.MessageFormat;
+import java.time.Instant;
 import java.util.Collection;
 import java.util.Collections;
@@ -25,5 +26,4 @@
 import org.openstreetmap.josm.tools.CheckParameterUtil;
 import org.openstreetmap.josm.tools.Logging;
-import org.openstreetmap.josm.tools.date.DateUtils;
 
 /**
@@ -38,5 +38,5 @@
     private final long changesetId;
     private Changeset changeset;
-    private final Date timestamp;
+    private final Instant timestamp;
     private final long version;
     private Map<String, String> tags;
@@ -54,5 +54,5 @@
      * @throws IllegalArgumentException if preconditions are violated
      */
-    protected HistoryOsmPrimitive(long id, long version, boolean visible, User user, long changesetId, Date timestamp) {
+    protected HistoryOsmPrimitive(long id, long version, boolean visible, User user, long changesetId, Instant timestamp) {
         this(id, version, visible, user, changesetId, timestamp, true);
     }
@@ -73,5 +73,5 @@
      * @since 5440
      */
-    protected HistoryOsmPrimitive(long id, long version, boolean visible, User user, long changesetId, Date timestamp,
+    protected HistoryOsmPrimitive(long id, long version, boolean visible, User user, long changesetId, Instant timestamp,
             boolean checkHistoricParams) {
         ensurePositiveLong(id, "id");
@@ -87,5 +87,5 @@
         this.user = user;
         this.changesetId = changesetId;
-        this.timestamp = DateUtils.cloneDate(timestamp);
+        this.timestamp = timestamp;
         this.tags = new HashMap<>();
     }
@@ -96,5 +96,5 @@
      */
     protected HistoryOsmPrimitive(OsmPrimitive p) {
-        this(p.getId(), p.getVersion(), p.isVisible(), p.getUser(), p.getChangesetId(), Date.from(p.getInstant()));
+        this(p.getId(), p.getVersion(), p.isVisible(), p.getUser(), p.getChangesetId(), p.getInstant());
     }
 
@@ -159,7 +159,17 @@
      * Returns the timestamp.
      * @return the timestamp
-     */
+     * @deprecated Use {@link #getInstant()}
+     */
+    @Deprecated
     public Date getTimestamp() {
-        return DateUtils.cloneDate(timestamp);
+        return Date.from(timestamp);
+    }
+
+    /**
+     * Returns the timestamp.
+     * @return the timestamp
+     */
+    public Instant getInstant() {
+        return timestamp;
     }
 
@@ -364,5 +374,5 @@
             Logging.log(Logging.LEVEL_ERROR, "Cannot change visibility for "+data+':', e);
         }
-        data.setInstant(timestamp.toInstant());
+        data.setInstant(timestamp);
         data.setKeys(tags);
         data.setOsmId(id, (int) version);
Index: trunk/src/org/openstreetmap/josm/data/osm/history/HistoryRelation.java
===================================================================
--- trunk/src/org/openstreetmap/josm/data/osm/history/HistoryRelation.java	(revision 17837)
+++ trunk/src/org/openstreetmap/josm/data/osm/history/HistoryRelation.java	(revision 17838)
@@ -3,7 +3,7 @@
 
 import java.text.MessageFormat;
+import java.time.Instant;
 import java.util.ArrayList;
 import java.util.Collections;
-import java.util.Date;
 import java.util.List;
 
@@ -35,5 +35,5 @@
      * @throws IllegalArgumentException if preconditions are violated
      */
-    public HistoryRelation(long id, long version, boolean visible, User user, long changesetId, Date timestamp) {
+    public HistoryRelation(long id, long version, boolean visible, User user, long changesetId, Instant timestamp) {
         super(id, version, visible, user, changesetId, timestamp);
     }
@@ -53,5 +53,5 @@
      * @since 5440
      */
-    public HistoryRelation(long id, long version, boolean visible, User user, long changesetId, Date timestamp, boolean checkHistoricParams) {
+    public HistoryRelation(long id, long version, boolean visible, User user, long changesetId, Instant timestamp, boolean checkHistoricParams) {
         super(id, version, visible, user, changesetId, timestamp, checkHistoricParams);
     }
@@ -70,5 +70,5 @@
      * @throws IllegalArgumentException if preconditions are violated
      */
-    public HistoryRelation(long id, long version, boolean visible, User user, long changesetId, Date timestamp,
+    public HistoryRelation(long id, long version, boolean visible, User user, long changesetId, Instant timestamp,
             List<RelationMemberData> members) {
         this(id, version, visible, user, changesetId, timestamp);
Index: trunk/src/org/openstreetmap/josm/data/osm/history/HistoryWay.java
===================================================================
--- trunk/src/org/openstreetmap/josm/data/osm/history/HistoryWay.java	(revision 17837)
+++ trunk/src/org/openstreetmap/josm/data/osm/history/HistoryWay.java	(revision 17838)
@@ -4,7 +4,7 @@
 import static org.openstreetmap.josm.tools.I18n.tr;
 
+import java.time.Instant;
 import java.util.ArrayList;
 import java.util.Collections;
-import java.util.Date;
 import java.util.List;
 import java.util.Objects;
@@ -35,5 +35,5 @@
      * @throws IllegalArgumentException if preconditions are violated
      */
-    public HistoryWay(long id, long version, boolean visible, User user, long changesetId, Date timestamp) {
+    public HistoryWay(long id, long version, boolean visible, User user, long changesetId, Instant timestamp) {
         super(id, version, visible, user, changesetId, timestamp);
     }
@@ -53,5 +53,5 @@
      * @since 5440
      */
-    public HistoryWay(long id, long version, boolean visible, User user, long changesetId, Date timestamp, boolean checkHistoricParams) {
+    public HistoryWay(long id, long version, boolean visible, User user, long changesetId, Instant timestamp, boolean checkHistoricParams) {
         super(id, version, visible, user, changesetId, timestamp, checkHistoricParams);
     }
@@ -69,5 +69,5 @@
      * @throws IllegalArgumentException if preconditions are violated
      */
-    public HistoryWay(long id, long version, boolean visible, User user, long changesetId, Date timestamp, List<Long> nodeIdList) {
+    public HistoryWay(long id, long version, boolean visible, User user, long changesetId, Instant timestamp, List<Long> nodeIdList) {
         this(id, version, visible, user, changesetId, timestamp);
         CheckParameterUtil.ensureParameterNotNull(nodeIdList, "nodeIdList");
Index: trunk/src/org/openstreetmap/josm/gui/history/VersionInfoPanel.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/history/VersionInfoPanel.java	(revision 17837)
+++ trunk/src/org/openstreetmap/josm/gui/history/VersionInfoPanel.java	(revision 17838)
@@ -11,7 +11,7 @@
 import java.awt.Insets;
 import java.awt.event.ActionEvent;
-import java.text.DateFormat;
+import java.time.Instant;
+import java.time.format.FormatStyle;
 import java.util.Collections;
-import java.util.Date;
 
 import javax.swing.AbstractAction;
@@ -170,5 +170,5 @@
     }
 
-    protected String getInfoText(final Date timestamp, final long version, final boolean isLatest) {
+    protected String getInfoText(final Instant timestamp, final long version, final boolean isLatest) {
         String text;
         if (isLatest) {
@@ -181,5 +181,5 @@
             String date = "?";
             if (timestamp != null) {
-                date = DateUtils.formatDateTime(timestamp, DateFormat.SHORT, DateFormat.SHORT);
+                date = DateUtils.getDateTimeFormatter(FormatStyle.SHORT, FormatStyle.SHORT).format(timestamp);
             }
             text = tr(
@@ -226,5 +226,5 @@
         if (primitive != null) {
             Changeset cs = primitive.getChangeset();
-            update(cs, model.isLatest(primitive), primitive.getTimestamp(), primitive.getVersion(), primitive.getPrimitiveId());
+            update(cs, model.isLatest(primitive), primitive.getInstant(), primitive.getVersion(), primitive.getPrimitiveId());
         }
     }
@@ -236,6 +236,5 @@
      */
     public void update(final OsmPrimitive primitive, final boolean isLatest) {
-        Date timestamp = Date.from(primitive.getInstant());
-        update(Changeset.fromPrimitive(primitive), isLatest, timestamp, primitive.getVersion(), primitive.getPrimitiveId());
+        update(Changeset.fromPrimitive(primitive), isLatest, primitive.getInstant(), primitive.getVersion(), primitive.getPrimitiveId());
     }
 
@@ -249,5 +248,5 @@
      * @since 14432
      */
-    public void update(final Changeset cs, final boolean isLatest, final Date timestamp, final long version, final PrimitiveId id) {
+    public void update(final Changeset cs, final boolean isLatest, final Instant timestamp, final long version, final PrimitiveId id) {
         lblInfo.setText(getInfoText(timestamp, version, isLatest));
         primitiveId = id;
Index: trunk/src/org/openstreetmap/josm/gui/history/VersionTableModel.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/history/VersionTableModel.java	(revision 17837)
+++ trunk/src/org/openstreetmap/josm/gui/history/VersionTableModel.java	(revision 17838)
@@ -2,5 +2,5 @@
 package org.openstreetmap.josm.gui.history;
 
-import java.text.DateFormat;
+import java.time.format.FormatStyle;
 
 import javax.swing.table.AbstractTableModel;
@@ -53,6 +53,6 @@
         case VersionTableColumnModel.COL_DATE:
             HistoryOsmPrimitive p3 = model.getPrimitive(row);
-            if (p3 != null && p3.getTimestamp() != null)
-                return DateUtils.formatDateTime(p3.getTimestamp(), DateFormat.SHORT, DateFormat.SHORT);
+            if (p3 != null && p3.getInstant() != null)
+                return DateUtils.getDateTimeFormatter(FormatStyle.SHORT, FormatStyle.SHORT).format(p3.getInstant());
             return null;
         case VersionTableColumnModel.COL_USER:
Index: trunk/src/org/openstreetmap/josm/io/AbstractParser.java
===================================================================
--- trunk/src/org/openstreetmap/josm/io/AbstractParser.java	(revision 17837)
+++ trunk/src/org/openstreetmap/josm/io/AbstractParser.java	(revision 17838)
@@ -4,5 +4,5 @@
 import static org.openstreetmap.josm.tools.I18n.tr;
 
-import java.util.Date;
+import java.time.Instant;
 
 import org.openstreetmap.josm.data.coor.LatLon;
@@ -132,5 +132,5 @@
 
         String v = getMandatoryAttributeString(atts, "timestamp");
-        Date timestamp = DateUtils.fromString(v);
+        Instant timestamp = DateUtils.parseInstant(v);
         HistoryOsmPrimitive primitive = null;
         if (type == OsmPrimitiveType.NODE) {
