Index: src/org/openstreetmap/josm/actions/downloadtasks/DownloadGpsTask.java
===================================================================
--- src/org/openstreetmap/josm/actions/downloadtasks/DownloadGpsTask.java	(revision 1418)
+++ src/org/openstreetmap/josm/actions/downloadtasks/DownloadGpsTask.java	(working copy)
@@ -38,6 +38,8 @@
             if (rawData == null)
                 return;
             rawData.recalculateBounds();
+            if(Main.pref.getBoolean("download.gps.fixDirection", false))
+                rawData.reverse();
             String name = tr("Downloaded GPX Data");
             GpxLayer layer = new GpxLayer(rawData, name);
             Layer x = findMergeLayer();
Index: src/org/openstreetmap/josm/data/gpx/GpxData.java
===================================================================
--- src/org/openstreetmap/josm/data/gpx/GpxData.java	(revision 1418)
+++ src/org/openstreetmap/josm/data/gpx/GpxData.java	(working copy)
@@ -4,7 +4,9 @@
 
 import java.io.File;
 import java.util.Collection;
+import java.util.Collections;
 import java.util.LinkedList;
+import java.util.List;
 import java.util.Map;
 
 import org.openstreetmap.josm.data.Bounds;
@@ -26,6 +28,19 @@
     public Collection<WayPoint> waypoints = new LinkedList<WayPoint>();
 
     public Bounds bounds;
+    
+    public void reverse() {
+        for(GpxTrack x : tracks) {
+           for(Collection<WayPoint> y : x.trackSegs)
+               Collections.reverse((List<WayPoint>) y);
+        }
+        
+        for(GpxRoute x : routes) {
+            Collections.reverse((List<WayPoint>) x.routePoints);
+        }
+        
+        Collections.reverse((List<WayPoint>) waypoints);
+    }
 
     public void mergeFrom(GpxData other) {
         if (storageFile == null && other.storageFile != null) {
