Index: applications/editors/josm/plugins/CommandLine/src/org/openstreetmap/josm/plugins/commandline/LengthAction.java
===================================================================
--- applications/editors/josm/plugins/CommandLine/src/org/openstreetmap/josm/plugins/commandline/LengthAction.java	(revision 35975)
+++ applications/editors/josm/plugins/CommandLine/src/org/openstreetmap/josm/plugins/commandline/LengthAction.java	(revision 35976)
@@ -137,5 +137,5 @@
         mousePos = e.getPoint();
         if (nearestNode != null) {
-            drawStartPos = MainApplication.getMap().mapView.getPoint(nearestNode.getCoor());
+            drawStartPos = MainApplication.getMap().mapView.getPoint(nearestNode);
         } else {
             drawStartPos = mousePos;
@@ -186,5 +186,5 @@
         MapFrame map = MainApplication.getMap();
         if (nearestNode != null)
-            drawEndPos = map.mapView.getPoint(nearestNode.getCoor());
+            drawEndPos = map.mapView.getPoint(nearestNode);
         else
             drawEndPos = mousePos;
Index: applications/editors/josm/plugins/CommandLine/src/org/openstreetmap/josm/plugins/commandline/PointAction.java
===================================================================
--- applications/editors/josm/plugins/CommandLine/src/org/openstreetmap/josm/plugins/commandline/PointAction.java	(revision 35975)
+++ applications/editors/josm/plugins/CommandLine/src/org/openstreetmap/josm/plugins/commandline/PointAction.java	(revision 35976)
@@ -76,5 +76,5 @@
         if (e.getButton() == MouseEvent.BUTTON1) {
             if (isCtrlDown) {
-                if (pointList.size() > 0) {
+                if (!pointList.isEmpty()) {
                     pointList.remove(pointList.size() - 1);
                     updateTextEdit();
@@ -88,6 +88,5 @@
                     return;
                 }
-                LatLon coor = node.getCoor();
-                String point = String.valueOf(coor.getX()) + "," + String.valueOf(coor.getY());
+                String point = node.lon() + "," + node.lat();
                 int maxInstances = parentPlugin.currentCommand.parameters.get(parentPlugin.currentCommand.currentParameterNum).maxInstances;
                 if (maxInstances == 1) {
Index: applications/editors/josm/plugins/Create_grid_of_ways/src/CreateGridOfWaysPlugin/CreateGridOfWaysAction.java
===================================================================
--- applications/editors/josm/plugins/Create_grid_of_ways/src/CreateGridOfWaysPlugin/CreateGridOfWaysAction.java	(revision 35975)
+++ applications/editors/josm/plugins/Create_grid_of_ways/src/CreateGridOfWaysPlugin/CreateGridOfWaysAction.java	(revision 35976)
@@ -16,4 +16,5 @@
 import org.openstreetmap.josm.command.SequenceCommand;
 import org.openstreetmap.josm.data.UndoRedoHandler;
+import org.openstreetmap.josm.data.coor.ILatLon;
 import org.openstreetmap.josm.data.coor.LatLon;
 import org.openstreetmap.josm.data.osm.DataSet;
@@ -85,8 +86,8 @@
         int c1=0,c2;
         double latDif,lonDif;
-        LatLon llc = nodeCommon.getCoor();
+        ILatLon llc = nodeCommon;
         for (Node n1 : nodesWay1) {
-            LatLon ll1 = n1.getCoor();
-            if (ll1 == null || llc == null) {
+            ILatLon ll1 = n1;
+            if (!ll1.isLatLonKnown() || !llc.isLatLonKnown()) {
                 Logging.warn("Null coordinates: {0} / {1}", n1, nodeCommon);
                 continue;
@@ -106,5 +107,5 @@
                     continue;
                 }
-                LatLon ll2 = n2.getCoor();
+                ILatLon ll2 = n2;
                 Node nodeOfGrid = new Node(new LatLon(ll2.lat()+latDif, ll2.lon()+lonDif));
                 cmds.add(new AddCommand(ds, nodeOfGrid));
Index: applications/editors/josm/plugins/CustomizePublicTransportStop/src/org/openstreetmap/josm/plugins/customizepublictransportstop/StopAreaOperationBase.java
===================================================================
--- applications/editors/josm/plugins/CustomizePublicTransportStop/src/org/openstreetmap/josm/plugins/customizepublictransportstop/StopAreaOperationBase.java	(revision 35975)
+++ applications/editors/josm/plugins/CustomizePublicTransportStop/src/org/openstreetmap/josm/plugins/customizepublictransportstop/StopAreaOperationBase.java	(revision 35976)
@@ -115,12 +115,10 @@
         if (platform instanceof Way) {
             // p = mapView.getPoint((Node) stopArea.selectedObject);
-            Double sumLat = 0.0;
-            Double sumLon = 0.0;
-            Integer countNode = 0;
+            double sumLat = 0.0;
+            double sumLon = 0.0;
+            final int countNode = ((Way) platform).getNodesCount();
             for (Node node : ((Way) platform).getNodes()) {
-                LatLon coord = node.getCoor();
-                sumLat += coord.getX();
-                sumLon += coord.getY();
-                countNode++;
+                sumLat += node.lat();
+                sumLon += node.lon();
             }
             return new LatLon(sumLon / countNode, sumLat / countNode);
Index: applications/editors/josm/plugins/FixAddresses/src/org/openstreetmap/josm/plugins/fixAddresses/gui/AddressEditDialog.java
===================================================================
--- applications/editors/josm/plugins/FixAddresses/src/org/openstreetmap/josm/plugins/fixAddresses/gui/AddressEditDialog.java	(revision 35975)
+++ applications/editors/josm/plugins/FixAddresses/src/org/openstreetmap/josm/plugins/fixAddresses/gui/AddressEditDialog.java	(revision 35976)
@@ -275,5 +275,5 @@
 
                 for (Node node : way.getNodes()) {
-                    mapViewer.addMapMarker(new MapMarkerDot(Color.GREEN, node.getCoor().lat(), node.getCoor().lon()));
+                    mapViewer.addMapMarker(new MapMarkerDot(Color.GREEN, node.lat(), node.lon()));
                 }
             }
Index: applications/editors/josm/plugins/comfort0/build.xml
===================================================================
--- applications/editors/josm/plugins/comfort0/build.xml	(revision 35975)
+++ applications/editors/josm/plugins/comfort0/build.xml	(revision 35976)
@@ -3,5 +3,5 @@
 
     <!-- enter the *lowest* JOSM version this plugin is currently compatible with -->
-    <property name="plugin.main.version" value="9229"/>
+    <property name="plugin.main.version" value="12164"/>
     <property name="plugin.canloadatruntime" value="true"/>
 
Index: applications/editors/josm/plugins/comfort0/src/net/simon04/comfort0/OsmToLevel0L.java
===================================================================
--- applications/editors/josm/plugins/comfort0/src/net/simon04/comfort0/OsmToLevel0L.java	(revision 35975)
+++ applications/editors/josm/plugins/comfort0/src/net/simon04/comfort0/OsmToLevel0L.java	(revision 35976)
@@ -3,5 +3,5 @@
 import java.util.Collection;
 
-import org.openstreetmap.josm.data.coor.LatLon;
+import org.openstreetmap.josm.data.coor.ILatLon;
 import org.openstreetmap.josm.data.osm.DefaultNameFormatter;
 import org.openstreetmap.josm.data.osm.KeyValueVisitor;
@@ -79,6 +79,6 @@
         sb.append(p.getType().getAPIName()).append(" ").append(p.getUniqueId());
         if (p instanceof Node) {
-            final LatLon latLon = ((Node) p).getCoor();
-            if (latLon != null) {
+            final ILatLon latLon = (Node) p;
+            if (latLon.isLatLonKnown()) {
                 sb.append(": ").append(latLon.lat()).append(", ").append(latLon.lon());
             }
Index: applications/editors/josm/plugins/graphview/src/org/openstreetmap/josm/plugins/graphview/plugin/data/JOSMDataSource.java
===================================================================
--- applications/editors/josm/plugins/graphview/src/org/openstreetmap/josm/plugins/graphview/plugin/data/JOSMDataSource.java	(revision 35975)
+++ applications/editors/josm/plugins/graphview/src/org/openstreetmap/josm/plugins/graphview/plugin/data/JOSMDataSource.java	(revision 35976)
@@ -29,10 +29,10 @@
     @Override
     public double getLat(Node node) {
-        return node.getCoor().lat();
+        return node.lat();
     }
 
     @Override
     public double getLon(Node node) {
-        return node.getCoor().lon();
+        return node.lon();
     }
 
Index: applications/editors/josm/plugins/imagery-xml-bounds/src/org/openstreetmap/josm/plugins/imageryxmlbounds/actions/ComputeBoundsAction.java
===================================================================
--- applications/editors/josm/plugins/imagery-xml-bounds/src/org/openstreetmap/josm/plugins/imageryxmlbounds/actions/ComputeBoundsAction.java	(revision 35975)
+++ applications/editors/josm/plugins/imagery-xml-bounds/src/org/openstreetmap/josm/plugins/imageryxmlbounds/actions/ComputeBoundsAction.java	(revision 35976)
@@ -23,5 +23,5 @@
 import javax.swing.AbstractAction;
 
-import org.openstreetmap.josm.data.coor.LatLon;
+import org.openstreetmap.josm.data.coor.ILatLon;
 import org.openstreetmap.josm.data.osm.BBox;
 import org.openstreetmap.josm.data.osm.IPrimitive;
@@ -342,28 +342,20 @@
     }
 
-    protected static final boolean areNodeListAndBboxEqual(List<Node> nodes, BBox bBox) {
+    protected static boolean areNodeListAndBboxEqual(List<Node> nodes, BBox bBox) {
         if (nodes.size() == 5) {
             Map<Double, List<Integer>> latMap = new HashMap<>();
             Map<Double, List<Integer>> lonMap = new HashMap<>();
 
-            for (int i=0; i<4; i++) {
-                LatLon c = nodes.get(i).getCoor();
+            for (int i = 0; i < 4; i++) {
+                ILatLon c = nodes.get(i);
                 if (i > 1) {
-                    LatLon b = nodes.get(i-1).getCoor();
+                    ILatLon b = nodes.get(i - 1);
                     if (b.lat() != c.lat() && b.lon() != c.lon()) {
                         return false;
                     }
                 }
-                List<Integer> latList = latMap.get(c.lat());
-                if (latList == null) {
-                    latList = new ArrayList<>();
-                    latMap.put(c.lat(), latList);
-                }
+                List<Integer> latList = latMap.computeIfAbsent(c.lat(), lat -> new ArrayList<>(1));
                 latList.add(i);
-                List<Integer> lonList = lonMap.get(c.lon());
-                if (lonList == null) {
-                    lonList = new ArrayList<>();
-                    lonMap.put(c.lon(), lonList);
-                }
+                List<Integer> lonList = lonMap.computeIfAbsent(c.lon(), lon -> new ArrayList<>(1));
                 lonList.add(i);
             }
@@ -392,5 +384,5 @@
     }
 
-    protected static final String getNodeListShape(List<Node> nodes) {
+    protected static String getNodeListShape(List<Node> nodes) {
         StringBuilder result = new StringBuilder("            <shape>\n");
         int size = nodes.size();
@@ -402,5 +394,5 @@
             if (j == size)
                 j = 0;
-            LatLon ll = nodes.get(i).getCoor();
+            ILatLon ll = nodes.get(i);
             result.append("<point lat='")
                   .append(DF.format(ll.lat())).append("' lon='")
Index: applications/editors/josm/plugins/importvec/src/org/openstreetmap/josm/plugins/importvec/SvgImportTask.java
===================================================================
--- applications/editors/josm/plugins/importvec/src/org/openstreetmap/josm/plugins/importvec/SvgImportTask.java	(revision 35975)
+++ applications/editors/josm/plugins/importvec/src/org/openstreetmap/josm/plugins/importvec/SvgImportTask.java	(revision 35976)
@@ -137,5 +137,5 @@
                         break;
                     case PathIterator.SEG_CLOSE:
-                        if (currentway.firstNode().getCoor().equalsEpsilon(nodes.getLast().getCoor(), ILatLon.MAX_SERVER_PRECISION)) {
+                        if (currentway.firstNode().equalsEpsilon(nodes.getLast(), ILatLon.MAX_SERVER_PRECISION)) {
                             currentway.removeNode(nodes.removeLast());
                         }
Index: applications/editors/josm/plugins/jts/build.xml
===================================================================
--- applications/editors/josm/plugins/jts/build.xml	(revision 35975)
+++ applications/editors/josm/plugins/jts/build.xml	(revision 35976)
@@ -4,5 +4,5 @@
     <property name="commit.message" value="Commit message"/>
     <!-- enter the *lowest* JOSM version this plugin is currently compatible with -->
-    <property name="plugin.main.version" value="10580"/>
+    <property name="plugin.main.version" value="12164"/>
     
     <property name="plugin.author" value="Josh Doe &lt;josh@joshdoe.com&gt;"/>
Index: applications/editors/josm/plugins/jts/src/org/openstreetmap/josm/plugins/jts/JTSConverter.java
===================================================================
--- applications/editors/josm/plugins/jts/src/org/openstreetmap/josm/plugins/jts/JTSConverter.java	(revision 35975)
+++ applications/editors/josm/plugins/jts/src/org/openstreetmap/josm/plugins/jts/JTSConverter.java	(revision 35976)
@@ -71,5 +71,5 @@
             return new Coordinate(node.getEastNorth().getX(), node.getEastNorth().getY());
         else
-            return new Coordinate(node.getCoor().getX(), node.getCoor().getY());
+            return new Coordinate(node.lon(), node.lat());
     }
 
Index: applications/editors/josm/plugins/measurement/src/org/openstreetmap/josm/plugins/measurement/MeasurementDialog.java
===================================================================
--- applications/editors/josm/plugins/measurement/src/org/openstreetmap/josm/plugins/measurement/MeasurementDialog.java	(revision 35975)
+++ applications/editors/josm/plugins/measurement/src/org/openstreetmap/josm/plugins/measurement/MeasurementDialog.java	(revision 35976)
@@ -209,5 +209,5 @@
                         } else {
                             length += lastNode.getCoor().greatCircleDistance(n.getCoor());
-                            segAngle = MeasurementLayer.angleBetween(lastNode.getCoor(), n.getCoor());
+                            segAngle = MeasurementLayer.angleBetween(lastNode, n);
                             lastNode = n;
                         }
@@ -235,5 +235,5 @@
                         wayArea += (MeasurementLayer.calcX(n.getCoor()) * MeasurementLayer.calcY(lastN.getCoor()))
                                 - (MeasurementLayer.calcY(n.getCoor()) * MeasurementLayer.calcX(lastN.getCoor()));
-                        segAngle = MeasurementLayer.angleBetween(lastN.getCoor(), n.getCoor());
+                        segAngle = MeasurementLayer.angleBetween(lastN, n);
                     }
                     lastN = n;
Index: applications/editors/josm/plugins/measurement/src/org/openstreetmap/josm/plugins/measurement/MeasurementLayer.java
===================================================================
--- applications/editors/josm/plugins/measurement/src/org/openstreetmap/josm/plugins/measurement/MeasurementLayer.java	(revision 35975)
+++ applications/editors/josm/plugins/measurement/src/org/openstreetmap/josm/plugins/measurement/MeasurementLayer.java	(revision 35976)
@@ -2,4 +2,5 @@
 package org.openstreetmap.josm.plugins.measurement;
 /// @author Raphael Mack <ramack@raphael-mack.de>
+
 import static org.openstreetmap.josm.tools.I18n.tr;
 
@@ -28,4 +29,5 @@
 
 import org.openstreetmap.josm.data.Bounds;
+import org.openstreetmap.josm.data.coor.ILatLon;
 import org.openstreetmap.josm.data.coor.LatLon;
 import org.openstreetmap.josm.data.gpx.IGpxTrack;
@@ -171,5 +173,5 @@
     }
 
-    public static double angleBetween(LatLon p1, LatLon p2){
+    public static double angleBetween(ILatLon p1, ILatLon p2){
         double lat1, lon1, lat2, lon2;
         double dlon;
Index: applications/editors/josm/plugins/namemanager/src/org/openstreetmap/josm/plugins/namemanager/utils/NameManagerUtils.java
===================================================================
--- applications/editors/josm/plugins/namemanager/src/org/openstreetmap/josm/plugins/namemanager/utils/NameManagerUtils.java	(revision 35975)
+++ applications/editors/josm/plugins/namemanager/src/org/openstreetmap/josm/plugins/namemanager/utils/NameManagerUtils.java	(revision 35976)
@@ -60,8 +60,8 @@
                 }
                 pairs: for (Pair<Node, Node> pair : way.getNodePairs(false)) {
-                    double x1Pair = pair.a.getCoor().getX();
-                    double y1Pair = pair.a.getCoor().getY();
-                    double x2Pair = pair.b.getCoor().getX();
-                    double y2Pair = pair.b.getCoor().getY();
+                    double x1Pair = pair.a.lon();
+                    double y1Pair = pair.a.lat();
+                    double x2Pair = pair.b.lon();
+                    double y2Pair = pair.b.lat();
                     double aPair = 0.0;
                     double bPair = 0.0;
@@ -77,8 +77,8 @@
                     int crossCount = 0;
                     areaLine: for (Pair<Node, Node> areaLine : areaBorderLines) {
-                        double x1Line = areaLine.a.getCoor().getX();
-                        double y1Line = areaLine.a.getCoor().getY();
-                        double x2Line = areaLine.b.getCoor().getX();
-                        double y2Line = areaLine.b.getCoor().getY();
+                        double x1Line = areaLine.a.lon();
+                        double y1Line = areaLine.a.lat();
+                        double x2Line = areaLine.b.lon();
+                        double y2Line = areaLine.b.lat();
                         boolean areaLinePerpendicular = false;
                         double aLine = 0.0;
@@ -178,6 +178,6 @@
                         }
                         if (raySource != null) {
-                            double rsX = raySource.getCoor().getX();
-                            double rsY = raySource.getCoor().getY();
+                            double rsX = raySource.lon();
+                            double rsY = raySource.lat();
                             if (areaLinePerpendicular) {
                                 if (x1Line == x2Line) {
@@ -218,9 +218,9 @@
         List<Node> nodes = way.getNodes();
         for (Node node : nodes) {
-            if (node.getCoor().getX() < x) {
-                x = node.getCoor().getX();
-            }
-            if (node.getCoor().getY() > y) {
-                y = node.getCoor().getY();
+            if (node.lon() < x) {
+                x = node.lon();
+            }
+            if (node.lat() > y) {
+                y = node.lat();
             }
         }
Index: applications/editors/josm/plugins/opendata/src/org/openstreetmap/josm/plugins/opendata/core/io/geographic/GeographicReader.java
===================================================================
--- applications/editors/josm/plugins/opendata/src/org/openstreetmap/josm/plugins/opendata/core/io/geographic/GeographicReader.java	(revision 35975)
+++ applications/editors/josm/plugins/opendata/src/org/openstreetmap/josm/plugins/opendata/core/io/geographic/GeographicReader.java	(revision 35976)
@@ -6,5 +6,4 @@
 import java.awt.Component;
 import java.awt.GraphicsEnvironment;
-import java.awt.Point;
 import java.io.IOException;
 import java.io.InputStream;
@@ -25,5 +24,4 @@
 import javax.swing.Icon;
 import javax.swing.JOptionPane;
-import javax.xml.crypto.dsig.TransformException;
 
 import org.geotools.geometry.jts.JTS;
@@ -37,4 +35,5 @@
 import org.geotools.util.factory.Hints;
 import org.locationtech.jts.geom.LineString;
+import org.locationtech.jts.geom.Point;
 import org.opengis.geometry.MismatchedDimensionException;
 import org.opengis.referencing.FactoryException;
@@ -44,6 +43,8 @@
 import org.opengis.referencing.crs.ProjectedCRS;
 import org.opengis.referencing.cs.CoordinateSystem;
+import org.opengis.referencing.datum.Datum;
 import org.opengis.referencing.operation.MathTransform;
 import org.opengis.referencing.operation.OperationNotFoundException;
+import org.opengis.referencing.operation.TransformException;
 import org.openstreetmap.josm.data.coor.ILatLon;
 import org.openstreetmap.josm.data.coor.LatLon;
@@ -54,5 +55,4 @@
 import org.openstreetmap.josm.data.osm.RelationMember;
 import org.openstreetmap.josm.data.osm.Way;
-import org.openstreetmap.josm.data.projection.datum.Datum;
 import org.openstreetmap.josm.data.validation.tests.DuplicateWay;
 import org.openstreetmap.josm.gui.ExtendedDialog;
@@ -113,5 +113,5 @@
             LatLon ll = new LatLon(p.getY(), p.getX());
             for (Node node : nodes.values()) {
-                if (node.getCoor().equalsEpsilon(ll, ILatLon.MAX_SERVER_PRECISION)) {
+                if (node.equalsEpsilon(ll, ILatLon.MAX_SERVER_PRECISION)) {
                     return node;
                 }
@@ -261,6 +261,6 @@
         CoordinateSystem cs2 = crs2.getCoordinateSystem();
         if (!compareDebug("cs", cs1, cs2)) {
-            Integer dim1 = cs1.getDimension();
-            Integer dim2 = cs2.getDimension();
+            int dim1 = cs1.getDimension();
+            int dim2 = cs2.getDimension();
             if (compareDebug("cs.dim", dim1, dim2)) {
                 for (int i = 0; i < dim1; i++) {
@@ -397,5 +397,5 @@
                 }
 
-                if (candidates.size() > 0) {
+                if (!candidates.isEmpty()) {
                     CoordinateReferenceSystem newCRS = candidates.get(0);
                     try {
Index: applications/editors/josm/plugins/pdfimport/src/org/openstreetmap/josm/plugins/pdfimport/FilePlacement18.java
===================================================================
--- applications/editors/josm/plugins/pdfimport/src/org/openstreetmap/josm/plugins/pdfimport/FilePlacement18.java	(revision 35975)
+++ applications/editors/josm/plugins/pdfimport/src/org/openstreetmap/josm/plugins/pdfimport/FilePlacement18.java	(revision 35976)
@@ -27,5 +27,5 @@
 
 import org.openstreetmap.josm.data.coor.EastNorth;
-import org.openstreetmap.josm.data.coor.LatLon;
+import org.openstreetmap.josm.data.coor.ILatLon;
 import org.openstreetmap.josm.data.osm.Node;
 import org.openstreetmap.josm.data.osm.OsmPrimitive;
@@ -307,5 +307,5 @@
             }
 
-            LatLon ll = ((Node) selected.iterator().next()).getCoor();
+            ILatLon ll = ((Node) selected.iterator().next());
             return new EastNorth(ll.lon() * 1000, ll.lat() * 1000);
         }
Index: applications/editors/josm/plugins/poly/src/poly/PolyExporter.java
===================================================================
--- applications/editors/josm/plugins/poly/src/poly/PolyExporter.java	(revision 35975)
+++ applications/editors/josm/plugins/poly/src/poly/PolyExporter.java	(revision 35976)
@@ -102,5 +102,5 @@
 
         for (Node n : w.getNodes()) {
-            writer.println(String.format(Locale.ENGLISH, "   %f   %f", n.getCoor().lon(), n.getCoor().lat()));
+            writer.println(String.format(Locale.ENGLISH, "   %f   %f", n.lon(), n.lat()));
         }
         writer.println("END");
Index: applications/editors/josm/plugins/public_transport/src/org/openstreetmap/josm/plugins/public_transport/actions/RoutePatternAction.java
===================================================================
--- applications/editors/josm/plugins/public_transport/src/org/openstreetmap/josm/plugins/public_transport/actions/RoutePatternAction.java	(revision 35975)
+++ applications/editors/josm/plugins/public_transport/src/org/openstreetmap/josm/plugins/public_transport/actions/RoutePatternAction.java	(revision 35976)
@@ -1868,7 +1868,7 @@
                     if ("backward".equals(itineraryData.getValueAt(i, 1))) {
                         for (int j = way.getNodesCount() - 2; j >= 0; --j) {
-                            SegmentMetric sm = new SegmentMetric(way.getNode(j + 1).getCoor().lat(),
-                                    way.getNode(j + 1).getCoor().lon(),
-                                    way.getNode(j).getCoor().lat(), way.getNode(j).getCoor().lon(),
+                            SegmentMetric sm = new SegmentMetric(way.getNode(j + 1).lat(),
+                                    way.getNode(j + 1).lon(),
+                                    way.getNode(j).lat(), way.getNode(j).lon(),
                                     distance);
                             segmentMetrics.add(sm);
@@ -1877,8 +1877,8 @@
                     } else {
                         for (int j = 0; j < way.getNodesCount() - 1; ++j) {
-                            SegmentMetric sm = new SegmentMetric(way.getNode(j).getCoor().lat(),
-                                    way.getNode(j).getCoor().lon(),
-                                    way.getNode(j + 1).getCoor().lat(),
-                                    way.getNode(j + 1).getCoor().lon(), distance);
+                            SegmentMetric sm = new SegmentMetric(way.getNode(j).lat(),
+                                    way.getNode(j).lon(),
+                                    way.getNode(j + 1).lat(),
+                                    way.getNode(j + 1).lon(), distance);
                             segmentMetrics.add(sm);
                             distance += sm.length;
@@ -1894,5 +1894,5 @@
     private StopReference detectMinDistance(Node node, Vector<SegmentMetric> segmentMetrics,
             boolean rhsPossible, boolean lhsPossible) {
-        if (node == null || node.getCoor() == null)
+        if (node == null || !node.isLatLonKnown())
             return null;
 
@@ -1900,6 +1900,6 @@
         double position = -1.0;
         double distance = 180.0;
-        double lat = node.getCoor().lat();
-        double lon = node.getCoor().lon();
+        double lat = node.lat();
+        double lon = node.lon();
 
         int curIndex = -2;
Index: applications/editors/josm/plugins/reltoolbox/src/relcontext/actions/SplittingMultipolygons.java
===================================================================
--- applications/editors/josm/plugins/reltoolbox/src/relcontext/actions/SplittingMultipolygons.java	(revision 35975)
+++ applications/editors/josm/plugins/reltoolbox/src/relcontext/actions/SplittingMultipolygons.java	(revision 35976)
@@ -52,6 +52,5 @@
                 return false;
             for (Node n : way.getNodes()) {
-                LatLon ll = n.getCoor();
-                if (n.isIncomplete() || (a != null && !a.contains(ll.getX(), ll.getY())))
+                if (n.isIncomplete() || (a != null && !a.contains(n.lon(), n.lat())))
                     return false;
             }
Index: applications/editors/josm/plugins/reverter/src/reverter/ChangesetReverter.java
===================================================================
--- applications/editors/josm/plugins/reverter/src/reverter/ChangesetReverter.java	(revision 35975)
+++ applications/editors/josm/plugins/reverter/src/reverter/ChangesetReverter.java	(revision 35976)
@@ -499,5 +499,5 @@
         try {
             for (Node n : nodes) {
-                if (!n.isDeleted() && n.getCoor() == null) {
+                if (!n.isDeleted() && !n.isLatLonKnown()) {
                     PrimitiveId id = n.getPrimitiveId();
                     OsmPrimitive p = ds.getPrimitiveById(id);
Index: applications/editors/josm/plugins/simplifyarea/src/org/openstreetmap/josm/plugins/simplifyarea/SimplifyAreaAction.java
===================================================================
--- applications/editors/josm/plugins/simplifyarea/src/org/openstreetmap/josm/plugins/simplifyarea/SimplifyAreaAction.java	(revision 35975)
+++ applications/editors/josm/plugins/simplifyarea/src/org/openstreetmap/josm/plugins/simplifyarea/SimplifyAreaAction.java	(revision 35976)
@@ -56,5 +56,5 @@
     private static boolean isInBounds(final Node node, final List<Bounds> bounds) {
         for (final Bounds b : bounds) {
-            if (b.contains(node.getCoor())) {
+            if (b.contains(node)) {
                 return true;
             }
Index: applications/editors/josm/plugins/terracer/src/org/openstreetmap/josm/plugins/terracer/TerracerAction.java
===================================================================
--- applications/editors/josm/plugins/terracer/src/org/openstreetmap/josm/plugins/terracer/TerracerAction.java	(revision 35975)
+++ applications/editors/josm/plugins/terracer/src/org/openstreetmap/josm/plugins/terracer/TerracerAction.java	(revision 35976)
@@ -758,8 +758,8 @@
      */
     private double calculateSideness(Node a, Node b, Node c, Node d) {
-        final double ndx = b.getCoor().getX() - a.getCoor().getX();
-        final double pdx = d.getCoor().getX() - c.getCoor().getX();
-        final double ndy = b.getCoor().getY() - a.getCoor().getY();
-        final double pdy = d.getCoor().getY() - c.getCoor().getY();
+        final double ndx = b.lon() - a.lon();
+        final double pdx = d.lon() - c.lon();
+        final double ndy = b.lat() - a.lat();
+        final double pdy = d.lat() - c.lat();
 
         return (ndx * pdx + ndy * pdy)
@@ -780,8 +780,7 @@
     private Node interpolateNode(Node a, Node b, double f) {
         Node n = new Node(a.getEastNorth().interpolate(b.getEastNorth(), f));
-        LatLon latLon = n.getCoor();
-		if (latLon.equalsEpsilon(a.getCoor(), ILatLon.MAX_SERVER_PRECISION))
+		if (n.equalsEpsilon(a, ILatLon.MAX_SERVER_PRECISION))
             return a;
-        if (latLon.equalsEpsilon(b.getCoor(), ILatLon.MAX_SERVER_PRECISION))
+        if (n.equalsEpsilon(b, ILatLon.MAX_SERVER_PRECISION))
             return b;
         return n;
Index: applications/editors/josm/plugins/tracer/src/org/openstreetmap/josm/plugins/tracer/ConnectWays.java
===================================================================
--- applications/editors/josm/plugins/tracer/src/org/openstreetmap/josm/plugins/tracer/ConnectWays.java	(revision 35975)
+++ applications/editors/josm/plugins/tracer/src/org/openstreetmap/josm/plugins/tracer/ConnectWays.java	(revision 35976)
@@ -49,8 +49,8 @@
             LatLon ll = n.getCoor();
             BBox bbox = new BBox(
-                    ll.getX() - MIN_DISTANCE,
-                    ll.getY() - MIN_DISTANCE,
-                    ll.getX() + MIN_DISTANCE,
-                    ll.getY() + MIN_DISTANCE);
+                    n.lon() - MIN_DISTANCE,
+                    n.lat() - MIN_DISTANCE,
+                    n.lon() + MIN_DISTANCE,
+                    n.lat() + MIN_DISTANCE);
 
             // bude se node slucovat s jinym?
@@ -129,8 +129,8 @@
         LatLon ll = node.getCoor();
         BBox bbox = new BBox(
-                ll.getX() - MIN_DISTANCE_TW,
-                ll.getY() - MIN_DISTANCE_TW,
-                ll.getX() + MIN_DISTANCE_TW,
-                ll.getY() + MIN_DISTANCE_TW);
+                node.lon() - MIN_DISTANCE_TW,
+                node.lat() - MIN_DISTANCE_TW,
+                node.lon() + MIN_DISTANCE_TW,
+                node.lat() + MIN_DISTANCE_TW);
 
         // node nebyl slouceny s jinym
@@ -188,14 +188,14 @@
         while (i < way.getNodesCount()) {
             // usecka n1, n2
-            LatLon n1 = way.getNodes().get(i).getCoor();
-            LatLon n2 = way.getNodes().get((i + 1) % way.getNodesCount()).getCoor();
+            Node n1 = way.getNodes().get(i);
+            Node n2 = way.getNodes().get((i + 1) % way.getNodesCount());
             System.out.println(way.getNodes().get(i) + "-----" + way.getNodes().get((i + 1) % way.getNodesCount()));
             double minDistanceSq = MIN_DISTANCE_SQ;
             //double maxAngle = MAX_ANGLE;
             List<Node> nodes = MainApplication.getLayerManager().getEditDataSet().searchNodes(new BBox(
-                Math.min(n1.getX(), n2.getX()) - minDistanceSq,
-                Math.min(n1.getY(), n2.getY()) - minDistanceSq,
-                Math.max(n1.getX(), n2.getX()) + minDistanceSq,
-                Math.max(n1.getY(), n2.getY()) + minDistanceSq
+                Math.min(n1.lon(), n2.lon()) - minDistanceSq,
+                Math.min(n1.lat(), n2.lat()) - minDistanceSq,
+                Math.max(n1.lon(), n2.lon()) + minDistanceSq,
+                Math.max(n1.lat(), n2.lat()) + minDistanceSq
             ));
             Node nearestNode = null;
@@ -204,10 +204,9 @@
                     continue;
                 }
-                LatLon nn = nod.getCoor();
-                double dist = TracerGeometry.distanceFromSegment(nn, n1, n2);
-                double angle = TracerGeometry.angleOfLines(n1, nn, nn, n2);
+                double dist = TracerGeometry.distanceFromSegment(nod, n1, n2);
+                double angle = TracerGeometry.angleOfLines(n1, nod, nod, n2);
                 System.out.println("Angle: " + angle + " distance: " + dist + " Node: " + nod);
-                if (!n1.equalsEpsilon(nn, ILatLon.MAX_SERVER_PRECISION)
-                 && !n2.equalsEpsilon(nn, ILatLon.MAX_SERVER_PRECISION) && dist < minDistanceSq) { // && Math.abs(angle) < maxAngle) {
+                if (!n1.equalsEpsilon(nod, ILatLon.MAX_SERVER_PRECISION)
+                 && !n2.equalsEpsilon(nod, ILatLon.MAX_SERVER_PRECISION) && dist < minDistanceSq) { // && Math.abs(angle) < maxAngle) {
                     //maxAngle = angle;
                     nearestNode = nod;
Index: applications/editors/josm/plugins/tracer/src/org/openstreetmap/josm/plugins/tracer/TracerGeometry.java
===================================================================
--- applications/editors/josm/plugins/tracer/src/org/openstreetmap/josm/plugins/tracer/TracerGeometry.java	(revision 35975)
+++ applications/editors/josm/plugins/tracer/src/org/openstreetmap/josm/plugins/tracer/TracerGeometry.java	(revision 35976)
@@ -7,7 +7,10 @@
 package org.openstreetmap.josm.plugins.tracer;
 
-import org.openstreetmap.josm.data.coor.LatLon;
+import org.openstreetmap.josm.data.coor.ILatLon;
 
-public class TracerGeometry {
+public final class TracerGeometry {
+    private TracerGeometry() {
+        // Hide constructor
+    }
 
     /**
@@ -19,5 +22,5 @@
      * @return Angle in degrees.
      */
-    static public double angleOfLines(LatLon a, LatLon b, LatLon c, LatLon d) {
+    public static double angleOfLines(ILatLon a, ILatLon b, ILatLon c, ILatLon d) {
         return (Math.abs(
                     Math.atan2(a.lat() - b.lat(), a.lon() - b.lon()) -
@@ -33,13 +36,13 @@
      * @return Distance.
      */
-    static public double distanceFromSegment(LatLon c, LatLon a, LatLon b) {
+    public static double distanceFromSegment(ILatLon c, ILatLon a, ILatLon b) {
         return distanceFromSegment(
-                c.getX(), c.getY(),
-                a.getX(), a.getY(),
-                b.getX(), b.getY()
+                c.lon(), c.lat(),
+                a.lon(), a.lat(),
+                b.lon(), b.lat()
         );
     }
 
-    static private double distanceFromSegment(double cx, double cy, double ax, double ay, double bx, double by) {
+    private static double distanceFromSegment(double cx, double cy, double ax, double ay, double bx, double by) {
         double r_numerator = (cx - ax) * (bx - ax) + (cy - ay) * (by - ay);
         double r_denomenator = (bx - ax) * (bx - ax) + (by - ay) * (by - ay);
Index: applications/editors/josm/plugins/tracer2/src/org/openstreetmap/josm/plugins/tracer2/ConnectWays.java
===================================================================
--- applications/editors/josm/plugins/tracer2/src/org/openstreetmap/josm/plugins/tracer2/ConnectWays.java	(revision 35975)
+++ applications/editors/josm/plugins/tracer2/src/org/openstreetmap/josm/plugins/tracer2/ConnectWays.java	(revision 35976)
@@ -82,8 +82,7 @@
 	}
 
-	private static double calcAlpha(LatLon oP1, Node n) {
-		LatLon oP2 = n.getCoor();
-
-		double dAlpha = Math.atan((oP2.getY() - oP1.getY()) / (oP2.getX() - oP1.getX())) * 180 / Math.PI + (oP1.getX() > oP2.getX() ? 180 : 0);
+	private static double calcAlpha(LatLon oP1, Node oP2) {
+
+		double dAlpha = Math.atan((oP2.lat() - oP1.lat()) / (oP2.lon() - oP1.lon())) * 180 / Math.PI + (oP1.lon() > oP2.lon() ? 180 : 0);
 		return checkAlpha(dAlpha);
 	}
@@ -333,5 +332,5 @@
 		//List<Command> cmds = new LinkedList<Command>();
 
-		LatLon ll = node.getCoor();
+		//LatLon ll = node.getCoor();
 		//BBox bbox = new BBox(
 		//        ll.getX() - MIN_DISTANCE_TW,
@@ -358,5 +357,5 @@
 			for (Pair<Node, Node> np : ww.getNodePairs(false)) {
 				//double dist1 = TracerGeometry.distanceFromSegment(ll, np.a.getCoor(), np.b.getCoor());
-				double dist = distanceFromSegment2(ll, np.a.getCoor(), np.b.getCoor());
+				double dist = distanceFromSegment2(node, np.a, np.b);
 				//System.out.println(" distance: " + dist1 + "  " + dist);
 
@@ -381,23 +380,23 @@
 	}
 
-	private static double distanceFromSegment2(LatLon c, LatLon a, LatLon b) {
+	private static double distanceFromSegment2(ILatLon c, ILatLon a, ILatLon b) {
 		double x;
 		double y;
 
 		StraightLine oStraightLine1 = new StraightLine(
-				new Point2D.Double(a.getX(), a.getY()),
-				new Point2D.Double(b.getX(), b.getY()));
+				new Point2D.Double(a.lon(), a.lat()),
+				new Point2D.Double(b.lon(), b.lat()));
 		StraightLine oStraightLine2 = new StraightLine(
-				new Point2D.Double(c.getX(), c.getY()),
-				new Point2D.Double(c.getX() + (a.getY()-b.getY()), c.getY() - (a.getX()-b.getX())));
+				new Point2D.Double(c.lon(), c.lat()),
+				new Point2D.Double(c.lon() + (a.lat()-b.lat()), c.lat() - (a.lon()-b.lon())));
 		Point2D.Double oPoint = oStraightLine1.GetIntersectionPoint(oStraightLine2);
 
-		if ((oPoint.x > a.getX() && oPoint.x > b.getX()) || (oPoint.x < a.getX() && oPoint.x < b.getX()) ||
-				(oPoint.y > a.getY() && oPoint.y > b.getY()) || (oPoint.y < a.getY() && oPoint.y < b.getY())) {
+		if ((oPoint.x > a.lon() && oPoint.x > b.lon()) || (oPoint.x < a.lon() && oPoint.x < b.lon()) ||
+				(oPoint.y > a.lat() && oPoint.y > b.lat()) || (oPoint.y < a.lat() && oPoint.y < b.lat())) {
 			return 100000;
 		}
 
-		x = c.getX()-oPoint.getX();
-		y = c.getY()-oPoint.getY();
+		x = c.lon()-oPoint.getX();
+		y = c.lat()-oPoint.getY();
 
 		return Math.sqrt((x*x)+(y*y));
@@ -421,6 +420,6 @@
 		while (i < way.getNodesCount()) {
 			// usecka n1, n2
-			LatLon n1 = way.getNodes().get(i).getCoor();
-			LatLon n2 = way.getNodes().get((i + 1) % way.getNodesCount()).getCoor();
+			ILatLon n1 = way.getNodes().get(i);
+			ILatLon n2 = way.getNodes().get((i + 1) % way.getNodesCount());
 			System.out.println(way.getNodes().get(i) + "-----" + way.getNodes().get((i + 1) % way.getNodesCount()));
 			double minDistanceSq = Double.MAX_VALUE;
@@ -438,11 +437,10 @@
 					continue;
 				}
-				LatLon nn = nod.getCoor();
-				//double dist = TracerGeometry.distanceFromSegment(nn, n1, n2);
-				double dist = distanceFromSegment2(nn, n1, n2);
-				//                double angle = TracerGeometry.angleOfLines(n1, nn, nn, n2);
+				//double dist = TracerGeometry.distanceFromSegment(nod, n1, n2);
+				double dist = distanceFromSegment2(nod, n1, n2);
+				//                double angle = TracerGeometry.angleOfLines(n1, nod, nod, n2);
 				//System.out.println("Angle: " + angle + " distance: " + dist + " Node: " + nod);
-				if (!n1.equalsEpsilon(nn, ILatLon.MAX_SERVER_PRECISION)
-				 && !n2.equalsEpsilon(nn, ILatLon.MAX_SERVER_PRECISION) && dist < minDistanceSq) { // && Math.abs(angle) < maxAngle) {
+				if (!n1.equalsEpsilon(nod, ILatLon.MAX_SERVER_PRECISION)
+				 && !n2.equalsEpsilon(nod, ILatLon.MAX_SERVER_PRECISION) && dist < minDistanceSq) { // && Math.abs(angle) < maxAngle) {
 					minDistanceSq = dist;
 					//                    maxAngle = angle;
Index: applications/editors/josm/plugins/trustosm/src/org/openstreetmap/josm/plugins/trustosm/data/TrustNode.java
===================================================================
--- applications/editors/josm/plugins/trustosm/src/org/openstreetmap/josm/plugins/trustosm/data/TrustNode.java	(revision 35975)
+++ applications/editors/josm/plugins/trustosm/src/org/openstreetmap/josm/plugins/trustosm/data/TrustNode.java	(revision 35976)
@@ -25,8 +25,7 @@
 
     public static String generateNodeSigtext(Node node) {
-        LatLon point = node.getCoor();
         String sigtext = node.getUniqueId() + "(";
-        sigtext += DecimalDegreesCoordinateFormat.INSTANCE.latToString(point) + ",";
-        sigtext += DecimalDegreesCoordinateFormat.INSTANCE.lonToString(point) + ")";
+        sigtext += DecimalDegreesCoordinateFormat.INSTANCE.latToString(node) + ",";
+        sigtext += DecimalDegreesCoordinateFormat.INSTANCE.lonToString(node) + ")";
         return sigtext;
     }
Index: applications/editors/josm/plugins/turnlanes/src/org/openstreetmap/josm/plugins/turnlanes/gui/GuiUtil.java
===================================================================
--- applications/editors/josm/plugins/turnlanes/src/org/openstreetmap/josm/plugins/turnlanes/gui/GuiUtil.java	(revision 35975)
+++ applications/editors/josm/plugins/turnlanes/src/org/openstreetmap/josm/plugins/turnlanes/gui/GuiUtil.java	(revision 35976)
@@ -134,5 +134,5 @@
 
     public static Point2D loc(Node node) {
-        final EastNorth loc = ProjectionRegistry.getProjection().latlon2eastNorth(node.getCoor());
+        final EastNorth loc = node.getEastNorth();
         return new Point2D.Double(loc.getX(), -loc.getY());
     }
Index: applications/editors/josm/plugins/turnrestrictions/src/org/openstreetmap/josm/plugins/turnrestrictions/TurnRestrictionBuilder.java
===================================================================
--- applications/editors/josm/plugins/turnrestrictions/src/org/openstreetmap/josm/plugins/turnrestrictions/TurnRestrictionBuilder.java	(revision 35975)
+++ applications/editors/josm/plugins/turnrestrictions/src/org/openstreetmap/josm/plugins/turnrestrictions/TurnRestrictionBuilder.java	(revision 35976)
@@ -64,6 +64,6 @@
         Node n1 = nodes.get(1);
 
-        double x = n1.getCoor().getX() - n0.getCoor().getX();
-        double y = n1.getCoor().getY() - n0.getCoor().getY();
+        double x = n1.lon() - n0.lon();
+        double y = n1.lat() - n0.lat();
         return Math.atan2(y, x);
     }
Index: applications/editors/josm/plugins/utilsplugin2/src/org/openstreetmap/josm/plugins/utilsplugin2/replacegeometry/ReplaceGeometryUtils.java
===================================================================
--- applications/editors/josm/plugins/utilsplugin2/src/org/openstreetmap/josm/plugins/utilsplugin2/replacegeometry/ReplaceGeometryUtils.java	(revision 35975)
+++ applications/editors/josm/plugins/utilsplugin2/src/org/openstreetmap/josm/plugins/utilsplugin2/replacegeometry/ReplaceGeometryUtils.java	(revision 35976)
@@ -450,6 +450,5 @@
 
     static boolean isInArea(Node node, Area area) {
-        LatLon ll = node.getCoor();
-        return node.isNewOrUndeleted() || area == null || ll == null || area.contains(ll.getX(), ll.getY());
+        return node.isNewOrUndeleted() || area == null || !node.isLatLonKnown() || area.contains(node.lon(), node.lat());
     }
 
Index: applications/editors/josm/plugins/waydownloader/src/org/openstreetmap/josm/plugins/waydownloader/WayDownloaderPlugin.java
===================================================================
--- applications/editors/josm/plugins/waydownloader/src/org/openstreetmap/josm/plugins/waydownloader/WayDownloaderPlugin.java	(revision 35975)
+++ applications/editors/josm/plugins/waydownloader/src/org/openstreetmap/josm/plugins/waydownloader/WayDownloaderPlugin.java	(revision 35976)
@@ -22,5 +22,5 @@
 import org.openstreetmap.josm.data.DataSource;
 import org.openstreetmap.josm.data.UndoRedoHandler;
-import org.openstreetmap.josm.data.coor.LatLon;
+import org.openstreetmap.josm.data.coor.ILatLon;
 import org.openstreetmap.josm.data.osm.DataSet;
 import org.openstreetmap.josm.data.osm.DefaultNameFormatter;
@@ -111,5 +111,5 @@
             DownloadOsmTask downloadTask = new DownloadOsmTask();
             final PleaseWaitProgressMonitor monitor = new PleaseWaitProgressMonitor();
-            LatLon ll = selectedNode.getCoor();
+            ILatLon ll = selectedNode;
             final Future<?> future = downloadTask.download(
                     new DownloadParams(),
@@ -308,5 +308,5 @@
         for (DataSource datasource : MainApplication.getLayerManager().getEditDataSet().getDataSources()) {
             Bounds bounds = datasource.bounds;
-            if (bounds != null && bounds.contains(node.getCoor())) return true;
+            if (bounds != null && bounds.contains(node)) return true;
         }
         return false;
