Index: src/org/openstreetmap/josm/data/gpx/WayPoint.java
===================================================================
--- src/org/openstreetmap/josm/data/gpx/WayPoint.java	(revision 14445)
+++ src/org/openstreetmap/josm/data/gpx/WayPoint.java	(working copy)
@@ -178,6 +178,8 @@
                 final Date date = (Date) obj;
                 time = date.getTime() / 1000.;
                 return date;
+            } else if (obj == null) {
+                Logging.info("Waypoint {0} value unset", PT_TIME);
             } else {
                 Logging.warn("Unsupported waypoint {0} value: {1}", PT_TIME, obj);
                 time = 0;
Index: src/org/openstreetmap/josm/gui/layer/gpx/ConvertFromGpxLayerAction.java
===================================================================
--- src/org/openstreetmap/josm/gui/layer/gpx/ConvertFromGpxLayerAction.java	(revision 14445)
+++ src/org/openstreetmap/josm/gui/layer/gpx/ConvertFromGpxLayerAction.java	(working copy)
@@ -33,8 +33,6 @@
 import org.openstreetmap.josm.gui.layer.OsmDataLayer;
 import org.openstreetmap.josm.spi.preferences.Config;
 import org.openstreetmap.josm.tools.GBC;
-import org.openstreetmap.josm.tools.Logging;
-import org.openstreetmap.josm.tools.UncheckedParseException;
 import org.openstreetmap.josm.tools.date.DateUtils;
 
 /**
@@ -80,14 +78,6 @@
                                 // only convert when required
                                 n.put(key, str);
                             }
-                            if (GpxConstants.PT_TIME.equals(key)) {
-                                // timestamps should always be converted
-                                try {
-                                    n.setTimestamp(DateUtils.fromString(str));
-                                } catch (UncheckedParseException e) {
-                                    Logging.log(Logging.LEVEL_WARN, e);
-                                }
-                            }
                         } else if (obj instanceof Date && GpxConstants.PT_TIME.equals(key)) {
                             // timestamps should always be converted
                             Date date = (Date) obj;
Index: src/org/openstreetmap/josm/gui/layer/markerlayer/Marker.java
===================================================================
--- src/org/openstreetmap/josm/gui/layer/markerlayer/Marker.java	(revision 14445)
+++ src/org/openstreetmap/josm/gui/layer/markerlayer/Marker.java	(working copy)
@@ -12,7 +12,6 @@
 import java.text.DateFormat;
 import java.util.ArrayList;
 import java.util.Collection;
-import java.util.Date;
 import java.util.HashMap;
 import java.util.LinkedList;
 import java.util.List;
@@ -259,7 +258,7 @@
      */
     public WayPoint convertToWayPoint() {
         WayPoint wpt = new WayPoint(getCoor());
-        wpt.put(GpxConstants.PT_TIME, timeFormatter.format(new Date(Math.round(time * 1000))));
+        wpt.setTime((long) (time*1000));
         if (text != null) {
             wpt.addExtension("text", text);
         } else if (dataProvider != null) {
Index: src/org/openstreetmap/josm/io/GpxReader.java
===================================================================
--- src/org/openstreetmap/josm/io/GpxReader.java	(revision 14445)
+++ src/org/openstreetmap/josm/io/GpxReader.java	(working copy)
@@ -26,7 +26,9 @@
 import org.openstreetmap.josm.data.gpx.ImmutableGpxTrack;
 import org.openstreetmap.josm.data.gpx.WayPoint;
 import org.openstreetmap.josm.tools.Logging;
+import org.openstreetmap.josm.tools.UncheckedParseException;
 import org.openstreetmap.josm.tools.XmlUtils;
+import org.openstreetmap.josm.tools.date.DateUtils;
 import org.xml.sax.Attributes;
 import org.xml.sax.InputSource;
 import org.xml.sax.SAXException;
@@ -440,11 +442,16 @@
                         currentWayPoint.put(localName, 0f);
                     }
                     break;
-                case "time":
+                case GpxConstants.PT_TIME:
+                    try {
+                        currentWayPoint.setTime(DateUtils.fromString(accumulator.toString()));
+                    } catch (UncheckedParseException e) {
+                        Logging.error(e);
+                    }
+                    break;
                 case "cmt":
                 case "desc":
                     currentWayPoint.put(localName, accumulator.toString());
-                    currentWayPoint.setTimeFromAttribute();
                     break;
                 case "rtept":
                     currentState = states.pop();
Index: test/unit/org/openstreetmap/josm/gui/layer/OsmDataLayerTest.java
===================================================================
--- test/unit/org/openstreetmap/josm/gui/layer/OsmDataLayerTest.java	(revision 14445)
+++ test/unit/org/openstreetmap/josm/gui/layer/OsmDataLayerTest.java	(working copy)
@@ -220,9 +220,13 @@
                 "    <tag k='ele' v='456' />\n" +
                 "    <tag k='time' v='2018-08-01T10:01:00Z' />\n" +
                 "  </node>\n" +
-                "  <way id='-546308'>\n" +
+                "  <node id='-546308' timestamp='2018-08-01T10:02:00Z' lat='47.05' lon='9.05'>\n" +
+                "    <tag k='ele' v='789' />\n" +
+                "  </node>\n" +
+                "  <way id='-546309'>\n" +
                 "    <nd ref='-546306' />\n" +
                 "    <nd ref='-546307' />\n" +
+                "    <nd ref='-546308' />\n" +
                 "  </way>\r\n" +
                 "</osm>").getBytes(StandardCharsets.UTF_8)), null));
         GpxData gpx = layer.toGpxData();
