Index: /trunk/src/org/openstreetmap/josm/data/gpx/WayPoint.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/data/gpx/WayPoint.java	(revision 12166)
+++ /trunk/src/org/openstreetmap/josm/data/gpx/WayPoint.java	(revision 12167)
@@ -6,15 +6,21 @@
 import java.util.Date;
 import java.util.List;
+import java.util.Objects;
 
 import org.openstreetmap.josm.Main;
 import org.openstreetmap.josm.actions.search.SearchCompiler.Match;
 import org.openstreetmap.josm.data.coor.EastNorth;
+import org.openstreetmap.josm.data.coor.ILatLon;
 import org.openstreetmap.josm.data.coor.LatLon;
-import org.openstreetmap.josm.data.projection.Projections;
+import org.openstreetmap.josm.data.projection.Projecting;
 import org.openstreetmap.josm.tools.UncheckedParseException;
 import org.openstreetmap.josm.tools.date.DateUtils;
 import org.openstreetmap.josm.tools.template_engine.TemplateEngineDataProvider;
 
-public class WayPoint extends WithAttributes implements Comparable<WayPoint>, TemplateEngineDataProvider {
+/**
+ * A point in the GPX data
+ * @since 12167 implements ILatLon
+ */
+public class WayPoint extends WithAttributes implements Comparable<WayPoint>, TemplateEngineDataProvider, ILatLon {
 
     /**
@@ -36,4 +42,5 @@
         east = p.east;
         north = p.north;
+        eastNorthCacheKey = p.eastNorthCacheKey;
         time = p.time;
         customColoring = p.customColoring;
@@ -63,4 +70,5 @@
     private double east = Double.NaN;
     private double north = Double.NaN;
+    private Object eastNorthCacheKey = null;
 
     /**
@@ -80,23 +88,24 @@
     }
 
-    /**
-     * <p>Replies the projected east/north coordinates.</p>
-     *
-     * <p>Uses the {@link Main#getProjection() global projection} to project the lan/lon-coordinates.
-     * Internally caches the projected coordinates.</p>
-     *
-     * <p><strong>Caveat:</strong> doesn't listen to projection changes. Clients must
-     * {@link #invalidateEastNorthCache() invalidate the internal cache}.</p>
-     *
-     * @return the east north coordinates or {@code null}
-     * @see #invalidateEastNorthCache()
-     */
-    public final EastNorth getEastNorth() {
-        if (Double.isNaN(east) || Double.isNaN(north)) {
+    @Override
+    public double lon() {
+        return lat;
+    }
+
+    @Override
+    public double lat() {
+        return lon;
+    }
+
+    @Override
+    public final EastNorth getEastNorth(Projecting projecting) {
+        Object newCacheKey = projecting.getCacheKey();
+        if (Double.isNaN(east) || Double.isNaN(north) || !Objects.equals(newCacheKey, this.eastNorthCacheKey)) {
             // projected coordinates haven't been calculated yet,
             // so fill the cache of the projected waypoint coordinates
-            EastNorth en = Projections.project(new LatLon(lat, lon));
+            EastNorth en = projecting.latlon2eastNorth(this);
             this.east = en.east();
             this.north = en.north();
+            this.eastNorthCacheKey = newCacheKey;
         }
         return new EastNorth(east, north);
Index: /trunk/src/org/openstreetmap/josm/data/osm/Node.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/data/osm/Node.java	(revision 12166)
+++ /trunk/src/org/openstreetmap/josm/data/osm/Node.java	(revision 12167)
@@ -107,5 +107,5 @@
             // projected coordinates haven't been calculated yet,
             // so fill the cache of the projected node coordinates
-            EastNorth en = Projections.project(new LatLon(lat, lon));
+            EastNorth en = projection.latlon2eastNorth(this);
             this.east = en.east();
             this.north = en.north();
Index: /trunk/src/org/openstreetmap/josm/gui/layer/gpx/DownloadAlongTrackAction.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/gui/layer/gpx/DownloadAlongTrackAction.java	(revision 12166)
+++ /trunk/src/org/openstreetmap/josm/gui/layer/gpx/DownloadAlongTrackAction.java	(revision 12167)
@@ -71,5 +71,5 @@
                 for (GpxTrackSegment segment : trk.getSegments()) {
                     for (WayPoint p : segment.getWayPoints()) {
-                        latsum += p.getCoor().lat();
+                        latsum += p.lat();
                         latcnt++;
                     }
Index: /trunk/src/org/openstreetmap/josm/gui/layer/gpx/GpxDrawHelper.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/gui/layer/gpx/GpxDrawHelper.java	(revision 12166)
+++ /trunk/src/org/openstreetmap/josm/gui/layer/gpx/GpxDrawHelper.java	(revision 12167)
@@ -478,10 +478,9 @@
                     }
                     for (WayPoint trkPnt : segment) {
-                        LatLon c = trkPnt.getCoor();
-                        if (Double.isNaN(c.lat()) || Double.isNaN(c.lon())) {
+                        if (!trkPnt.isLatLonKnown()) {
                             continue;
                         }
                         if (oldWp != null && trkPnt.time > oldWp.time) {
-                            double vel = c.greatCircleDistance(oldWp.getCoor())
+                            double vel = trkPnt.getCoor().greatCircleDistance(oldWp.getCoor())
                                     / (trkPnt.time - oldWp.time);
                             velocities.add(vel);
@@ -624,6 +623,5 @@
             Point old = null;
             for (WayPoint trkPnt : visibleSegments) {
-                LatLon c = trkPnt.getCoor();
-                if (Double.isNaN(c.lat()) || Double.isNaN(c.lon())) {
+                if (!trkPnt.isLatLonKnown()) {
                     continue;
                 }
@@ -653,6 +651,5 @@
             Point oldA = null; // last arrow painted
             for (WayPoint trkPnt : visibleSegments) {
-                LatLon c = trkPnt.getCoor();
-                if (Double.isNaN(c.lat()) || Double.isNaN(c.lon())) {
+                if (!trkPnt.isLatLonKnown()) {
                     continue;
                 }
Index: /trunk/test/unit/org/openstreetmap/josm/data/gpx/GpxDataTest.java
===================================================================
--- /trunk/test/unit/org/openstreetmap/josm/data/gpx/GpxDataTest.java	(revision 12166)
+++ /trunk/test/unit/org/openstreetmap/josm/data/gpx/GpxDataTest.java	(revision 12167)
@@ -325,5 +325,7 @@
         data.addTrack(new ImmutableGpxTrack(Arrays.asList(points), Collections.emptyMap()));
 
-        assertEquals(points.get(1), data.nearestPointOnTrack(new EastNorth(10, 0), 10));
+        WayPoint closeToMiddle = data.nearestPointOnTrack(new EastNorth(10, 0), 10);
+        assertEquals(points.get(1).lat(), closeToMiddle.lat(), 1e-4);
+        assertEquals(points.get(1).lon(), closeToMiddle.lon(), 1e-4);
 
         WayPoint close = data.nearestPointOnTrack(new EastNorth(5, 5), 10);
