Index: trunk/src/org/openstreetmap/josm/data/gpx/WayPoint.java
===================================================================
--- trunk/src/org/openstreetmap/josm/data/gpx/WayPoint.java	(revision 14052)
+++ trunk/src/org/openstreetmap/josm/data/gpx/WayPoint.java	(revision 14055)
@@ -162,5 +162,6 @@
         if (attr.containsKey(PT_TIME)) {
             try {
-                final Date time = DateUtils.fromString(get(PT_TIME).toString());
+                final Object obj = get(PT_TIME);
+                final Date time = obj instanceof Date ? (Date) obj : DateUtils.fromString(obj.toString());
                 this.time = time.getTime() / 1000.;
                 return time;
Index: trunk/src/org/openstreetmap/josm/gui/layer/OsmDataLayer.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/layer/OsmDataLayer.java	(revision 14052)
+++ trunk/src/org/openstreetmap/josm/gui/layer/OsmDataLayer.java	(revision 14055)
@@ -773,7 +773,11 @@
 
         if (time > 0) {
+            wpt.put(GpxConstants.PT_TIME, DateUtils.fromTimestamp(time));
             wpt.setTime(time);
+        } else if (n.hasKey(GpxConstants.PT_TIME)) {
+            wpt.put(GpxConstants.PT_TIME, DateUtils.fromString(n.get(GpxConstants.PT_TIME)));
+            wpt.setTime();
         } else if (!n.isTimestampEmpty()) {
-            wpt.put("time", DateUtils.fromTimestamp(n.getRawTimestamp()));
+            wpt.put(GpxConstants.PT_TIME, DateUtils.fromTimestamp(n.getRawTimestamp()));
             wpt.setTime();
         }
Index: trunk/src/org/openstreetmap/josm/gui/layer/gpx/ConvertToDataLayerAction.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/layer/gpx/ConvertToDataLayerAction.java	(revision 14052)
+++ trunk/src/org/openstreetmap/josm/gui/layer/gpx/ConvertToDataLayerAction.java	(revision 14055)
@@ -8,9 +8,12 @@
 import java.awt.event.ActionEvent;
 import java.io.File;
+import java.text.DateFormat;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Collection;
+import java.util.Date;
 import java.util.Iterator;
 import java.util.List;
+import java.util.Map.Entry;
 import java.util.Optional;
 
@@ -67,4 +70,6 @@
     public static class FromGpxLayer extends ConvertToDataLayerAction<GpxLayer> {
 
+        private final DateFormat timeFormatter = DateUtils.getGpxFormat();
+
         /**
          * Creates a new {@code FromGpxLayer}.
@@ -83,15 +88,24 @@
                     for (WayPoint p : segment.getWayPoints()) {
                         Node n = new Node(p.getCoor());
-                        String timestr = p.getString(GpxConstants.PT_TIME);
-                        if (timestr != null) {
-                            try {
-                                n.setTimestamp(DateUtils.fromString(timestr));
-                            } catch (UncheckedParseException e) {
-                                Logging.log(Logging.LEVEL_WARN, e);
+                        for (Entry<String, Object> entry : p.attr.entrySet()) {
+                            String key = entry.getKey();
+                            String str = p.getString(key);
+                            if (str != null) {
+                                n.put(key, str);
+                                if (GpxConstants.PT_TIME.equals(key)) {
+                                    try {
+                                        n.setTimestamp(DateUtils.fromString(str));
+                                    } catch (UncheckedParseException e) {
+                                        Logging.log(Logging.LEVEL_WARN, e);
+                                    }
+                                }
+                            } else {
+                                Object obj = p.get(key);
+                                if (obj instanceof Date && GpxConstants.PT_TIME.equals(key)) {
+                                    Date date = (Date) obj;
+                                    n.put(key, timeFormatter.format(date));
+                                    n.setTimestamp(date);
+                                }
                             }
-                        }
-                        String elestr = p.getString(GpxConstants.PT_ELE);
-                        if (elestr != null) {
-                            n.put("ele", elestr);
                         }
                         ds.addPrimitive(n);
Index: trunk/src/org/openstreetmap/josm/gui/layer/markerlayer/Marker.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/layer/markerlayer/Marker.java	(revision 14052)
+++ trunk/src/org/openstreetmap/josm/gui/layer/markerlayer/Marker.java	(revision 14055)
@@ -11,5 +11,4 @@
 import java.io.File;
 import java.text.DateFormat;
-import java.text.SimpleDateFormat;
 import java.util.ArrayList;
 import java.util.Collection;
@@ -35,4 +34,5 @@
 import org.openstreetmap.josm.tools.ImageProvider;
 import org.openstreetmap.josm.tools.Logging;
+import org.openstreetmap.josm.tools.date.DateUtils;
 import org.openstreetmap.josm.tools.template_engine.ParseError;
 import org.openstreetmap.josm.tools.template_engine.TemplateEngineDataProvider;
@@ -209,5 +209,5 @@
     public static final String LABEL_PATTERN_DESC = "{desc}";
 
-    private final DateFormat timeFormatter = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'");
+    private final DateFormat timeFormatter = DateUtils.getGpxFormat();
     private final TemplateEngineDataProvider dataProvider;
     private final String text;
@@ -262,5 +262,5 @@
     public WayPoint convertToWayPoint() {
         WayPoint wpt = new WayPoint(getCoor());
-        wpt.put("time", timeFormatter.format(new Date(Math.round(time * 1000))));
+        wpt.put(GpxConstants.PT_TIME, timeFormatter.format(new Date(Math.round(time * 1000))));
         if (text != null) {
             wpt.addExtension("text", text);
Index: trunk/src/org/openstreetmap/josm/tools/date/DateUtils.java
===================================================================
--- trunk/src/org/openstreetmap/josm/tools/date/DateUtils.java	(revision 14052)
+++ trunk/src/org/openstreetmap/josm/tools/date/DateUtils.java	(revision 14055)
@@ -148,8 +148,18 @@
      * @param timestamp number of seconds since the epoch
      * @return The formatted date
-     */
-    public static synchronized String fromTimestamp(int timestamp) {
+     * @since 14055
+     */
+    public static synchronized String fromTimestamp(long timestamp) {
         final ZonedDateTime temporal = Instant.ofEpochMilli(TimeUnit.SECONDS.toMillis(timestamp)).atZone(ZoneOffset.UTC);
         return DateTimeFormatter.ISO_OFFSET_DATE_TIME.format(temporal);
+    }
+
+    /**
+     * Formats a date to the XML UTC format regardless of current locale.
+     * @param timestamp number of seconds since the epoch
+     * @return The formatted date
+     */
+    public static synchronized String fromTimestamp(int timestamp) {
+        return fromTimestamp((long) timestamp);
     }
 
@@ -248,4 +258,13 @@
 
     /**
+     * Returns the date format used for GPX waypoints.
+     * @return the date format used for GPX waypoints
+     * @since 14055
+     */
+    public static DateFormat getGpxFormat() {
+        return new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'");
+    }
+
+    /**
      * Formats a date to be displayed to current user, based on user preferences.
      * @param date The date to display. Must not be {@code null}