@@ -237,7 +241,7 @@
         Collection<GpxTrackSegment> segments = track.getSegments();
         assertEquals(1, segments.size());
         Collection<WayPoint> trackpoints = segments.iterator().next().getWayPoints();
-        assertEquals(2, trackpoints.size());
+        assertEquals(3, trackpoints.size());
         Iterator<WayPoint> it = trackpoints.iterator();
         DateFormat gpxFormat = DateUtils.getGpxFormat();
         WayPoint p1 = it.next();
@@ -248,6 +252,10 @@
         assertEquals(new LatLon(47.1, 9.1), p2.getCoor());
         assertEquals("456", p2.get(GpxConstants.PT_ELE));
         assertEquals("2018-08-01T10:01:00.000Z", gpxFormat.format(p2.get(GpxConstants.PT_TIME)));
+        WayPoint p3 = it.next();
+        assertEquals(new LatLon(47.05, 9.05), p3.getCoor());
+        assertEquals("789", p3.get(GpxConstants.PT_ELE));
+        assertEquals("2018-08-01T10:02:00.000Z", gpxFormat.format(p3.get(GpxConstants.PT_TIME)));
     }
 
     /**
Index: test/unit/org/openstreetmap/josm/io/nmea/NmeaReaderTest.java
===================================================================
--- test/unit/org/openstreetmap/josm/io/nmea/NmeaReaderTest.java	(revision 14445)
+++ test/unit/org/openstreetmap/josm/io/nmea/NmeaReaderTest.java	(working copy)
@@ -66,10 +66,10 @@
         assertEquals(0, in.getParserMalformed());
 
         final List<WayPoint> wayPoints = new ArrayList<>(in.data.tracks.iterator().next().getSegments().iterator().next().getWayPoints());
-        assertEquals("2016-01-25T05:05:09.2Z", wayPoints.get(0).get(GpxConstants.PT_TIME));
-        assertEquals("2016-01-25T05:05:09.4Z", wayPoints.get(1).get(GpxConstants.PT_TIME));
-        assertEquals("2016-01-25T05:05:09.6Z", wayPoints.get(2).get(GpxConstants.PT_TIME));
-        assertEquals(wayPoints.get(0).getTime(), DateUtils.fromString(wayPoints.get(0).get(GpxConstants.PT_TIME).toString()));
+        assertEquals(DateUtils.fromString("2016-01-25T05:05:09.200Z"), wayPoints.get(0).get(GpxConstants.PT_TIME));
+        assertEquals(DateUtils.fromString("2016-01-25T05:05:09.400Z"), wayPoints.get(1).get(GpxConstants.PT_TIME));
+        assertEquals(DateUtils.fromString("2016-01-25T05:05:09.600Z"), wayPoints.get(2).get(GpxConstants.PT_TIME));
+        assertEquals(wayPoints.get(0).getTime(), wayPoints.get(0).get(GpxConstants.PT_TIME));
 
         assertEquals("2016-01-25T05:05:09.200Z", iso8601.format(wayPoints.get(0).getTime()));
         assertEquals("2016-01-25T05:05:09.400Z", iso8601.format(wayPoints.get(1).getTime()));
