Index: plugins/editgpx/src/org/openstreetmap/josm/plugins/editgpx/data/EditGpxWayPoint.java
===================================================================
--- plugins/editgpx/src/org/openstreetmap/josm/plugins/editgpx/data/EditGpxWayPoint.java	(revision 28681)
+++ plugins/editgpx/src/org/openstreetmap/josm/plugins/editgpx/data/EditGpxWayPoint.java	(working copy)
@@ -6,7 +6,7 @@
 import org.openstreetmap.josm.data.coor.CachedLatLon;
 import org.openstreetmap.josm.data.gpx.WayPoint;
 
-public class EditGpxWayPoint {
+public class EditGpxWayPoint implements Comparable<EditGpxWayPoint> {
     private final double time;
     private final CachedLatLon coor;
     private boolean deleted;
@@ -33,7 +33,18 @@
         return deleted;
     }
 
+    /**
+     * returns this waypoint's time in seconds since Epoch
+     */
+    public double getTime() {
+        return time;
+    }
+
     public CachedLatLon getCoor() {
         return coor;
     }
+
+    public int compareTo(EditGpxWayPoint o) {
+        return Double.compare(getTime(), o.getTime());
+    }
 }
Index: plugins/editgpx/src/org/openstreetmap/josm/plugins/editgpx/data/EditGpxTrack.java
===================================================================
--- plugins/editgpx/src/org/openstreetmap/josm/plugins/editgpx/data/EditGpxTrack.java	(revision 28681)
+++ plugins/editgpx/src/org/openstreetmap/josm/plugins/editgpx/data/EditGpxTrack.java	(working copy)
@@ -1,10 +1,15 @@
 package org.openstreetmap.josm.plugins.editgpx.data;
 
+import java.text.DateFormat;
+import java.text.SimpleDateFormat;
 import java.util.ArrayList;
 import java.util.Collection;
+import java.util.Date;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
+import java.util.NoSuchElementException;
+import java.util.TimeZone;
 
 import org.openstreetmap.josm.data.gpx.GpxTrack;
 import org.openstreetmap.josm.data.gpx.GpxTrackSegment;
@@ -31,10 +36,15 @@
         return attributes;
     }
 
-    public GpxTrack createGpxTrack(boolean anonTime) {
+    public GpxTrack createGpxTrack(boolean anonTime, double minTime) {
 
         Collection<Collection<WayPoint>> wayPoints = new ArrayList<Collection<WayPoint>>();
 
+        final DateFormat iso8601 =
+            new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'");
+        final TimeZone utc = TimeZone.getTimeZone("UTC");
+        iso8601.setTimeZone(utc);
+
         for (EditGpxTrackSegment segment: segments) {
             if (!segment.isDeleted()) {
                 List<WayPoint> points = segment.getNonDeletedWaypoints();
@@ -42,8 +52,11 @@
                     if (anonTime) {
                         // convert to anonymous time
                         for (WayPoint w : points) {
-                            w.attr.put("time", "1970-01-01T00:00:00.000Z");
+                            double t = w.time - minTime;
+                            w.attr.put("time", iso8601.format(
+                                    new Date((long)(t * 1000))));
                             w.setTime();
+                            assert w.time == t;
                             if (w.attr.containsKey("name")) {
                                 w.attr.put("name", "anon"); //time information can also be in "name" field. so delete time information
                             }
@@ -69,4 +82,32 @@
     public boolean isDeleted() {
         return isDeleted;
     }
+
+    /**
+     * time of the oldest waypoint in the set of non-deleted waypoints
+     * in this track (in seconds since Epoch)
+     */
+    public double minNonDeletedTime() {
+        boolean foundOne = false;
+        double minTime = 0.0;
+
+        for (EditGpxTrackSegment segment: segments) {
+            if (!segment.isDeleted()) {
+                try {
+                    double t = segment.minNonDeletedTime();
+                    if ((!foundOne) || (t < minTime)) {
+                        minTime = t;
+                    }
+                    foundOne = true;
+                } catch (NoSuchElementException e) {
+                    continue;
+                }
+            }
+        }
+
+        if (!foundOne) {
+            throw new NoSuchElementException();
+        }
+        return minTime;
+    }
 }
Index: plugins/editgpx/src/org/openstreetmap/josm/plugins/editgpx/data/EditGpxTrackSegment.java
===================================================================
--- plugins/editgpx/src/org/openstreetmap/josm/plugins/editgpx/data/EditGpxTrackSegment.java	(revision 28681)
+++ plugins/editgpx/src/org/openstreetmap/josm/plugins/editgpx/data/EditGpxTrackSegment.java	(working copy)
@@ -1,6 +1,7 @@
 package org.openstreetmap.josm.plugins.editgpx.data;
 
 import java.util.ArrayList;
+import java.util.Collections;
 import java.util.List;
 
 import org.openstreetmap.josm.data.gpx.GpxTrackSegment;
@@ -41,4 +42,12 @@
         return deleted;
     }
 
+    /**
+     * time of the oldest waypoint in the set of non-deleted waypoints
+     * in this segment (in seconds since Epoch)
+     */
+    public double minNonDeletedTime() {
+        return Collections.min(getNonDeletedWaypoints()).time;
+    }
+
 }
Index: plugins/editgpx/src/org/openstreetmap/josm/plugins/editgpx/data/EditGpxData.java
===================================================================
--- plugins/editgpx/src/org/openstreetmap/josm/plugins/editgpx/data/EditGpxData.java	(revision 28681)
+++ plugins/editgpx/src/org/openstreetmap/josm/plugins/editgpx/data/EditGpxData.java	(working copy)
@@ -2,6 +2,7 @@
 
 import java.util.ArrayList;
 import java.util.List;
+import java.util.NoSuchElementException;
 
 import org.openstreetmap.josm.data.gpx.GpxData;
 import org.openstreetmap.josm.data.gpx.GpxRoute;
@@ -43,9 +44,18 @@
     public GpxData createGpxData(boolean anonTime) {
         GpxData result = new GpxData();
 
+        double minTime = 0.0;
+        if (anonTime) {
+            try {
+                minTime = minNonDeletedTime();
+            } catch (NoSuchElementException e) {
+                // minTime won't be used, so ignore the exception
+            }
+        }
+
         for (EditGpxTrack track: tracks) {
             if (!track.isDeleted()) {
-                GpxTrack newTrack = track.createGpxTrack(anonTime);
+                GpxTrack newTrack = track.createGpxTrack(anonTime, minTime);
                 if (!newTrack.getSegments().isEmpty()) {
                     result.tracks.add(newTrack);
                 }
@@ -57,4 +67,32 @@
         return result;
     }
 
+    /**
+     * time of the oldest waypoint in the set of non-deleted waypoints
+     * in this data (in seconds since Epoch)
+     */
+    public double minNonDeletedTime() {
+        boolean foundOne = false;
+        double minTime = 0.0;
+
+        for (EditGpxTrack track: tracks) {
+            if (!track.isDeleted()) {
+                try {
+                    double t = track.minNonDeletedTime();
+                    if ((!foundOne) || (t < minTime)) {
+                        minTime = t;
+                    }
+                    foundOne = true;
+                } catch (NoSuchElementException e) {
+                    continue;
+                }
+            }
+        }
+
+        if (!foundOne) {
+            throw new NoSuchElementException();
+        }
+        return minTime;
+    }
+
 }
