Index: src/org/openstreetmap/josm/actions/JumpToAction.java
===================================================================
--- src/org/openstreetmap/josm/actions/JumpToAction.java	(revision 6202)
+++ src/org/openstreetmap/josm/actions/JumpToAction.java	(working copy)
@@ -126,8 +126,8 @@
         if(!url.hasFocus()) return;
         Bounds b = OsmUrlToBounds.parse(url.getText());
         if (b != null) {
-            lat.setText(Double.toString((b.getMin().lat() + b.getMax().lat())/2));
-            lon.setText(Double.toString((b.getMin().lon() + b.getMax().lon())/2));
+            lat.setText(Double.toString((b.getMinLat() + b.getMaxLat())/2));
+            lon.setText(Double.toString((b.getMinLon() + b.getMaxLon())/2));
 
             int zoomLvl = 16;
             String[] args = url.getText().substring(url.getText().indexOf('?')+1).split("&");
Index: src/org/openstreetmap/josm/command/Command.java
===================================================================
--- src/org/openstreetmap/josm/command/Command.java	(revision 6202)
+++ src/org/openstreetmap/josm/command/Command.java	(working copy)
@@ -241,13 +241,12 @@
     }
 
     private static boolean isOutlying(OsmPrimitive osm, Area area) {
-        if (osm instanceof Node && !osm.isNewOrUndeleted()) {
+        if (osm instanceof Node && !osm.isNewOrUndeleted())
             return !((Node) osm).getCoor().isIn(area);
-        } else if (osm instanceof Way) {
+        else if (osm instanceof Way) {
             for (Node n : ((Way) osm).getNodes()) {
-                if (isOutlying(n, area)) {
+                if (isOutlying(n, area))
                     return true;
-                }
             }
             return false;
         }
Index: src/org/openstreetmap/josm/data/Bounds.java
===================================================================
--- src/org/openstreetmap/josm/data/Bounds.java	(revision 6202)
+++ src/org/openstreetmap/josm/data/Bounds.java	(working copy)
@@ -8,6 +8,7 @@
 import java.text.MessageFormat;
 
 import org.openstreetmap.josm.data.coor.LatLon;
+import org.openstreetmap.josm.data.osm.BBox;
 import org.openstreetmap.josm.tools.CheckParameterUtil;
 
 /**
@@ -26,17 +27,57 @@
         return new LatLon(minLat, minLon);
     }
 
+    /**
+     * Returns min latitude of bounds. Efficient shortcut
+     * for getMin().lat().
+     * 
+     * @return min latitude of bounds.
+     */
+    public double getMinLat() {
+        return minLat;
+    }
+
+    /**
+     * Returns min longitude of bounds. Efficient shortcut
+     * for getMin().lon().
+     * 
+     * @return min longitude of bounds.
+     */
+    public double getMinLon() {
+        return minLon;
+    }
+
     public LatLon getMax() {
         return new LatLon(maxLat, maxLon);
     }
 
+    /**
+     * Returns max latitude of bounds. Efficient shortcut
+     * for getMax().lat().
+     * 
+     * @return max latitude of bounds.
+     */
+    public double getMaxLat() {
+        return maxLat;
+    }
+
+    /**
+     * Returns max longitude of bounds. Efficient shortcut
+     * for getMax().lon().
+     * 
+     * @return max longitude of bounds.
+     */
+    public double getMaxLon() {
+        return maxLon;
+    }
+
     public enum ParseMethod {
         MINLAT_MINLON_MAXLAT_MAXLON,
         LEFT_BOTTOM_RIGHT_TOP
     }
 
     /**
-     * Construct bounds out of two points
+     * Construct bounds out of two points. Coords will be rounded.
      */
     public Bounds(LatLon min, LatLon max) {
         this(min.lat(), min.lon(), max.lat(), max.lon());
@@ -51,13 +92,25 @@
     }
 
     public Bounds(LatLon b, boolean roundToOsmPrecision) {
+        this(b.lat(), b.lon(), roundToOsmPrecision);
+    }
+    
+    /**
+     * Single point Bounds defined by point [lat,lon].
+     * Coordinates will be rounded to osm precision if <code>roundToOsmPrecision</code> is true.
+     * 
+     * @param lat latitude of given point.
+     * @param lon longitude of given point.
+     * @param roundToOsmPrecision defines if lat/lon will be rounded.
+     */
+    public Bounds(double lat, double lon, boolean roundToOsmPrecision) {
         // Do not call this(b, b) to avoid GPX performance issue (see #7028) until roundToOsmPrecision() is improved
         if (roundToOsmPrecision) {
-            this.minLat = LatLon.roundToOsmPrecision(b.lat());
-            this.minLon = LatLon.roundToOsmPrecision(b.lon());
+            this.minLat = LatLon.roundToOsmPrecision(lat);
+            this.minLon = LatLon.roundToOsmPrecision(lon);
         } else {
-            this.minLat = b.lat();
-            this.minLon = b.lon();
+            this.minLat = lat;
+            this.minLon = lon;
         }
         this.maxLat = this.minLat;
         this.maxLon = this.minLon;
@@ -152,8 +205,8 @@
         return roundToOsmPrecision ? LatLon.roundToOsmPrecision(value) : value;
     }
 
-    public Bounds(Bounds other) {
-        this(other.getMin(), other.getMax());
+    public Bounds(final Bounds other) {
+        this(other.minLat, other.minLon, other.maxLat, other.maxLon);
     }
 
     public Bounds(Rectangle2D rect) {
@@ -185,6 +238,15 @@
         this.maxLon = LatLon.roundToOsmPrecision(LatLon.toIntervalLon(center.lon() + lonExtent / 2));
     }
 
+    /**
+     * Created BBox with same coordinates.
+     * 
+     * @return BBox with same coordinates.
+     */
+    public BBox toBBox(){
+        return new BBox(minLon, minLat, maxLon, maxLat);
+    }
+    
     @Override public String toString() {
         return "Bounds["+minLat+","+minLon+","+maxLat+","+maxLon+"]";
     }
@@ -202,14 +264,15 @@
      */
     public LatLon getCenter()
     {
-        if (crosses180thMeridian()) {
-            LatLon result = new LatLon(minLat, minLon-360.0).getCenter(getMax());
-            if (result.lon() < -180.0) {
-                result = new LatLon(result.lat(), result.lon() + 360.0);
+        if (crosses180thMeridian()) {            
+            double lat = (minLat + maxLat) / 2;
+            double lon = (minLon + maxLon - 360.0) / 2;
+            if (lon < -180.0){
+                lon += 360.0;
             }
-            return result;
+            return new LatLon(lat, lon);
         } else {
-            return getMin().getCenter(getMax());
+            return new LatLon((minLat + maxLat) / 2, (minLon + maxLon) / 2);
         }
     }
 
@@ -217,33 +280,41 @@
      * Extend the bounds if necessary to include the given point.
      */
     public void extend(LatLon ll) {
-        if (ll.lat() < minLat) {
-            minLat = LatLon.roundToOsmPrecision(ll.lat());
+        extend(ll.lat(), ll.lon());
+    }
+    
+    /**
+     * Extend the bounds if necessary to include the given point [lat,lon].
+     * Good to use if you know coordinates to avoid creation of LatLon object.
+     */
+    public void extend(final double lat, final double lon) {
+        if (lat < minLat) {
+            minLat = LatLon.roundToOsmPrecision(lat);
         }
-        if (ll.lat() > maxLat) {
-            maxLat = LatLon.roundToOsmPrecision(ll.lat());
+        if (lat > maxLat) {
+            maxLat = LatLon.roundToOsmPrecision(lat);
         }
         if (crosses180thMeridian()) {
-            if (ll.lon() > maxLon && ll.lon() < minLon) {
-                if (Math.abs(ll.lon() - minLon) <= Math.abs(ll.lon() - maxLon)) {
-                    minLon = LatLon.roundToOsmPrecision(ll.lon());
+            if (lon > maxLon && lon < minLon) {
+                if (Math.abs(lon - minLon) <= Math.abs(lon - maxLon)) {
+                    minLon = LatLon.roundToOsmPrecision(lon);
                 } else {
-                    maxLon = LatLon.roundToOsmPrecision(ll.lon());
+                    maxLon = LatLon.roundToOsmPrecision(lon);
                 }
             }
         } else {
-            if (ll.lon() < minLon) {
-                minLon = LatLon.roundToOsmPrecision(ll.lon());
+            if (lon < minLon) {
+                minLon = LatLon.roundToOsmPrecision(lon);
             }
-            if (ll.lon() > maxLon) {
-                maxLon = LatLon.roundToOsmPrecision(ll.lon());
+            if (lon > maxLon) {
+                maxLon = LatLon.roundToOsmPrecision(lon);
             }
         }
     }
 
     public void extend(Bounds b) {
-        extend(b.getMin());
-        extend(b.getMax());
+        extend(b.minLat, b.minLon);
+        extend(b.maxLat, b.maxLon);
     }
 
     /**
@@ -323,7 +394,8 @@
      * @return true, if this bounds are <em>collapsed</em>
      */
     public boolean isCollapsed() {
-        return getMin().equals(getMax());
+        return (minLat == maxLat) && (minLon == maxLon);
+        //return getMin().equals(getMax());
     }
 
     public boolean isOutOfTheWorld() {
Index: src/org/openstreetmap/josm/data/coor/Coordinate.java
===================================================================
--- src/org/openstreetmap/josm/data/coor/Coordinate.java	(revision 6202)
+++ src/org/openstreetmap/josm/data/coor/Coordinate.java	(working copy)
@@ -3,6 +3,8 @@
 
 import java.io.Serializable;
 
+import org.openstreetmap.josm.data.osm.BBox;
+
 /**
  * Base class of points of both coordinate systems.
  *
@@ -88,6 +90,27 @@
         return dx*dx + dy*dy;
     }
 
+    /**
+     * Converts to single point BBox.
+     * 
+     * @return single point BBox defined by this coordinate.
+     */
+    public BBox toBBox(){
+        return new BBox(x, y);
+    }
+    
+    /**
+     * Creates bbox around this coordinate. Coordinate defines
+     * center of bbox, its edge will be 2*r.
+     * 
+     * @param r size
+     * @return BBox around this coordinate
+     */
+    public BBox toBBox(final double r){
+        return new BBox(x - r, y - r, x + r, y + r);
+    }
+    
+
     @Override
     public int hashCode() {
         final int prime = 31;
Index: src/org/openstreetmap/josm/data/coor/LatLon.java
===================================================================
--- src/org/openstreetmap/josm/data/coor/LatLon.java	(revision 6202)
+++ src/org/openstreetmap/josm/data/coor/LatLon.java	(working copy)
@@ -215,8 +215,8 @@
      */
     public boolean isOutSideWorld() {
         Bounds b = Main.getProjection().getWorldBoundsLatLon();
-        return lat() < b.getMin().lat() || lat() > b.getMax().lat() ||
-                lon() < b.getMin().lon() || lon() > b.getMax().lon();
+        return lat() < b.getMinLat() || lat() > b.getMaxLat() ||
+                lon() < b.getMinLon() || lon() > b.getMaxLon();
     }
 
     /**
Index: src/org/openstreetmap/josm/data/gpx/WayPoint.java
===================================================================
--- src/org/openstreetmap/josm/data/gpx/WayPoint.java	(revision 6202)
+++ src/org/openstreetmap/josm/data/gpx/WayPoint.java	(working copy)
@@ -50,8 +50,8 @@
      * We "inline" lat/lon, rather than usinga LatLon internally => reduces memory overhead. Relevant
      * because a lot of GPX waypoints are created when GPS tracks are downloaded from the OSM server.
      */
-    private double lat = 0;
-    private double lon = 0;
+    private final double lat;
+    private final double lon;
 
     /*
      * internal cache of projected coordinates
Index: src/org/openstreetmap/josm/data/osm/BBox.java
===================================================================
--- src/org/openstreetmap/josm/data/osm/BBox.java	(revision 6202)
+++ src/org/openstreetmap/josm/data/osm/BBox.java	(working copy)
@@ -3,7 +3,6 @@
 
 import java.util.Arrays;
 
-import org.openstreetmap.josm.data.Bounds;
 import org.openstreetmap.josm.data.coor.LatLon;
 import org.openstreetmap.josm.data.coor.QuadTiling;
 import org.openstreetmap.josm.tools.Utils;
@@ -15,14 +14,42 @@
     private double ymin = Double.POSITIVE_INFINITY;
     private double ymax = Double.NEGATIVE_INFINITY;
 
-    public BBox(Bounds bounds) {
-        add(bounds.getMin());
-        add(bounds.getMax());
+    /**
+     * Single point bbox.
+     * 
+     * @param x
+     * @param y
+     */
+    public BBox(final double x, final double y) {
+        xmax = xmin = x;
+        ymax = ymin = y;
+        sanity();
     }
 
+    /**
+     * Creates BBox defined by points <code>[lat1,lon1]</code> and <code>[la2,lon2]</code>.
+     * Result is minimal BBox containing both points. 
+     * 
+     * @param lat1 lat of first point.
+     * @param lon1 lon of first point.
+     * @param lat2 lat of second point.
+     * @param lon2 lon of second point.
+     * 
+     * @return BBox defined by given points.
+     */
+    public static BBox fromLatLonPair(final double lat1, final double lon1, final double lat2, final double lon2){
+        return new BBox(lon1, lat1, lon2, lat2);
+    }
+
+    /**
+     * BBox defined by points <code>a</code> and <code>b</code>.
+     * Result is minimal BBox containing both points.
+     * 
+     * @param a 
+     * @param b
+     */
     public BBox(LatLon a, LatLon b) {
-        add(a);
-        add(b);
+        this(a.lon(), a.lat(), b.lon(), b.lat());
     }
 
     public BBox(BBox copy) {
@@ -33,10 +60,26 @@
     }
 
     public BBox(double a_x, double a_y, double b_x, double b_y)  {
-        xmin = Math.min(a_x, b_x);
-        xmax = Math.max(a_x, b_x);
-        ymin = Math.min(a_y, b_y);
-        ymax = Math.max(a_y, b_y);
+        
+        if (a_x > b_x){
+            xmax = a_x;
+            xmin = b_x;
+        }
+        else {
+            xmax = b_x;
+            xmin = a_x;            
+        }
+        
+        if (a_y > b_y){
+            ymax = a_y;
+            ymin = b_y;
+        }
+        else {
+            ymax = b_y;
+            ymin = a_y;            
+        }
+        
+        
         sanity();
     }
 
@@ -83,16 +126,30 @@
      * Extends this bbox to include the point (x, y)
      */
     public void add(double x, double y) {
-        xmin = Math.min(xmin, x);
-        xmax = Math.max(xmax, x);
-        ymin = Math.min(ymin, y);
-        ymax = Math.max(ymax, y);
+        
+        if (x < xmin){
+            xmin = x;
+        }
+        else if (x > xmax){
+            xmax = x;
+        }
+        
+        if (y < ymin){
+            ymin = y;
+        }
+        else if (y > ymax){
+            ymax = y;
+        }
+
         sanity();
     }
 
     public void add(BBox box) {
-        add(box.getTopLeft());
-        add(box.getBottomRight());
+        xmin = Math.min(xmin, box.xmin);
+        xmax = Math.max(xmax, box.xmax);
+        ymin = Math.min(ymin, box.ymin);
+        ymax = Math.max(ymax, box.ymax);
+        sanity();
     }
 
     public void addPrimitive(OsmPrimitive primitive, double extraSpace) {
@@ -154,10 +211,26 @@
         return new LatLon(ymax, xmin);
     }
 
+    public double getTopLeftLat() {
+        return ymax;
+    }
+
+    public double getTopLeftLon() {
+        return xmin;
+    }
+
     public LatLon getBottomRight() {
         return new LatLon(ymin, xmax);
     }
 
+    public double getBottomRightLat() {
+        return ymin;
+    }
+
+    public double getBottomRightLon() {
+        return xmax;
+    }
+
     public LatLon getCenter() {
         return new LatLon(ymin + (ymax-ymin)/2.0, xmin + (xmax-xmin)/2.0);
     }
Index: src/org/openstreetmap/josm/data/osm/DatasetConsistencyTest.java
===================================================================
--- src/org/openstreetmap/josm/data/osm/DatasetConsistencyTest.java	(revision 6202)
+++ src/org/openstreetmap/josm/data/osm/DatasetConsistencyTest.java	(working copy)
@@ -80,7 +80,7 @@
             if (!n.isIncomplete() && !n.isDeleted()) {
                 LatLon c = n.getCoor();
                 if (c != null) {
-                    BBox box = new BBox(new LatLon(c.lat() - 0.0001, c.lon() - 0.0001), new LatLon(c.lat() + 0.0001, c.lon() + 0.0001));
+                    BBox box = c.toBBox(0.0001);
                     if (!dataSet.searchNodes(box).contains(n)) {
                         printError("SEARCH NODES", "%s not found using Dataset.searchNodes()", n);
                     }
Index: src/org/openstreetmap/josm/data/osm/QuadBuckets.java
===================================================================
--- src/org/openstreetmap/josm/data/osm/QuadBuckets.java	(revision 6202)
+++ src/org/openstreetmap/josm/data/osm/QuadBuckets.java	(working copy)
@@ -116,8 +116,7 @@
             LatLon bottom_left = this.coor();
             double lat = bottom_left.lat() + parent.height() / 2;
             double lon = bottom_left.lon() + parent.width() / 2;
-            LatLon top_right = new LatLon(lat, lon);
-            return new BBox(bottom_left, top_right);
+            return BBox.fromLatLonPair(bottom_left.lat(),bottom_left.lon(), lat, lon);
         }
 
         QBLevel<T> findBucket(BBox bbox) {
Index: src/org/openstreetmap/josm/data/osm/visitor/paint/StyledMapRenderer.java
===================================================================
--- src/org/openstreetmap/josm/data/osm/visitor/paint/StyledMapRenderer.java	(revision 6202)
+++ src/org/openstreetmap/josm/data/osm/visitor/paint/StyledMapRenderer.java	(working copy)
@@ -1403,7 +1403,7 @@
     @Override
     public void render(final DataSet data, boolean renderVirtualNodes, Bounds bounds) {
         //long start = System.currentTimeMillis();
-        BBox bbox = new BBox(bounds);
+        BBox bbox = bounds.toBBox();
         getSettings(renderVirtualNodes);
 
         boolean drawArea = circum <= Main.pref.getInteger("mappaint.fillareas", 10000000);
Index: src/org/openstreetmap/josm/data/osm/visitor/paint/WireframeMapRenderer.java
===================================================================
--- src/org/openstreetmap/josm/data/osm/visitor/paint/WireframeMapRenderer.java	(revision 6202)
+++ src/org/openstreetmap/josm/data/osm/visitor/paint/WireframeMapRenderer.java	(working copy)
@@ -156,7 +156,7 @@
     @SuppressWarnings("unchecked")
     @Override
     public void render(DataSet data, boolean virtual, Bounds bounds) {
-        BBox bbox = new BBox(bounds);
+        BBox bbox = bounds.toBBox();
         this.ds = data;
         getSettings(virtual);
 
Index: src/org/openstreetmap/josm/data/projection/CustomProjection.java
===================================================================
--- src/org/openstreetmap/josm/data/projection/CustomProjection.java	(revision 6202)
+++ src/org/openstreetmap/josm/data/projection/CustomProjection.java	(working copy)
@@ -123,8 +123,8 @@
             datum = WGS84Datum.INSTANCE;
             proj = new Mercator();
             bounds = new Bounds(
-                    new LatLon(-85.05112877980659, -180.0),
-                    new LatLon(85.05112877980659, 180.0), true);
+                    -85.05112877980659, -180.0,
+                    85.05112877980659, 180.0, true);
         } else {
             Map<String, String> parameters = parseParameterList(pref);
             ellps = parseEllipsoid(parameters);
Index: src/org/openstreetmap/josm/gui/BookmarkList.java
===================================================================
--- src/org/openstreetmap/josm/gui/BookmarkList.java	(revision 6202)
+++ src/org/openstreetmap/josm/gui/BookmarkList.java	(working copy)
@@ -183,10 +183,10 @@
             Bookmark b = (Bookmark)o;
             array[0] = b.getName();
             Bounds area = b.getArea();
-            array[1] = String.valueOf(area.getMin().lat());
-            array[2] = String.valueOf(area.getMin().lon());
-            array[3] = String.valueOf(area.getMax().lat());
-            array[4] = String.valueOf(area.getMax().lon());
+            array[1] = String.valueOf(area.getMinLat());
+            array[2] = String.valueOf(area.getMinLon());
+            array[3] = String.valueOf(area.getMaxLat());
+            array[4] = String.valueOf(area.getMaxLon());
             coll.add(Arrays.asList(array));
         }
         Main.pref.putArray("bookmarks", coll);
@@ -216,10 +216,10 @@
             Bounds area = b.getArea();
             StringBuffer sb = new StringBuffer();
             sb.append("<html>min[latitude,longitude]=<strong>[")
-            .append(area.getMin().lat()).append(",").append(area.getMin().lon()).append("]</strong>")
+            .append(area.getMinLat()).append(",").append(area.getMinLon()).append("]</strong>")
             .append("<br>")
             .append("max[latitude,longitude]=<strong>[")
-            .append(area.getMax().lat()).append(",").append(area.getMax().lon()).append("]</strong>")
+            .append(area.getMaxLat()).append(",").append(area.getMaxLon()).append("]</strong>")
             .append("</html>");
             return sb.toString();
 
Index: src/org/openstreetmap/josm/gui/MapView.java
===================================================================
--- src/org/openstreetmap/josm/gui/MapView.java	(revision 6202)
+++ src/org/openstreetmap/josm/gui/MapView.java	(working copy)
@@ -635,8 +635,8 @@
         // draw world borders
         tempG.setColor(Color.WHITE);
         Bounds b = getProjection().getWorldBoundsLatLon();
-        double lat = b.getMin().lat();
-        double lon = b.getMin().lon();
+        double lat = b.getMinLat();
+        double lon = b.getMinLon();
 
         Point p = getPoint(b.getMin());
 
@@ -655,13 +655,13 @@
             p = getPoint(new LatLon(lat, lon >= max ? max : lon));
             path.lineTo(p.x, p.y);
         }
-        lon = max; max = b.getMin().lat();
+        lon = max; max = b.getMinLat();
         for(; lat >= max; lat -= 1.0)
         {
             p = getPoint(new LatLon(lat <= max ? max : lat, lon));
             path.lineTo(p.x, p.y);
         }
-        lat = max; max = b.getMin().lon();
+        lat = max; max = b.getMinLon();
         for(; lon >= max; lon -= 1.0)
         {
             p = getPoint(new LatLon(lat, lon <= max ? max : lon));
Index: src/org/openstreetmap/josm/gui/NavigatableComponent.java
===================================================================
--- src/org/openstreetmap/josm/gui/NavigatableComponent.java	(revision 6202)
+++ src/org/openstreetmap/josm/gui/NavigatableComponent.java	(working copy)
@@ -200,9 +200,9 @@
 
     private EastNorth calculateDefaultCenter() {
         Bounds b = Main.getProjection().getWorldBoundsLatLon();
-        double lat = (b.getMax().lat() + b.getMin().lat())/2;
-        double lon = (b.getMax().lon() + b.getMin().lon())/2;
-
+        double lat = (b.getMaxLat() + b.getMinLat())/2;
+        double lon = (b.getMaxLon() + b.getMinLon())/2;
+        // is it correct? b.getCenter() makes some adjustments... 
         return Main.getProjection().latlon2eastNorth(new LatLon(lat, lon));
     }
 
@@ -400,25 +400,25 @@
         boolean changed = false;
         double lat = cl.lat();
         double lon = cl.lon();
-        if(lat < b.getMin().lat()) {changed = true; lat = b.getMin().lat(); }
-        else if(lat > b.getMax().lat()) {changed = true; lat = b.getMax().lat(); }
-        if(lon < b.getMin().lon()) {changed = true; lon = b.getMin().lon(); }
-        else if(lon > b.getMax().lon()) {changed = true; lon = b.getMax().lon(); }
+        if(lat < b.getMinLat()) {changed = true; lat = b.getMinLat(); }
+        else if(lat > b.getMaxLat()) {changed = true; lat = b.getMaxLat(); }
+        if(lon < b.getMinLon()) {changed = true; lon = b.getMinLon(); }
+        else if(lon > b.getMaxLon()) {changed = true; lon = b.getMaxLon(); }
         if(changed) {
             newCenter = Projections.project(new LatLon(lat,lon));
         }
         int width = getWidth()/2;
         int height = getHeight()/2;
-        LatLon l1 = new LatLon(b.getMin().lat(), lon);
-        LatLon l2 = new LatLon(b.getMax().lat(), lon);
+        LatLon l1 = new LatLon(b.getMinLat(), lon);
+        LatLon l2 = new LatLon(b.getMaxLat(), lon);
         EastNorth e1 = getProjection().latlon2eastNorth(l1);
         EastNorth e2 = getProjection().latlon2eastNorth(l2);
         double d = e2.north() - e1.north();
         if(d < height*newScale)
         {
             double newScaleH = d/height;
-            e1 = getProjection().latlon2eastNorth(new LatLon(lat, b.getMin().lon()));
-            e2 = getProjection().latlon2eastNorth(new LatLon(lat, b.getMax().lon()));
+            e1 = getProjection().latlon2eastNorth(new LatLon(lat, b.getMinLon()));
+            e2 = getProjection().latlon2eastNorth(new LatLon(lat, b.getMaxLon()));
             d = e2.east() - e1.east();
             if(d < width*newScale) {
                 newScale = Math.max(newScaleH, d/width);
Index: src/org/openstreetmap/josm/gui/bbox/SlippyMapBBoxChooser.java
===================================================================
--- src/org/openstreetmap/josm/gui/bbox/SlippyMapBBoxChooser.java	(revision 6202)
+++ src/org/openstreetmap/josm/gui/bbox/SlippyMapBBoxChooser.java	(working copy)
@@ -352,8 +352,8 @@
      */
     @Override
     public void setBoundingBox(Bounds bbox) {
-        if (bbox == null || (bbox.getMin().lat() == 0.0 && bbox.getMin().lon() == 0.0
-                && bbox.getMax().lat() == 0.0 && bbox.getMax().lon() == 0.0)) {
+        if (bbox == null || (bbox.getMinLat() == 0.0 && bbox.getMinLon() == 0.0
+                && bbox.getMaxLat() == 0.0 && bbox.getMaxLon() == 0.0)) {
             this.bbox = null;
             iSelectionRectStart = null;
             iSelectionRectEnd = null;
@@ -362,15 +362,15 @@
         }
 
         this.bbox = bbox;
-        double minLon = bbox.getMin().lon();
-        double maxLon = bbox.getMax().lon();
+        double minLon = bbox.getMinLon();
+        double maxLon = bbox.getMaxLon();
 
         if (bbox.crosses180thMeridian()) {
             minLon -= 360.0;
         }
 
-        int y1 = OsmMercator.LatToY(bbox.getMin().lat(), MAX_ZOOM);
-        int y2 = OsmMercator.LatToY(bbox.getMax().lat(), MAX_ZOOM);
+        int y1 = OsmMercator.LatToY(bbox.getMinLat(), MAX_ZOOM);
+        int y2 = OsmMercator.LatToY(bbox.getMaxLat(), MAX_ZOOM);
         int x1 = OsmMercator.LonToX(minLon, MAX_ZOOM);
         int x2 = OsmMercator.LonToX(maxLon, MAX_ZOOM);
 
@@ -378,8 +378,8 @@
         iSelectionRectEnd = new Point(Math.max(x1, x2), Math.max(y1, y2));
 
         // calc the screen coordinates for the new selection rectangle
-        MapMarkerDot xmin_ymin = new MapMarkerDot(bbox.getMin().lat(), bbox.getMin().lon());
-        MapMarkerDot xmax_ymax = new MapMarkerDot(bbox.getMax().lat(), bbox.getMax().lon());
+        MapMarkerDot xmin_ymin = new MapMarkerDot(bbox.getMinLat(), bbox.getMinLon());
+        MapMarkerDot xmax_ymax = new MapMarkerDot(bbox.getMaxLat(), bbox.getMaxLon());
 
         Vector<MapMarker> marker = new Vector<MapMarker>(2);
         marker.add(xmin_ymin);
Index: src/org/openstreetmap/josm/gui/bbox/TileSelectionBBoxChooser.java
===================================================================
--- src/org/openstreetmap/josm/gui/bbox/TileSelectionBBoxChooser.java	(revision 6202)
+++ src/org/openstreetmap/josm/gui/bbox/TileSelectionBBoxChooser.java	(working copy)
@@ -152,8 +152,8 @@
         if (bbox == null) return;
 
         // calc the screen coordinates for the new selection rectangle
-        MapMarkerDot xmin_ymin = new MapMarkerDot(bbox.getMin().lat(), bbox.getMin().lon());
-        MapMarkerDot xmax_ymax = new MapMarkerDot(bbox.getMax().lat(), bbox.getMax().lon());
+        MapMarkerDot xmin_ymin = new MapMarkerDot(bbox.getMinLat(), bbox.getMinLon());
+        MapMarkerDot xmax_ymax = new MapMarkerDot(bbox.getMaxLat(), bbox.getMaxLon());
 
         Vector<MapMarker> marker = new Vector<MapMarker>(2);
         marker.add(xmin_ymin);
@@ -341,12 +341,12 @@
             TileBounds tb = new TileBounds();
             tb.zoomLevel = (Integer) spZoomLevel.getValue();
             tb.min = new Point(
-                    Math.max(0,lonToTileX(tb.zoomLevel, bbox.getMin().lon())),
-                    Math.max(0,latToTileY(tb.zoomLevel, bbox.getMax().lat()-.00001))
+                    Math.max(0,lonToTileX(tb.zoomLevel, bbox.getMinLon())),
+                    Math.max(0,latToTileY(tb.zoomLevel, bbox.getMaxLat() - 0.00001))
             );
             tb.max = new Point(
-                    Math.max(0,lonToTileX(tb.zoomLevel, bbox.getMax().lon())),
-                    Math.max(0,latToTileY(tb.zoomLevel, bbox.getMin().lat()-.00001))
+                    Math.max(0,lonToTileX(tb.zoomLevel, bbox.getMaxLon())),
+                    Math.max(0,latToTileY(tb.zoomLevel, bbox.getMinLat() - 0.00001))
             );
             doFireTileBoundChanged = false;
             setTileBounds(tb);
@@ -681,10 +681,10 @@
                 min = null;
                 max = null;
             } else {
-                int y1 = OsmMercator.LatToY(bbox.getMin().lat(), MAX_ZOOM);
-                int y2 = OsmMercator.LatToY(bbox.getMax().lat(), MAX_ZOOM);
-                int x1 = OsmMercator.LonToX(bbox.getMin().lon(), MAX_ZOOM);
-                int x2 = OsmMercator.LonToX(bbox.getMax().lon(), MAX_ZOOM);
+                int y1 = OsmMercator.LatToY(bbox.getMinLat(), MAX_ZOOM);
+                int y2 = OsmMercator.LatToY(bbox.getMaxLat(), MAX_ZOOM);
+                int x1 = OsmMercator.LonToX(bbox.getMinLon(), MAX_ZOOM);
+                int x2 = OsmMercator.LonToX(bbox.getMaxLon(), MAX_ZOOM);
 
                 min = new Point(Math.min(x1, x2), Math.min(y1, y2));
                 max = new Point(Math.max(x1, x2), Math.max(y1, y2));
Index: src/org/openstreetmap/josm/gui/download/BookmarkSelection.java
===================================================================
--- src/org/openstreetmap/josm/gui/download/BookmarkSelection.java	(revision 6202)
+++ src/org/openstreetmap/josm/gui/download/BookmarkSelection.java	(working copy)
@@ -22,7 +22,6 @@
 
 import org.openstreetmap.josm.Main;
 import org.openstreetmap.josm.data.Bounds;
-import org.openstreetmap.josm.data.osm.BBox;
 import org.openstreetmap.josm.gui.BookmarkList;
 import org.openstreetmap.josm.gui.BookmarkList.Bookmark;
 import org.openstreetmap.josm.gui.JMultilineLabel;
@@ -153,7 +152,7 @@
             lblCurrentDownloadArea.setText(tr("<html>There is currently no download area selected.</html>"));
         } else {
             lblCurrentDownloadArea.setText(tr("<html><strong>Current download area</strong> (minlon, minlat, maxlon, maxlat): </html>"));
-            bboxDisplay.setText(new BBox(currentArea).toStringCSV(","));
+            bboxDisplay.setText(currentArea.toBBox().toStringCSV(","));
         }
     }
 
Index: src/org/openstreetmap/josm/gui/download/PlaceSelection.java
===================================================================
--- src/org/openstreetmap/josm/gui/download/PlaceSelection.java	(revision 6202)
+++ src/org/openstreetmap/josm/gui/download/PlaceSelection.java	(working copy)
@@ -241,8 +241,8 @@
                     currentResult.lon = Double.parseDouble(atts.getValue("lon"));
                     String[] bbox = atts.getValue("boundingbox").split(",");
                     currentResult.bounds = new Bounds(
-                            new LatLon(Double.parseDouble(bbox[0]), Double.parseDouble(bbox[2])),
-                            new LatLon(Double.parseDouble(bbox[1]), Double.parseDouble(bbox[3])));
+                            Double.parseDouble(bbox[0]), Double.parseDouble(bbox[2]),
+                            Double.parseDouble(bbox[1]), Double.parseDouble(bbox[3]));
                     data.add(currentResult);
                 }
             } catch (NumberFormatException x) {
Index: src/org/openstreetmap/josm/gui/preferences/imagery/ImageryPreference.java
===================================================================
--- src/org/openstreetmap/josm/gui/preferences/imagery/ImageryPreference.java	(revision 6202)
+++ src/org/openstreetmap/josm/gui/preferences/imagery/ImageryPreference.java	(working copy)
@@ -398,8 +398,8 @@
                         if (defaultTable.getSelectionModel().isSelectedIndex(i)) {
                             if (!mapRectangles.containsKey(i)) {
                                 // Add new map rectangle
-                                Coordinate topLeft = new Coordinate(bounds.getMax().lat(), bounds.getMin().lon());
-                                Coordinate bottomRight = new Coordinate(bounds.getMin().lat(), bounds.getMax().lon());
+                                Coordinate topLeft = new Coordinate(bounds.getMaxLat(), bounds.getMinLon());
+                                Coordinate bottomRight = new Coordinate(bounds.getMinLat(), bounds.getMaxLon());
                                 MapRectangle rectangle = new MapRectangleImpl(topLeft, bottomRight);
                                 mapRectangles.put(i, rectangle);
                                 defaultMap.addMapRectangle(rectangle);
Index: src/org/openstreetmap/josm/io/BoundingBoxDownloader.java
===================================================================
--- src/org/openstreetmap/josm/io/BoundingBoxDownloader.java	(revision 6202)
+++ src/org/openstreetmap/josm/io/BoundingBoxDownloader.java	(working copy)
@@ -25,10 +25,10 @@
     protected final boolean crosses180th;
 
     public BoundingBoxDownloader(Bounds downloadArea) {
-        this.lat1 = downloadArea.getMin().lat();
-        this.lon1 = downloadArea.getMin().lon();
-        this.lat2 = downloadArea.getMax().lat();
-        this.lon2 = downloadArea.getMax().lon();
+        this.lat1 = downloadArea.getMinLat();
+        this.lon1 = downloadArea.getMinLon();
+        this.lat2 = downloadArea.getMaxLat();
+        this.lon2 = downloadArea.getMaxLon();
         this.crosses180th = downloadArea.crosses180thMeridian();
     }
 
Index: src/org/openstreetmap/josm/io/GpxWriter.java
===================================================================
--- src/org/openstreetmap/josm/io/GpxWriter.java	(revision 6202)
+++ src/org/openstreetmap/josm/io/GpxWriter.java	(working copy)
@@ -156,8 +156,8 @@
 
         Bounds bounds = data.recalculateBounds();
         if (bounds != null) {
-            String b = "minlat=\"" + bounds.getMin().lat() + "\" minlon=\"" + bounds.getMin().lon() +
-            "\" maxlat=\"" + bounds.getMax().lat() + "\" maxlon=\"" + bounds.getMax().lon() + "\"" ;
+            String b = "minlat=\"" + bounds.getMinLat() + "\" minlon=\"" + bounds.getMinLon() +
+            "\" maxlat=\"" + bounds.getMaxLat() + "\" maxlon=\"" + bounds.getMaxLon() + "\"" ;
             inline("bounds", b);
         }
 
Index: src/org/openstreetmap/josm/io/OsmWriter.java
===================================================================
--- src/org/openstreetmap/josm/io/OsmWriter.java	(revision 6202)
+++ src/org/openstreetmap/josm/io/OsmWriter.java	(working copy)
@@ -162,10 +162,10 @@
     public void writeDataSources(DataSet ds) {
         for (DataSource s : ds.dataSources) {
             out.println("  <bounds minlat='"
-                    + s.bounds.getMin().lat()+"' minlon='"
-                    + s.bounds.getMin().lon()+"' maxlat='"
-                    + s.bounds.getMax().lat()+"' maxlon='"
-                    + s.bounds.getMax().lon()
+                    + s.bounds.getMinLat()+"' minlon='"
+                    + s.bounds.getMinLon()+"' maxlat='"
+                    + s.bounds.getMaxLat()+"' maxlon='"
+                    + s.bounds.getMaxLon()
                     +"' origin='"+XmlWriter.encode(s.origin)+"' />");
         }
     }
Index: src/org/openstreetmap/josm/io/remotecontrol/handler/LoadAndZoomHandler.java
===================================================================
--- src/org/openstreetmap/josm/io/remotecontrol/handler/LoadAndZoomHandler.java	(revision 6202)
+++ src/org/openstreetmap/josm/io/remotecontrol/handler/LoadAndZoomHandler.java	(working copy)
@@ -158,7 +158,7 @@
             });
         }
 
-        final Bounds bbox = new Bounds(new LatLon(minlat, minlon), new LatLon(maxlat, maxlon));
+        final Bounds bbox = new Bounds(minlat, minlon, maxlat, maxlon);
         if (args.containsKey("select") && PermissionPrefWithDefault.CHANGE_SELECTION.isAllowed()) {
             // select objects after downloading, zoom to selection.
             GuiHelper.executeByMainWorkerInEDT(new Runnable() {
Index: src/org/openstreetmap/josm/tools/OsmUrlToBounds.java
===================================================================
--- src/org/openstreetmap/josm/tools/OsmUrlToBounds.java	(revision 6202)
+++ src/org/openstreetmap/josm/tools/OsmUrlToBounds.java	(working copy)
@@ -49,18 +49,14 @@
             if (map.containsKey("bbox")) {
                 String[] bbox = map.get("bbox").split(",");
                 b = new Bounds(
-                        new LatLon(Double.parseDouble(bbox[1]), Double.parseDouble(bbox[0])),
-                        new LatLon(Double.parseDouble(bbox[3]), Double.parseDouble(bbox[2])));
+                        Double.parseDouble(bbox[1]), Double.parseDouble(bbox[0]),
+                        Double.parseDouble(bbox[3]), Double.parseDouble(bbox[2]));
             } else if (map.containsKey("minlat")) {
-                String s = map.get("minlat");
-                Double minlat = Double.parseDouble(s);
-                s = map.get("minlon");
-                Double minlon = Double.parseDouble(s);
-                s = map.get("maxlat");
-                Double maxlat = Double.parseDouble(s);
-                s = map.get("maxlon");
-                Double maxlon = Double.parseDouble(s);
-                b = new Bounds(new LatLon(minlat, minlon), new LatLon(maxlat, maxlon));
+                double minlat = Double.parseDouble(map.get("minlat"));
+                double minlon = Double.parseDouble(map.get("minlon"));
+                double maxlat = Double.parseDouble(map.get("maxlat"));
+                double maxlon = Double.parseDouble(map.get("maxlon"));
+                b = new Bounds(minlat, minlon, maxlat, maxlon);
             } else {
                 String z = map.get("zoom");
                 b = positionToBounds(parseDouble(map, "lat"),
@@ -233,9 +229,9 @@
      */
     static public int getZoom(Bounds b) {
         // convert to mercator (for calculation of zoom only)
-        double latMin = Math.log(Math.tan(Math.PI/4.0+b.getMin().lat()/180.0*Math.PI/2.0))*180.0/Math.PI;
-        double latMax = Math.log(Math.tan(Math.PI/4.0+b.getMax().lat()/180.0*Math.PI/2.0))*180.0/Math.PI;
-        double size = Math.max(Math.abs(latMax-latMin), Math.abs(b.getMax().lon()-b.getMin().lon()));
+        double latMin = Math.log(Math.tan(Math.PI/4.0+b.getMinLat()/180.0*Math.PI/2.0))*180.0/Math.PI;
+        double latMax = Math.log(Math.tan(Math.PI/4.0+b.getMaxLat()/180.0*Math.PI/2.0))*180.0/Math.PI;
+        double size = Math.max(Math.abs(latMax-latMin), Math.abs(b.getMaxLon()-b.getMinLon()));
         int zoom = 0;
         while (zoom <= 20) {
             if (size >= 180) {
Index: test/unit/org/openstreetmap/josm/data/projection/ProjectionRegressionTest.java
===================================================================
--- test/unit/org/openstreetmap/josm/data/projection/ProjectionRegressionTest.java	(revision 6202)
+++ test/unit/org/openstreetmap/josm/data/projection/ProjectionRegressionTest.java	(working copy)
@@ -102,8 +102,8 @@
                 lat = prev.ll.lat();
                 lon = prev.ll.lon();
             } else {
-                lat = b.getMin().lat() + rand.nextDouble() * (b.getMax().lat() - b.getMin().lat());
-                lon = b.getMin().lon() + rand.nextDouble() * (b.getMax().lon() - b.getMin().lon());
+                lat = b.getMinLat() + rand.nextDouble() * (b.getMaxLat() - b.getMinLat());
+                lon = b.getMinLon() + rand.nextDouble() * (b.getMaxLon() - b.getMinLon());
             }
             EastNorth en = proj.latlon2eastNorth(new LatLon(lat, lon));
             LatLon ll2 = proj.eastNorth2latlon(en);
Index: test/unit/org/openstreetmap/josm/data/projection/ProjectionTest.java
===================================================================
--- test/unit/org/openstreetmap/josm/data/projection/ProjectionTest.java	(revision 6202)
+++ test/unit/org/openstreetmap/josm/data/projection/ProjectionTest.java	(working copy)
@@ -67,8 +67,8 @@
             text += String.format("*** %s %s\n", p.toString(), p.toCode());
             for (int num=0; num < 1000; ++num) {
     
-                double lat = rand.nextDouble() * (b.getMax().lat() - b.getMin().lat()) + b.getMin().lat();
-                double lon = rand.nextDouble() * (b.getMax().lon() - b.getMin().lon()) + b.getMin().lon();
+                double lat = rand.nextDouble() * (b.getMaxLat() - b.getMinLat()) + b.getMinLat();
+                double lon = rand.nextDouble() * (b.getMaxLon() - b.getMinLon()) + b.getMinLon();
     
                 LatLon ll = new LatLon(lat, lon);
     
