Index: /trunk/src/org/openstreetmap/josm/actions/AlignInCircleAction.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/actions/AlignInCircleAction.java	(revision 8383)
+++ /trunk/src/org/openstreetmap/josm/actions/AlignInCircleAction.java	(revision 8384)
@@ -232,5 +232,5 @@
         // center. This method is ok as long as distances are short
         // relative to the distance from the N or S poles.
-        if (radius == 0) {
+        if (Double.doubleToRawLongBits(radius) == 0) {
             for (Node n : nodes) {
                 radius += distance(center, n.getEastNorth());
Index: /trunk/src/org/openstreetmap/josm/actions/AlignInLineAction.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/actions/AlignInLineAction.java	(revision 8383)
+++ /trunk/src/org/openstreetmap/josm/actions/AlignInLineAction.java	(revision 8384)
@@ -363,5 +363,5 @@
             b = xM - xB;
             double norm = Math.sqrt(a*a + b*b);
-            if (norm == 0)
+            if (Double.doubleToRawLongBits(norm) == 0)
                 // Nodes have same coordinates !
                 throw new InvalidSelection();
Index: /trunk/src/org/openstreetmap/josm/actions/JoinAreasAction.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/actions/JoinAreasAction.java	(revision 8383)
+++ /trunk/src/org/openstreetmap/josm/actions/JoinAreasAction.java	(revision 8384)
@@ -46,4 +46,5 @@
 import org.openstreetmap.josm.tools.Pair;
 import org.openstreetmap.josm.tools.Shortcut;
+import org.openstreetmap.josm.tools.Utils;
 
 /**
@@ -357,5 +358,5 @@
                 double candidateAngle = getAngle(headNode, candidatePrevNode, prevNode);
 
-                if(mostLeft == null || candidateAngle < angle || (candidateAngle == angle && !candidateComingToHead)) {
+                if(mostLeft == null || candidateAngle < angle || (Utils.equalsEpsilon(candidateAngle, angle) && !candidateComingToHead)) {
                     // Candidate is most left
                     mostLeft = candidateWay;
Index: /trunk/src/org/openstreetmap/josm/actions/SelectByInternalPointAction.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/actions/SelectByInternalPointAction.java	(revision 8383)
+++ /trunk/src/org/openstreetmap/josm/actions/SelectByInternalPointAction.java	(revision 8384)
@@ -61,5 +61,7 @@
                     EastNorth en2 = Main.map.mapView.getProjection().latlon2eastNorth(bBox.getBottomRight());
                     double s = Math.abs((en1.east() - en2.east()) * (en1.north() - en2.north()));
-                    if (s == 0) s = 1e8;
+                    if (Double.doubleToRawLongBits(s) == 0) {
+                        s = 1e8;
+                    }
                     found.put(s, r);
                 }
Index: /trunk/src/org/openstreetmap/josm/actions/audio/AudioPlayPauseAction.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/actions/audio/AudioPlayPauseAction.java	(revision 8383)
+++ /trunk/src/org/openstreetmap/josm/actions/audio/AudioPlayPauseAction.java	(revision 8384)
@@ -14,4 +14,5 @@
 import org.openstreetmap.josm.tools.AudioPlayer;
 import org.openstreetmap.josm.tools.Shortcut;
+import org.openstreetmap.josm.tools.Utils;
 
 /**
@@ -38,5 +39,5 @@
                 AudioPlayer.play(url);
             } else if (AudioPlayer.playing()){
-                if (AudioPlayer.speed() != 1.0)
+                if (!Utils.equalsEpsilon(AudioPlayer.speed(), 1.0))
                     AudioPlayer.play(url, AudioPlayer.position());
                 else
Index: /trunk/src/org/openstreetmap/josm/actions/mapmode/DrawAction.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/actions/mapmode/DrawAction.java	(revision 8383)
+++ /trunk/src/org/openstreetmap/josm/actions/mapmode/DrawAction.java	(revision 8384)
@@ -1005,5 +1005,5 @@
             // In practice this will probably only happen when a way has been duplicated
 
-            if (u == 0)
+            if (Double.doubleToRawLongBits(u) == 0)
                 return;
 
Index: /trunk/src/org/openstreetmap/josm/actions/mapmode/PlayHeadDragMode.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/actions/mapmode/PlayHeadDragMode.java	(revision 8383)
+++ /trunk/src/org/openstreetmap/josm/actions/mapmode/PlayHeadDragMode.java	(revision 8384)
@@ -60,5 +60,5 @@
             dragging = true;
         }
-        if (p.distance(mousePos) == 0) return;
+        if (Double.doubleToRawLongBits(p.distance(mousePos)) == 0) return;
         playHeadMarker.drag(Main.map.mapView.getEastNorth(ev.getX(), ev.getY()));
         mousePos = p;
Index: /trunk/src/org/openstreetmap/josm/data/ProjectionBounds.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/data/ProjectionBounds.java	(revision 8383)
+++ /trunk/src/org/openstreetmap/josm/data/ProjectionBounds.java	(revision 8384)
@@ -3,4 +3,5 @@
 
 import org.openstreetmap.josm.data.coor.EastNorth;
+import org.openstreetmap.josm.tools.Utils;
 
 /**
@@ -25,8 +26,10 @@
         this.maxNorth = max.north();
     }
+
     public ProjectionBounds(EastNorth p) {
         this.minEast = this.maxEast = p.east();
         this.minNorth = this.maxNorth = p.north();
     }
+
     public ProjectionBounds(EastNorth center, double east, double north) {
         this.minEast = center.east()-east/2.0;
@@ -35,4 +38,5 @@
         this.maxNorth = center.north()+north/2.0;
     }
+
     public ProjectionBounds(double minEast, double minNorth, double maxEast, double maxNorth) {
         this.minEast = minEast;
@@ -41,6 +45,6 @@
         this.maxNorth = maxNorth;
     }
-    public void extend(EastNorth e)
-    {
+
+    public void extend(EastNorth e) {
         if (e.east() < minEast) {
             minEast = e.east();
@@ -56,10 +60,11 @@
         }
     }
-    public EastNorth getCenter()
-    {
+
+    public EastNorth getCenter() {
         return new EastNorth((minEast + maxEast) / 2.0, (minNorth + maxNorth) / 2.0);
     }
 
-    @Override public String toString() {
+    @Override
+    public String toString() {
         return "ProjectionBounds["+minEast+","+minNorth+","+maxEast+","+maxNorth+"]";
     }
@@ -85,5 +90,5 @@
 
     public boolean hasExtend() {
-        return minEast != maxEast || minNorth != maxNorth;
+        return !Utils.equalsEpsilon(minEast, maxEast) || !Utils.equalsEpsilon(minNorth, maxNorth);
     }
 }
Index: /trunk/src/org/openstreetmap/josm/data/coor/QuadTiling.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/data/coor/QuadTiling.java	(revision 8383)
+++ /trunk/src/org/openstreetmap/josm/data/coor/QuadTiling.java	(revision 8384)
@@ -1,4 +1,6 @@
 // License: GPL. For details, see LICENSE file.
 package org.openstreetmap.josm.data.coor;
+
+import org.openstreetmap.josm.tools.Utils;
 
 public final class QuadTiling {
@@ -68,5 +70,5 @@
     static long lon2x(double lon) {
         long ret = (long)((lon + 180.0) * WORLD_PARTS / 360.0);
-        if (ret == WORLD_PARTS) {
+        if (Utils.equalsEpsilon(ret, WORLD_PARTS)) {
             ret--;
         }
@@ -76,5 +78,5 @@
     static long lat2y(double lat) {
         long ret = (long)((lat + 90.0) * WORLD_PARTS / 180.0);
-        if (ret == WORLD_PARTS) {
+        if (Utils.equalsEpsilon(ret, WORLD_PARTS)) {
             ret--;
         }
Index: /trunk/src/org/openstreetmap/josm/data/gpx/GpxData.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/data/gpx/GpxData.java	(revision 8383)
+++ /trunk/src/org/openstreetmap/josm/data/gpx/GpxData.java	(revision 8384)
@@ -18,4 +18,5 @@
 import org.openstreetmap.josm.data.DataSource;
 import org.openstreetmap.josm.data.coor.EastNorth;
+import org.openstreetmap.josm.tools.Utils;
 
 /**
@@ -211,10 +212,11 @@
     */
     public Date[] getMinMaxTimeForAllTracks() {
-        double min=1e100, max=-1e100, t;
+        double min=1e100;
+        double max=-1e100;
         double now = System.currentTimeMillis()/1000.0;
         for (GpxTrack trk: tracks) {
             for (GpxTrackSegment seg : trk.getSegments()) {
                 for (WayPoint pnt : seg.getWayPoints()) {
-                    t = pnt.time;
+                    double t = pnt.time;
                     if (t>0 && t<=now) {
                         if (t>max) max=t;
@@ -224,6 +226,6 @@
             }
         }
-        if (min==1e100 || max==-1e100) return null;
-        return new Date[]{new Date((long) (min * 1000)), new Date((long) (max * 1000)), };
+        if (Utils.equalsEpsilon(min,1e100) || Utils.equalsEpsilon(max,-1e100)) return new Date[0];
+        return new Date[]{new Date((long) (min * 1000)), new Date((long) (max * 1000))};
     }
 
@@ -293,5 +295,5 @@
                         double C = -A * rx - B * ry;
                         double RSsq = A * A + B * B;
-                        if (RSsq == 0.0) {
+                        if (Double.doubleToRawLongBits(RSsq) == 0) {
                             continue;
                         }
Index: /trunk/src/org/openstreetmap/josm/data/imagery/ImageryInfo.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/data/imagery/ImageryInfo.java	(revision 8383)
+++ /trunk/src/org/openstreetmap/josm/data/imagery/ImageryInfo.java	(revision 8384)
@@ -948,5 +948,5 @@
     public String getToolbarName() {
         String res = name;
-        if(pixelPerDegree != 0.0) {
+        if (Double.doubleToRawLongBits(pixelPerDegree) != 0) {
             res += "#PPD="+pixelPerDegree;
         }
@@ -956,5 +956,5 @@
     public String getMenuName() {
         String res = name;
-        if(pixelPerDegree != 0.0) {
+        if (Double.doubleToRawLongBits(pixelPerDegree) != 0) {
             res += " ("+pixelPerDegree+")";
         }
Index: /trunk/src/org/openstreetmap/josm/data/imagery/OffsetBookmark.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/data/imagery/OffsetBookmark.java	(revision 8383)
+++ /trunk/src/org/openstreetmap/josm/data/imagery/OffsetBookmark.java	(revision 8384)
@@ -71,5 +71,5 @@
         res.add(String.valueOf(dx));
         res.add(String.valueOf(dy));
-        if (this.centerX != 0 || this.centerY != 0) {
+        if (Double.doubleToRawLongBits(centerX) != 0 || Double.doubleToRawLongBits(centerY) != 0) {
             res.add(String.valueOf(centerX));
             res.add(String.valueOf(centerY));
Index: /trunk/src/org/openstreetmap/josm/data/imagery/WmsCache.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/data/imagery/WmsCache.java	(revision 8383)
+++ /trunk/src/org/openstreetmap/josm/data/imagery/WmsCache.java	(revision 8384)
@@ -354,5 +354,6 @@
     private CacheEntry findEntry(ProjectionEntries projectionEntries, double pixelPerDegree, double east, double north) {
         for (CacheEntry entry: projectionEntries.entries) {
-            if (entry.pixelPerDegree == pixelPerDegree && entry.east == east && entry.north == north)
+            if (Utils.equalsEpsilon(entry.pixelPerDegree, pixelPerDegree)
+                    && Utils.equalsEpsilon(entry.east, east) && Utils.equalsEpsilon(entry.north, north))
                 return entry;
         }
Index: /trunk/src/org/openstreetmap/josm/data/osm/BBox.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/data/osm/BBox.java	(revision 8383)
+++ /trunk/src/org/openstreetmap/josm/data/osm/BBox.java	(revision 8384)
@@ -274,5 +274,6 @@
         if (o instanceof BBox) {
             BBox b = (BBox)o;
-            return b.xmax == xmax && b.ymax == ymax && b.xmin == xmin && b.ymin == ymin;
+            return Utils.equalsEpsilon(b.xmax, xmax) && Utils.equalsEpsilon(b.ymax, ymax)
+                    && Utils.equalsEpsilon(b.xmin, xmin) && Utils.equalsEpsilon(b.ymin, ymin);
         } else
             return false;
@@ -281,6 +282,5 @@
     @Override
     public String toString() {
-        return "[ x: " + xmin + " -> " + xmax +
-        ", y: " + ymin + " -> " + ymax + " ]";
+        return "[ x: " + xmin + " -> " + xmax + ", y: " + ymin + " -> " + ymax + " ]";
     }
 
Index: /trunk/src/org/openstreetmap/josm/data/osm/NodePositionComparator.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/data/osm/NodePositionComparator.java	(revision 8383)
+++ /trunk/src/org/openstreetmap/josm/data/osm/NodePositionComparator.java	(revision 8384)
@@ -26,5 +26,5 @@
             return -1;
         double dLon = n1.getCoor().lon() - n2.getCoor().lon();
-        if (dLon == 0)
+        if (Double.doubleToRawLongBits(dLon) == 0)
             return 0;
         return dLon > 0 ? 1 : -1;
Index: /trunk/src/org/openstreetmap/josm/data/osm/Storage.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/data/osm/Storage.java	(revision 8383)
+++ /trunk/src/org/openstreetmap/josm/data/osm/Storage.java	(revision 8384)
@@ -90,5 +90,5 @@
     private int size;
     private volatile int modCount = 0;
-    private float loadFactor = 0.6f;
+    private double loadFactor = 0.6d;
     private static final int DEFAULT_CAPACITY = 16;
     private final boolean safeIterator;
Index: /trunk/src/org/openstreetmap/josm/data/osm/visitor/paint/StyledMapRenderer.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/data/osm/visitor/paint/StyledMapRenderer.java	(revision 8383)
+++ /trunk/src/org/openstreetmap/josm/data/osm/visitor/paint/StyledMapRenderer.java	(revision 8384)
@@ -99,6 +99,6 @@
     private class OffsetIterator implements Iterator<Point> {
 
-        private List<Node> nodes;
-        private float offset;
+        private final List<Node> nodes;
+        private final double offset;
         private int idx;
 
@@ -110,5 +110,5 @@
         private int xPrev0, yPrev0;
 
-        public OffsetIterator(List<Node> nodes, float offset) {
+        public OffsetIterator(List<Node> nodes, double offset) {
             this.nodes = nodes;
             this.offset = offset;
@@ -123,5 +123,5 @@
         @Override
         public Point next() {
-            if (Math.abs(offset) < 0.1f) return nc.getPoint(nodes.get(idx++));
+            if (Math.abs(offset) < 0.1d) return nc.getPoint(nodes.get(idx++));
 
             Point current = nc.getPoint(nodes.get(idx));
@@ -138,46 +138,45 @@
             Point next = nc.getPoint(nodes.get(idx+1));
 
-            int dx_next = next.x - current.x;
-            int dy_next = next.y - current.y;
-            double len_next = Math.sqrt(dx_next*dx_next + dy_next*dy_next);
-
-            if (len_next == 0) {
-                len_next = 1; // value does not matter, because dy_next and dx_next is 0
-            }
-
-            int x_current0 = current.x + (int) Math.round(offset * dy_next / len_next);
-            int y_current0 = current.y - (int) Math.round(offset * dx_next / len_next);
+            int dxNext = next.x - current.x;
+            int dyNext = next.y - current.y;
+            double lenNext = Math.sqrt(dxNext*dxNext + dyNext*dyNext);
+
+            if (Double.doubleToRawLongBits(lenNext) == 0) {
+                lenNext = 1; // value does not matter, because dy_next and dx_next is 0
+            }
+
+            int xCurrent0 = current.x + (int) Math.round(offset * dyNext / lenNext);
+            int yCurrent0 = current.y - (int) Math.round(offset * dxNext / lenNext);
 
             if (idx==0) {
                 ++idx;
                 prev = current;
-                xPrev0 = x_current0;
-                yPrev0 = y_current0;
-                return new Point(x_current0, y_current0);
+                xPrev0 = xCurrent0;
+                yPrev0 = yCurrent0;
+                return new Point(xCurrent0, yCurrent0);
             } else {
-                int dx_prev = current.x - prev.x;
-                int dy_prev = current.y - prev.y;
-
-                // determine intersection of the lines parallel to the two
-                // segments
-                int det = dx_next*dy_prev - dx_prev*dy_next;
+                int dxPrev = current.x - prev.x;
+                int dyPrev = current.y - prev.y;
+
+                // determine intersection of the lines parallel to the two segments
+                int det = dxNext*dyPrev - dxPrev*dyNext;
 
                 if (det == 0) {
                     ++idx;
                     prev = current;
-                    xPrev0 = x_current0;
-                    yPrev0 = y_current0;
-                    return new Point(x_current0, y_current0);
-                }
-
-                int m = dx_next*(y_current0 - yPrev0) - dy_next*(x_current0 - xPrev0);
-
-                int cx_ = xPrev0 + Math.round((float)m * dx_prev / det);
-                int cy_ = yPrev0 + Math.round((float)m * dy_prev / det);
+                    xPrev0 = xCurrent0;
+                    yPrev0 = yCurrent0;
+                    return new Point(xCurrent0, yCurrent0);
+                }
+
+                int m = dxNext*(yCurrent0 - yPrev0) - dyNext*(xCurrent0 - xPrev0);
+
+                int cx = xPrev0 + (int) Math.round((double)m * dxPrev / det);
+                int cy = yPrev0 + (int) Math.round((double)m * dyPrev / det);
                 ++idx;
                 prev = current;
-                xPrev0 = x_current0;
-                yPrev0 = y_current0;
-                return new Point(cx_, cy_);
+                xPrev0 = xCurrent0;
+                yPrev0 = yCurrent0;
+                return new Point(cx, cy);
             }
         }
@@ -452,5 +451,5 @@
                 g.setPaint(texture);
                 Float alpha = fillImage.getAlphaFloat();
-                if (alpha != 1f) {
+                if (!Utils.equalsEpsilon(alpha, 1f)) {
                     g.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER, alpha));
                 }
@@ -602,7 +601,7 @@
             LineMetrics metrics = text.font.getLineMetrics(s, frc);
             if (bs.vAlign == VerticalTextAlignment.ABOVE) {
-                y -= - box.y + metrics.getDescent();
+                y -= -box.y + metrics.getDescent();
             } else if (bs.vAlign == VerticalTextAlignment.TOP) {
-                y -= - box.y - metrics.getAscent();
+                y -= -box.y - metrics.getAscent();
             } else if (bs.vAlign == VerticalTextAlignment.CENTER) {
                 y += (metrics.getAscent() - metrics.getDescent()) / 2;
@@ -623,8 +622,8 @@
      * @param spacing spacing between two images
      * @param phase initial spacing
-     * @param align alignment of the image. The top, center or bottom edge
-     * can be aligned with the way.
+     * @param align alignment of the image. The top, center or bottom edge can be aligned with the way.
      */
-    public void drawRepeatImage(Way way, MapImage pattern, boolean disabled, float offset, float spacing, float phase, LineImageAlignment align) {
+    public void drawRepeatImage(Way way, MapImage pattern, boolean disabled, double offset, double spacing, double phase,
+            LineImageAlignment align) {
         final int imgWidth = pattern.getWidth();
         final double repeat = imgWidth + spacing;
@@ -744,5 +743,5 @@
         float alpha = img.getAlphaFloat();
 
-        if (alpha != 1f) {
+        if (!Utils.equalsEpsilon(alpha, 1f)) {
             g.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER, alpha));
         }
@@ -999,5 +998,5 @@
 
         double fromAngle;
-        if(dx == 0.0) {
+        if (Double.doubleToRawLongBits(dx) == 0) {
             fromAngle = Math.PI/2;
         } else {
@@ -1157,5 +1156,6 @@
                 double end = longHalfSegmentEnd.get(i);
                 double dist = Math.abs(0.5 * (end + start) - 0.5 * pathLength);
-                if (longHalfsegmentQuality.get(i) > bestQuality || (dist < bestDistanceToCenter && longHalfsegmentQuality.get(i) == bestQuality)) {
+                if (longHalfsegmentQuality.get(i) > bestQuality
+                        || (dist < bestDistanceToCenter && Utils.equalsEpsilon(longHalfsegmentQuality.get(i), bestQuality))) {
                     bestStart = start;
                     bestEnd = end;
@@ -1315,5 +1315,5 @@
                     if (showHeadArrowOnly ? !it.hasNext() : showOrientation) {
                         final double segmentLength = p1.distance(p2);
-                        if (segmentLength != 0.0) {
+                        if (Double.doubleToRawLongBits(segmentLength) != 0) {
                             final double l =  (10. + line.getLineWidth()) / segmentLength;
 
@@ -1328,5 +1328,5 @@
                     if (showOneway) {
                         final double segmentLength = p1.distance(p2);
-                        if (segmentLength != 0.0) {
+                        if (Double.doubleToRawLongBits(segmentLength) != 0) {
                             final double nx = (p2.x - p1.x) / segmentLength;
                             final double ny = (p2.y - p1.y) / segmentLength;
Index: /trunk/src/org/openstreetmap/josm/data/projection/CustomProjection.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/data/projection/CustomProjection.java	(revision 8383)
+++ /trunk/src/org/openstreetmap/josm/data/projection/CustomProjection.java	(revision 8384)
@@ -342,5 +342,5 @@
         boolean isCentric = true;
         for (Double param : towgs84Param) {
-            if (param != 0.0) {
+            if (Double.doubleToRawLongBits(param) != 0) {
                 isCentric = false;
                 break;
@@ -351,5 +351,5 @@
         boolean is3Param = true;
         for (int i = 3; i<towgs84Param.size(); i++) {
-            if (towgs84Param.get(i) != 0.0) {
+            if (Double.doubleToRawLongBits(towgs84Param.get(i)) != 0) {
                 is3Param = false;
                 break;
Index: /trunk/src/org/openstreetmap/josm/data/validation/tests/DuplicateNode.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/data/validation/tests/DuplicateNode.java	(revision 8383)
+++ /trunk/src/org/openstreetmap/josm/data/validation/tests/DuplicateNode.java	(revision 8384)
@@ -59,5 +59,5 @@
                 if (coor == null)
                     return null;
-                if (precision==0)
+                if (Double.doubleToRawLongBits(precision) == 0)
                     return coor.getRoundedToOsmPrecision();
                 return roundCoord(coor);
@@ -66,5 +66,5 @@
                 if (coor == null)
                     return null;
-                if (precision==0)
+                if (Double.doubleToRawLongBits(precision) == 0)
                     return coor.getRoundedToOsmPrecision();
                 return roundCoord(coor);
Index: /trunk/src/org/openstreetmap/josm/gui/NavigatableComponent.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/gui/NavigatableComponent.java	(revision 8383)
+++ /trunk/src/org/openstreetmap/josm/gui/NavigatableComponent.java	(revision 8384)
@@ -461,5 +461,5 @@
         }
 
-        if (!newCenter.equals(center) || (scale != newScale)) {
+        if (!newCenter.equals(center) || !Utils.equalsEpsilon(scale, newScale)) {
             if (!initial) {
                 pushZoomUndo(center, scale);
@@ -484,5 +484,5 @@
             }
         }
-        if (scale != newScale) {
+        if (!Utils.equalsEpsilon(scale, newScale)) {
             double oldScale = scale;
             scale = newScale;
@@ -843,7 +843,7 @@
                     // the selected node if multiple nodes have the same
                     // coordinates (e.g. after unglue)
-                    useNtsel |= (distSq == minDistSq);
+                    useNtsel |= Utils.equalsEpsilon(distSq, minDistSq);
                 }
-                if (ntref == null && preferredRefs != null && distSq == minDistSq) {
+                if (ntref == null && preferredRefs != null && Utils.equalsEpsilon(distSq, minDistSq)) {
                     List<OsmPrimitive> ndRefs = nd.getReferrers();
                     for (OsmPrimitive ref: preferredRefs) {
Index: /trunk/src/org/openstreetmap/josm/gui/NotificationManager.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/gui/NotificationManager.java	(revision 8383)
+++ /trunk/src/org/openstreetmap/josm/gui/NotificationManager.java	(revision 8384)
@@ -357,9 +357,9 @@
             g.setColor(getBackground());
             float lineWidth = 1.4f;
-            Shape rect = new RoundRectangle2D.Float(
-                    lineWidth/2 + getInsets().left,
-                    lineWidth/2 + getInsets().top,
-                    getWidth() - lineWidth/2 - getInsets().left - getInsets().right,
-                    getHeight() - lineWidth/2 - getInsets().top - getInsets().bottom,
+            Shape rect = new RoundRectangle2D.Double(
+                    lineWidth/2d + getInsets().left,
+                    lineWidth/2d + getInsets().top,
+                    getWidth() - lineWidth/2d - getInsets().left - getInsets().right,
+                    getHeight() - lineWidth/2d - getInsets().top - getInsets().bottom,
                     20, 20);
 
Index: /trunk/src/org/openstreetmap/josm/gui/bbox/SlippyMapBBoxChooser.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/gui/bbox/SlippyMapBBoxChooser.java	(revision 8383)
+++ /trunk/src/org/openstreetmap/josm/gui/bbox/SlippyMapBBoxChooser.java	(revision 8384)
@@ -296,6 +296,6 @@
     @Override
     public void setBoundingBox(Bounds bbox) {
-        if (bbox == null || (bbox.getMinLat() == 0.0 && bbox.getMinLon() == 0.0
-                && bbox.getMaxLat() == 0.0 && bbox.getMaxLon() == 0.0)) {
+        if (bbox == null || (Double.doubleToRawLongBits(bbox.getMinLat()) == 0 && Double.doubleToRawLongBits(bbox.getMinLon()) == 0
+                && Double.doubleToRawLongBits(bbox.getMaxLat()) == 0 && Double.doubleToRawLongBits(bbox.getMaxLon()) == 0)) {
             this.bbox = null;
             iSelectionRectStart = null;
Index: /trunk/src/org/openstreetmap/josm/gui/history/CoordinateInfoViewer.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/gui/history/CoordinateInfoViewer.java	(revision 8383)
+++ /trunk/src/org/openstreetmap/josm/gui/history/CoordinateInfoViewer.java	(revision 8384)
@@ -269,10 +269,8 @@
 
             // display the coordinates
-            //
             lblLat.setText(coord != null ? coord.latToString(CoordinateFormat.DECIMAL_DEGREES) : tr("(none)"));
             lblLon.setText(coord != null ? coord.lonToString(CoordinateFormat.DECIMAL_DEGREES) : tr("(none)"));
 
             // update background color to reflect differences in the coordinates
-            //
             if (coord == oppositeCoord ||
                     (coord != null && oppositeCoord != null && coord.lat() == oppositeCoord.lat())) {
Index: /trunk/src/org/openstreetmap/josm/gui/layer/ImageryLayer.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/gui/layer/ImageryLayer.java	(revision 8383)
+++ /trunk/src/org/openstreetmap/josm/gui/layer/ImageryLayer.java	(revision 8384)
@@ -49,4 +49,5 @@
 import org.openstreetmap.josm.tools.GBC;
 import org.openstreetmap.josm.tools.ImageProvider;
+import org.openstreetmap.josm.tools.Utils;
 
 public abstract class ImageryLayer extends Layer {
@@ -143,5 +144,5 @@
                 panel.add(new UrlLabel(url), GBC.eol().insets(2, 5, 10, 0));
             }
-            if (dx != 0.0 || dy != 0.0) {
+            if (Double.doubleToRawLongBits(dx) != 0 || Double.doubleToRawLongBits(dy) != 0) {
                 panel.add(new JLabel(tr("Offset: ") + dx + ";" + dy), GBC.eol().insets(0, 5, 10, 0));
             }
@@ -208,5 +209,5 @@
             }
             JCheckBoxMenuItem item = new JCheckBoxMenuItem(new ApplyOffsetAction(b));
-            if (b.dx == dx && b.dy == dy) {
+            if (Utils.equalsEpsilon(b.dx, dx) && Utils.equalsEpsilon(b.dy, dy)) {
                 item.setSelected(true);
             }
Index: /trunk/src/org/openstreetmap/josm/gui/layer/Layer.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/gui/layer/Layer.java	(revision 8383)
+++ /trunk/src/org/openstreetmap/josm/gui/layer/Layer.java	(revision 8384)
@@ -31,4 +31,5 @@
 import org.openstreetmap.josm.tools.Destroyable;
 import org.openstreetmap.josm.tools.ImageProvider;
+import org.openstreetmap.josm.tools.Utils;
 
 /**
@@ -269,5 +270,5 @@
         boolean oldValue = isVisible();
         this.visible  = visible;
-        if (visible && opacity == 0) {
+        if (visible && Double.doubleToRawLongBits(opacity) == 0) {
             setOpacity(1);
         } else if (oldValue != isVisible()) {
@@ -281,5 +282,5 @@
      */
     public boolean isVisible() {
-        return visible && opacity != 0;
+        return visible && Double.doubleToRawLongBits(opacity) != 0;
     }
 
@@ -294,5 +295,5 @@
         boolean oldVisible = isVisible();
         this.opacity = opacity;
-        if (oldOpacity != getOpacity()) {
+        if (!Utils.equalsEpsilon(oldOpacity, getOpacity())) {
             fireOpacityChanged(oldOpacity, getOpacity());
         }
Index: /trunk/src/org/openstreetmap/josm/gui/layer/TMSLayer.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/gui/layer/TMSLayer.java	(revision 8383)
+++ /trunk/src/org/openstreetmap/josm/gui/layer/TMSLayer.java	(revision 8384)
@@ -419,5 +419,5 @@
         int screenPixels = mv.getWidth()*mv.getHeight();
         double tilePixels = Math.abs((y2-y1)*(x2-x1)*tileSource.getTileSize()*tileSource.getTileSize());
-        if (screenPixels == 0 || tilePixels == 0) return 1;
+        if (screenPixels == 0 || Double.doubleToRawLongBits(tilePixels) == 0) return 1;
         return screenPixels/tilePixels;
     }
@@ -1261,5 +1261,5 @@
         EastNorth botRight = mv.getEastNorth(mv.getWidth(), mv.getHeight());
 
-        if (botRight.east() == 0.0 || botRight.north() == 0) {
+        if (Double.doubleToRawLongBits(botRight.east()) == 0 || Double.doubleToRawLongBits(botRight.north()) == 0) {
             /*Main.debug("still initializing??");*/
             // probably still initializing
Index: /trunk/src/org/openstreetmap/josm/gui/layer/WMSLayer.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/gui/layer/WMSLayer.java	(revision 8383)
+++ /trunk/src/org/openstreetmap/josm/gui/layer/WMSLayer.java	(revision 8384)
@@ -67,4 +67,5 @@
 import org.openstreetmap.josm.io.imagery.WMSRequest;
 import org.openstreetmap.josm.tools.ImageProvider;
+import org.openstreetmap.josm.tools.Utils;
 
 /**
@@ -327,8 +328,9 @@
     }
 
-    @Override public void paint(Graphics2D g, final MapView mv, Bounds b) {
+    @Override
+    public void paint(Graphics2D g, final MapView mv, Bounds b) {
         if(info.getUrl() == null || (usesInvalidUrl && !isInvalidUrlConfirmed)) return;
 
-        if (autoResolutionEnabled && getBestZoom() != mv.getDist100Pixel()) {
+        if (autoResolutionEnabled && !Utils.equalsEpsilon(getBestZoom(), mv.getDist100Pixel())) {
             changeResolution(this, true);
         }
@@ -533,5 +535,5 @@
      */
     private int getRequestPriority(WMSRequest request) {
-        if (request.getPixelPerDegree() != info.getPixelPerDegree())
+        if (!Utils.equalsEpsilon(request.getPixelPerDegree(), info.getPixelPerDegree()))
             return -1;
         if (bminx > request.getXIndex()
Index: /trunk/src/org/openstreetmap/josm/gui/layer/geoimage/CorrelateGpxWithImages.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/gui/layer/geoimage/CorrelateGpxWithImages.java	(revision 8383)
+++ /trunk/src/org/openstreetmap/josm/gui/layer/geoimage/CorrelateGpxWithImages.java	(revision 8384)
@@ -907,5 +907,5 @@
                     // parse slider position into real timezone
                     double tz = Math.abs(sldTimezone.getValue());
-                    String zone = tz % 2 == 0
+                    String zone = Double.doubleToRawLongBits(tz % 2) == 0
                     ? (int)Math.floor(tz/2) + ":00"
                             : (int)Math.floor(tz/2) + ":30";
Index: /trunk/src/org/openstreetmap/josm/gui/layer/gpx/DateFilterPanel.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/gui/layer/gpx/DateFilterPanel.java	(revision 8383)
+++ /trunk/src/org/openstreetmap/josm/gui/layer/gpx/DateFilterPanel.java	(revision 8384)
@@ -48,6 +48,6 @@
         final Date startTime, endTime;
         Date[] bounds = layer.data.getMinMaxTimeForAllTracks();
-        startTime = (bounds==null) ? new GregorianCalendar(2000, 1, 1).getTime():bounds[0];
-        endTime = (bounds==null) ? new Date() : bounds[1];
+        startTime = (bounds.length == 0) ? new GregorianCalendar(2000, 1, 1).getTime():bounds[0];
+        endTime = (bounds.length == 0) ? new Date() : bounds[1];
 
         dateFrom.setDate(startTime);
Index: /trunk/src/org/openstreetmap/josm/gui/layer/gpx/GpxDrawHelper.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/gui/layer/gpx/GpxDrawHelper.java	(revision 8383)
+++ /trunk/src/org/openstreetmap/josm/gui/layer/gpx/GpxDrawHelper.java	(revision 8384)
@@ -280,9 +280,10 @@
         if (colored == ColorMode.TIME) {
             Date[] bounds = data.getMinMaxTimeForAllTracks();
-            if (bounds!=null) {
+            if (bounds.length >= 2) {
                 minval = bounds[0].getTime()/1000.0;
                 maxval = bounds[1].getTime()/1000.0;
             } else {
-                minval = 0; maxval=now;
+                minval = 0;
+                maxval = now;
             }
             dateScale.setRange(minval, maxval);
@@ -457,5 +458,7 @@
                     g.setColor(customColoringTransparent);
                     // hdop cirles
-                    int hdopp = mv.getPoint(new LatLon(trkPnt.getCoor().lat(), trkPnt.getCoor().lon() + 2*6*hdop*360/40000000)).x - screen.x;
+                    int hdopp = mv.getPoint(new LatLon(
+                            trkPnt.getCoor().lat(),
+                            trkPnt.getCoor().lon() + 2*6*hdop*360/40000000d)).x - screen.x;
                     g.drawArc(screen.x-hdopp/2, screen.y-hdopp/2, hdopp, hdopp, 0, 360);
                 }
Index: /trunk/src/org/openstreetmap/josm/gui/layer/markerlayer/ImageMarker.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/gui/layer/markerlayer/ImageMarker.java	(revision 8383)
+++ /trunk/src/org/openstreetmap/josm/gui/layer/markerlayer/ImageMarker.java	(revision 8384)
@@ -79,8 +79,8 @@
         int h = img.getHeight(null);
         if (w>h) {
-            h = Math.round(maxSize*((float)h/w));
+            h = (int) Math.round(maxSize*((double)h/w));
             w = maxSize;
         } else {
-            w = Math.round(maxSize*((float)w/h));
+            w = (int) Math.round(maxSize*((double)w/h));
             h = maxSize;
         }
Index: /trunk/src/org/openstreetmap/josm/gui/mappaint/Cascade.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/gui/mappaint/Cascade.java	(revision 8383)
+++ /trunk/src/org/openstreetmap/josm/gui/mappaint/Cascade.java	(revision 8384)
@@ -147,5 +147,5 @@
             return !(s.isEmpty() || "false".equals(s) || "no".equals(s) || "0".equals(s) || "0.0".equals(s));
         if (o instanceof Number)
-            return ((Number) o).floatValue() != 0.0f;
+            return Float.floatToRawIntBits(((Number) o).floatValue()) != 0;
         if (o instanceof List)
             return !((List) o).isEmpty();
Index: /trunk/src/org/openstreetmap/josm/gui/mappaint/ElemStyle.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/gui/mappaint/ElemStyle.java	(revision 8383)
+++ /trunk/src/org/openstreetmap/josm/gui/mappaint/ElemStyle.java	(revision 8384)
@@ -11,4 +11,5 @@
 import org.openstreetmap.josm.data.osm.visitor.paint.StyledMapRenderer;
 import org.openstreetmap.josm.gui.mappaint.mapcss.Instruction.RelativeFloat;
+import org.openstreetmap.josm.tools.Utils;
 
 public abstract class ElemStyle implements StyleKeys {
@@ -208,8 +209,8 @@
             return false;
         ElemStyle s = (ElemStyle) o;
-        return majorZIndex == s.majorZIndex &&
-                zIndex == s.zIndex &&
-                objectZIndex == s.objectZIndex &&
-                isModifier == s.isModifier;
+        return isModifier == s.isModifier &&
+                Utils.equalsEpsilon(majorZIndex, s.majorZIndex) &&
+                Utils.equalsEpsilon(zIndex, s.zIndex) &&
+                Utils.equalsEpsilon(objectZIndex, s.objectZIndex);
     }
 
Index: /trunk/src/org/openstreetmap/josm/gui/mappaint/LineElemStyle.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/gui/mappaint/LineElemStyle.java	(revision 8383)
+++ /trunk/src/org/openstreetmap/josm/gui/mappaint/LineElemStyle.java	(revision 8384)
@@ -335,6 +335,6 @@
             Objects.equals(dashesLine, other.dashesLine) &&
             Objects.equals(dashesBackground, other.dashesBackground) &&
-            offset == other.offset &&
-            realWidth == other.realWidth;
+            Utils.equalsEpsilon(offset, other.offset) &&
+            Utils.equalsEpsilon(realWidth, other.realWidth);
     }
 
@@ -356,9 +356,9 @@
             " realWidth=" + realWidth + " color=" + Utils.toString(color) +
             " dashed=" + Arrays.toString(line.getDashArray()) +
-            (line.getDashPhase() == 0f ? "" : " dashesOffses=" + line.getDashPhase()) +
+            (Float.floatToRawIntBits(line.getDashPhase()) == 0 ? "" : " dashesOffses=" + line.getDashPhase()) +
             " dashedColor=" + Utils.toString(dashesBackground) +
             " linejoin=" + linejoinToString(line.getLineJoin()) +
             " linecap=" + linecapToString(line.getEndCap()) +
-            (offset == 0 ? "" : " offset=" + offset) +
+            (Float.floatToRawIntBits(offset) == 0 ? "" : " offset=" + offset) +
             '}';
     }
Index: /trunk/src/org/openstreetmap/josm/gui/mappaint/RepeatImageElemStyle.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/gui/mappaint/RepeatImageElemStyle.java	(revision 8383)
+++ /trunk/src/org/openstreetmap/josm/gui/mappaint/RepeatImageElemStyle.java	(revision 8384)
@@ -7,4 +7,5 @@
 import org.openstreetmap.josm.data.osm.visitor.paint.StyledMapRenderer;
 import org.openstreetmap.josm.tools.CheckParameterUtil;
+import org.openstreetmap.josm.tools.Utils;
 
 public class RepeatImageElemStyle extends ElemStyle implements StyleKeys {
@@ -69,7 +70,7 @@
         final RepeatImageElemStyle other = (RepeatImageElemStyle) obj;
         if (!this.pattern.equals(other.pattern)) return false;
-        if (this.offset != other.offset) return false;
-        if (this.spacing != other.spacing) return false;
-        if (this.phase != other.phase) return false;
+        if (!Utils.equalsEpsilon(this.offset, other.offset)) return false;
+        if (!Utils.equalsEpsilon(this.spacing, other.spacing)) return false;
+        if (!Utils.equalsEpsilon(this.phase, other.phase)) return false;
         if (this.align != other.align) return false;
         return true;
Index: /trunk/src/org/openstreetmap/josm/gui/mappaint/StyleCache.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/gui/mappaint/StyleCache.java	(revision 8383)
+++ /trunk/src/org/openstreetmap/josm/gui/mappaint/StyleCache.java	(revision 8384)
@@ -11,4 +11,5 @@
 import org.openstreetmap.josm.data.osm.Storage;
 import org.openstreetmap.josm.tools.Pair;
+import org.openstreetmap.josm.tools.Utils;
 
 /**
@@ -164,5 +165,5 @@
             ++i;
         }
-        if (bd.get(i) == lower) {
+        if (Utils.equalsEpsilon(bd.get(i), lower)) {
             if (upper > bd.get(i+1))
                 throw new RangeViolatedError();
@@ -170,5 +171,5 @@
                 throw new AssertionError("the new range must be within a subrange that has no data");
 
-            if (bd.get(i+1) == upper) {
+            if (Utils.equalsEpsilon(bd.get(i+1), upper)) {
                 //  --|-------|--------|--
                 //   i-1      i       i+1
@@ -212,5 +213,5 @@
         if (bd.size() != data.size() + 1) throw new AssertionError();
         if (bd.get(0) != 0) throw new AssertionError();
-        if (bd.get(bd.size() - 1) != Double.POSITIVE_INFINITY) throw new AssertionError();
+        if (!Utils.equalsEpsilon(bd.get(bd.size() - 1), Double.POSITIVE_INFINITY)) throw new AssertionError();
         for (int i=0; i<data.size() - 1; ++i) {
             if (bd.get(i) >= bd.get(i + 1)) throw new AssertionError();
Index: /trunk/src/org/openstreetmap/josm/gui/mappaint/mapcss/ExpressionFactory.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/gui/mappaint/mapcss/ExpressionFactory.java	(revision 8383)
+++ /trunk/src/org/openstreetmap/josm/gui/mappaint/mapcss/ExpressionFactory.java	(revision 8384)
@@ -177,5 +177,5 @@
             float res = args[0];
             for (int i = 1; i < args.length; ++i) {
-                if (args[i] == 0.0F) {
+                if (Float.floatToRawIntBits(args[i]) == 0) {
                     return null;
                 }
Index: /trunk/src/org/openstreetmap/josm/io/NmeaReader.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/io/NmeaReader.java	(revision 8383)
+++ /trunk/src/org/openstreetmap/josm/io/NmeaReader.java	(revision 8384)
@@ -270,5 +270,5 @@
                 }
 
-                if ((latLon.lat()==0.0) && (latLon.lon()==0.0)) {
+                if (LatLon.ZERO.equals(latLon)) {
                     ps.zeroCoord++;
                     return false;
@@ -384,5 +384,5 @@
                         e[GPRMC.LENGTH_EAST.position]
                 );
-                if(latLon.lat()==0.0 && latLon.lon()==0.0) {
+                if (LatLon.ZERO.equals(latLon)) {
                     ps.zeroCoord++;
                     return false;
Index: /trunk/src/org/openstreetmap/josm/io/OsmServerWriter.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/io/OsmServerWriter.java	(revision 8383)
+++ /trunk/src/org/openstreetmap/josm/io/OsmServerWriter.java	(revision 8384)
@@ -65,14 +65,14 @@
             elapsed = 1;
         }
-        float uploads_per_ms = (float)progress / elapsed;
-        float uploads_left = list_size - progress;
-        int ms_left = (int)(uploads_left / uploads_per_ms);
-        int minutes_left = ms_left / MSECS_PER_MINUTE;
-        int seconds_left = (ms_left / MSECS_PER_SECOND) % SECONDS_PER_MINUTE ;
-        String time_left_str = Integer.toString(minutes_left) + ":";
+        double uploads_per_ms = (double)progress / elapsed;
+        double uploads_left = list_size - progress;
+        long ms_left = (long)(uploads_left / uploads_per_ms);
+        long minutes_left = ms_left / MSECS_PER_MINUTE;
+        long seconds_left = (ms_left / MSECS_PER_SECOND) % SECONDS_PER_MINUTE ;
+        String time_left_str = Long.toString(minutes_left) + ":";
         if (seconds_left < 10) {
             time_left_str += "0";
         }
-        return time_left_str + Integer.toString(seconds_left);
+        return time_left_str + Long.toString(seconds_left);
     }
 
Index: /trunk/src/org/openstreetmap/josm/io/session/SessionWriter.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/io/session/SessionWriter.java	(revision 8383)
+++ /trunk/src/org/openstreetmap/josm/io/session/SessionWriter.java	(revision 8384)
@@ -204,5 +204,5 @@
             el.setAttribute("name", layer.getName());
             el.setAttribute("visible", Boolean.toString(layer.isVisible()));
-            if (layer.getOpacity() != 1.0) {
+            if (!Utils.equalsEpsilon(layer.getOpacity(), 1.0)) {
                 el.setAttribute("opacity", Double.toString(layer.getOpacity()));
             }
Index: /trunk/src/org/openstreetmap/josm/tools/AudioPlayer.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/tools/AudioPlayer.java	(revision 8383)
+++ /trunk/src/org/openstreetmap/josm/tools/AudioPlayer.java	(revision 8384)
@@ -277,5 +277,5 @@
                             if (playingUrl != command.url() ||
                                     stateChange != State.PAUSED ||
-                                    offset != 0.0)
+                                    Double.doubleToRawLongBits(offset) != 0)
                             {
                                 if (audioInputStream != null) {
Index: /trunk/src/org/openstreetmap/josm/tools/GeoPropertyIndex.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/tools/GeoPropertyIndex.java	(revision 8383)
+++ /trunk/src/org/openstreetmap/josm/tools/GeoPropertyIndex.java	(revision 8384)
@@ -164,7 +164,9 @@
         boolean isInside(LatLon ll) {
             return bbox.getTopLeftLon() <= ll.lon() &&
-                    (ll.lon() < bbox.getBottomRightLon() || (ll.lon() == 180.0 && bbox.getBottomRightLon() == 180.0)) &&
+                    (ll.lon() < bbox.getBottomRightLon() ||
+                            (Utils.equalsEpsilon(ll.lon(), 180.0) && Utils.equalsEpsilon(bbox.getBottomRightLon(), 180.0))) &&
                     bbox.getBottomRightLat() <= ll.lat() &&
-                    (ll.lat() < bbox.getTopLeftLat() || (ll.lat() == 90.0 && bbox.getTopLeftLat() == 90.0));
+                    (ll.lat() < bbox.getTopLeftLat() ||
+                            (Utils.equalsEpsilon(ll.lat(), 90.0) && Utils.equalsEpsilon(bbox.getTopLeftLat(), 90.0)));
         }
 
Index: /trunk/src/org/openstreetmap/josm/tools/Geometry.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/tools/Geometry.java	(revision 8383)
+++ /trunk/src/org/openstreetmap/josm/tools/Geometry.java	(revision 8384)
@@ -352,5 +352,5 @@
         // Solve the equations
         double det = a1 * b2 - a2 * b1;
-        if (det == 0)
+        if (Double.doubleToRawLongBits(det) == 0)
             return null; // Lines are parallel
 
@@ -387,5 +387,6 @@
         double ldy = p2.getY() - p1.getY();
 
-        if (ldx == 0 && ldy == 0) //segment zero length
+        //segment zero length
+        if (Double.doubleToRawLongBits(ldx) == 0 && Double.doubleToRawLongBits(ldy) == 0)
             return p1;
 
@@ -829,5 +830,5 @@
             b[i] = pt1.north() - pt2.north();
             double d = Math.sqrt(a[i]*a[i] + b[i]*b[i]);
-            if(d == 0) return null;
+            if (Double.doubleToRawLongBits(d) == 0) return null;
             a[i] /= d;
             b[i] /= d;
Index: /trunk/src/org/openstreetmap/josm/tools/ImageProvider.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/tools/ImageProvider.java	(revision 8383)
+++ /trunk/src/org/openstreetmap/josm/tools/ImageProvider.java	(revision 8384)
@@ -1180,5 +1180,5 @@
         // convert rotatedAngle to an integer value from 0 to 360
         Long originalAngle = Math.round(rotatedAngle % 360);
-        if (rotatedAngle != 0 && originalAngle == 0) {
+        if (Double.doubleToRawLongBits(rotatedAngle) != 0 && originalAngle == 0) {
             originalAngle = 360L;
         }
@@ -1197,5 +1197,5 @@
                 // convert originalAngle to a value from 0 to 90
                 double angle = originalAngle % 90;
-                if (originalAngle != 0.0 && angle == 0.0) {
+                if (originalAngle != 0 && Double.doubleToRawLongBits(angle) == 0) {
                     angle = 90.0;
                 }
Index: /trunk/src/org/openstreetmap/josm/tools/Utils.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/tools/Utils.java	(revision 8383)
+++ /trunk/src/org/openstreetmap/josm/tools/Utils.java	(revision 8384)
@@ -973,5 +973,5 @@
         // Is it less than 1 minute ?
         if (elapsedTime < MILLIS_OF_MINUTE) {
-            return String.format("%.1f %s", elapsedTime / (float) MILLIS_OF_SECOND, tr("s"));
+            return String.format("%.1d %s", elapsedTime / (double) MILLIS_OF_SECOND, tr("s"));
         }
         // Is it less than 1 hour ?
