Index: trunk/test/unit/org/openstreetmap/josm/gui/layer/OsmDataLayerTest.java
===================================================================
--- trunk/test/unit/org/openstreetmap/josm/gui/layer/OsmDataLayerTest.java	(revision 14074)
+++ trunk/test/unit/org/openstreetmap/josm/gui/layer/OsmDataLayerTest.java	(revision 14075)
@@ -7,5 +7,10 @@
 import static org.junit.Assert.assertTrue;
 
+import java.io.ByteArrayInputStream;
 import java.io.File;
+import java.nio.charset.StandardCharsets;
+import java.text.DateFormat;
+import java.util.Collection;
+import java.util.Iterator;
 
 import org.junit.Before;
@@ -16,4 +21,9 @@
 import org.openstreetmap.josm.data.Bounds;
 import org.openstreetmap.josm.data.coor.LatLon;
+import org.openstreetmap.josm.data.gpx.GpxConstants;
+import org.openstreetmap.josm.data.gpx.GpxData;
+import org.openstreetmap.josm.data.gpx.GpxTrack;
+import org.openstreetmap.josm.data.gpx.GpxTrackSegment;
+import org.openstreetmap.josm.data.gpx.WayPoint;
 import org.openstreetmap.josm.data.osm.DataSet;
 import org.openstreetmap.josm.data.osm.Node;
@@ -22,5 +32,8 @@
 import org.openstreetmap.josm.data.osm.Way;
 import org.openstreetmap.josm.gui.MainApplication;
+import org.openstreetmap.josm.io.IllegalDataException;
+import org.openstreetmap.josm.io.OsmReader;
 import org.openstreetmap.josm.testutils.JOSMTestRules;
+import org.openstreetmap.josm.tools.date.DateUtils;
 
 import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
@@ -190,9 +203,47 @@
     /**
      * Unit test of {@link OsmDataLayer#toGpxData}.
-     */
-    @Test
-    public void testToGpxData() {
-        fillDataSet(ds);
-        assertNotNull(layer.toGpxData());
+     * @throws IllegalDataException never
+     */
+    @Test
+    public void testToGpxData() throws IllegalDataException {
+        ds.mergeFrom(OsmReader.parseDataSet(new ByteArrayInputStream((
+                "<?xml version='1.0' encoding='UTF-8'?>\n" +
+                "<osm version='0.6' upload='false' generator='JOSM'>\n" +
+                "  <node id='-546306' timestamp='2018-08-01T10:00:00Z' lat='47.0' lon='9.0'>\n" +
+                "    <tag k='ele' v='123' />\n" +
+                "    <tag k='time' v='2018-08-01T10:00:00Z' />\n" +
+                "  </node>\n" +
+                "  <node id='-546307' timestamp='2018-08-01T10:01:00Z' lat='47.1' lon='9.1'>\n" +
+                "    <tag k='ele' v='456' />\n" +
+                "    <tag k='time' v='2018-08-01T10:01:00Z' />\n" +
+                "  </node>\n" +
+                "  <way id='-546308'>\n" +
+                "    <nd ref='-546306' />\n" +
+                "    <nd ref='-546307' />\n" +
+                "  </way>\r\n" +
+                "</osm>").getBytes(StandardCharsets.UTF_8)), null));
+        GpxData gpx = layer.toGpxData();
+        assertNotNull(gpx);
+        // Check metadata
+        assertEquals(new Bounds(47.0, 9.0, 47.1, 9.1), gpx.recalculateBounds());
+        // Check there is no waypoint
+        assertTrue(gpx.getWaypoints().isEmpty());
+        // Check that track is correct
+        assertEquals(1, gpx.getTrackCount());
+        GpxTrack track = gpx.getTracks().iterator().next();
+        Collection<GpxTrackSegment> segments = track.getSegments();
+        assertEquals(1, segments.size());
+        Collection<WayPoint> trackpoints = segments.iterator().next().getWayPoints();
+        assertEquals(2, trackpoints.size());
+        Iterator<WayPoint> it = trackpoints.iterator();
+        DateFormat gpxFormat = DateUtils.getGpxFormat();
+        WayPoint p1 = it.next();
+        assertEquals(new LatLon(47.0, 9.0), p1.getCoor());
+        assertEquals("123", p1.get(GpxConstants.PT_ELE));
+        assertEquals("2018-08-01T10:00:00.000Z", gpxFormat.format(p1.get(GpxConstants.PT_TIME)));
+        WayPoint p2 = it.next();
+        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)));
     }
 
Index: trunk/test/unit/org/openstreetmap/josm/io/GpxWriterTest.java
===================================================================
--- trunk/test/unit/org/openstreetmap/josm/io/GpxWriterTest.java	(revision 14075)
+++ trunk/test/unit/org/openstreetmap/josm/io/GpxWriterTest.java	(revision 14075)
@@ -0,0 +1,52 @@
+// License: GPL. For details, see LICENSE file.
+package org.openstreetmap.josm.io;
+
+import static org.junit.Assert.assertEquals;
+
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.nio.charset.StandardCharsets;
+import java.time.LocalDate;
+import java.time.Month;
+import java.time.ZoneOffset;
+import java.util.Date;
+
+import org.junit.Test;
+import org.openstreetmap.josm.data.coor.LatLon;
+import org.openstreetmap.josm.data.gpx.GpxConstants;
+import org.openstreetmap.josm.data.gpx.GpxData;
+import org.openstreetmap.josm.data.gpx.WayPoint;
+
+/**
+ * Tests the {@link GpxWriter}.
+ */
+public class GpxWriterTest {
+
+    /**
+     * Non-regression test for ticket <a href="https://josm.openstreetmap.de/ticket/16550">#16550</a>
+     * @throws IOException never
+     */
+    @Test
+    public void testTicket16550() throws IOException {
+        GpxData gpx = new GpxData();
+        WayPoint waypoint = new WayPoint(LatLon.ZERO);
+        waypoint.put(GpxConstants.PT_TIME, Date.from(LocalDate.of(2018, Month.AUGUST, 2).atStartOfDay(ZoneOffset.UTC).toInstant()));
+        gpx.addWaypoint(waypoint);
+        ByteArrayOutputStream baos = new ByteArrayOutputStream();
+        try (GpxWriter writer = new GpxWriter(baos)) {
+            writer.write(gpx);
+        }
+        // Checks that time stored as date is correctly written into XML timestamp
+        assertEquals(String.format("<?xml version='1.0' encoding='UTF-8'?>%n" +
+                "<gpx version=\"1.1\" creator=\"JOSM GPX export\" xmlns=\"http://www.topografix.com/GPX/1/1\"%n" +
+                "    xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"%n" +
+                "    xsi:schemaLocation=\"http://www.topografix.com/GPX/1/1 http://www.topografix.com/GPX/1/1/gpx.xsd\">%n" +
+                "  <metadata>%n" +
+                "    <bounds minlat=\"0.0\" minlon=\"0.0\" maxlat=\"0.0\" maxlon=\"0.0\"/>%n" +
+                "  </metadata>%n" +
+                "  <wpt lat=\"0.0\" lon=\"0.0\">%n" +
+                "    <time>2018-08-02T02:00:00.000Z</time>%n" +
+                "  </wpt>%n" +
+                "</gpx>"), baos.toString(StandardCharsets.UTF_8.name()));
+    }
+}
