Index: trunk/src/org/openstreetmap/josm/data/Bounds.java
===================================================================
--- trunk/src/org/openstreetmap/josm/data/Bounds.java	(revision 13601)
+++ trunk/src/org/openstreetmap/josm/data/Bounds.java	(revision 13602)
@@ -355,7 +355,7 @@
     public String toShortString(DecimalFormat format) {
         return format.format(minLat) + ' '
-        + format.format(minLon) + " / "
-        + format.format(maxLat) + ' '
-        + format.format(maxLon);
+             + format.format(minLon) + " / "
+             + format.format(maxLat) + ' '
+             + format.format(maxLon);
     }
 
@@ -513,6 +513,5 @@
      */
     public double getArea() {
-        double w = getWidth();
-        return w * (maxLat - minLat);
+        return getWidth() * (maxLat - minLat);
     }
 
@@ -523,9 +522,7 @@
      */
     public String encodeAsString(String separator) {
-        StringBuilder sb = new StringBuilder();
-        sb.append(minLat).append(separator).append(minLon)
-        .append(separator).append(maxLat).append(separator)
-        .append(maxLon);
-        return sb.toString();
+        return new StringBuilder()
+          .append(minLat).append(separator).append(minLon).append(separator)
+          .append(maxLat).append(separator).append(maxLon).toString();
     }
 
@@ -574,7 +571,7 @@
         Bounds bounds = (Bounds) obj;
         return Double.compare(bounds.minLat, minLat) == 0 &&
-                Double.compare(bounds.minLon, minLon) == 0 &&
-                Double.compare(bounds.maxLat, maxLat) == 0 &&
-                Double.compare(bounds.maxLon, maxLon) == 0;
+               Double.compare(bounds.minLon, minLon) == 0 &&
+               Double.compare(bounds.maxLat, maxLat) == 0 &&
+               Double.compare(bounds.maxLon, maxLon) == 0;
     }
 }
Index: trunk/src/org/openstreetmap/josm/data/coor/conversion/LatLonParser.java
===================================================================
--- trunk/src/org/openstreetmap/josm/data/coor/conversion/LatLonParser.java	(revision 13601)
+++ trunk/src/org/openstreetmap/josm/data/coor/conversion/LatLonParser.java	(revision 13602)
@@ -50,4 +50,14 @@
     private static final Pattern P_XML = Pattern.compile(
             "lat=[\"']([+|-]?\\d+[.,]\\d+)[\"']\\s+lon=[\"']([+|-]?\\d+[.,]\\d+)[\"']");
+
+    private static final String FLOAT = "(\\d+(\\.\\d*)?)";
+    /** Degree-Minute-Second pattern **/
+    private static final String DMS = "(?<neg1>-)?"
+            + "(?=\\d)(?:(?<single>" + FLOAT + ")|"
+            + "((?<degree>" + FLOAT + ")d)?"
+            + "((?<minutes>" + FLOAT + ")\')?"
+            + "((?<seconds>" + FLOAT + ")\")?)"
+            + "(?:[NE]|(?<neg2>[SW]))?";
+    private static final Pattern P_DMS = Pattern.compile("^" + DMS + "$");
 
     private static class LatLonHolder {
@@ -199,12 +209,6 @@
      */
     public static double parseCoordinate(String angleStr) {
-        final String floatPattern = "(\\d+(\\.\\d*)?)";
         // pattern does all error handling.
-        Matcher in = Pattern.compile("^(?<neg1>-)?"
-                + "(?=\\d)(?:(?<single>" + floatPattern + ")|"
-                + "((?<degree>" + floatPattern + ")d)?"
-                + "((?<minutes>" + floatPattern + ")\')?"
-                + "((?<seconds>" + floatPattern + ")\")?)"
-                + "(?:[NE]|(?<neg2>[SW]))?$").matcher(angleStr);
+        Matcher in = P_DMS.matcher(angleStr);
 
         if (!in.find()) {
Index: trunk/src/org/openstreetmap/josm/data/projection/Projections.java
===================================================================
--- trunk/src/org/openstreetmap/josm/data/projection/Projections.java	(revision 13601)
+++ trunk/src/org/openstreetmap/josm/data/projection/Projections.java	(revision 13602)
@@ -315,9 +315,12 @@
         List<ProjectionDefinition> result = new ArrayList<>();
         Pattern epsgPattern = Pattern.compile("<(\\d+)>(.*)<>");
+        String coor = "(-?\\d+\\.\\d+)";
+        Pattern areaPattern = Pattern.compile("# area: \\(lat: "+coor+", "+coor+"\\) - \\(lon: "+coor+", "+coor+"\\).*");
         StringBuilder sb = new StringBuilder();
+        String bounds = null;
         String line;
         while ((line = r.readLine()) != null) {
             line = line.trim();
-            if (!line.isEmpty()) {
+            if (!line.isEmpty() && !line.startsWith("##")) {
                 if (!line.startsWith("#")) {
                     Matcher m = epsgPattern.matcher(line);
@@ -325,4 +328,7 @@
                         String code = "EPSG:" + m.group(1);
                         String definition = m.group(2).trim();
+                        if (!definition.contains("+bounds=") && bounds != null) {
+                            definition += bounds;
+                        }
                         result.add(new ProjectionDefinition(code, sb.toString(), definition));
                     } else {
@@ -330,9 +336,16 @@
                     }
                     sb.setLength(0);
-                } else if (!line.startsWith("# area: ")) {
+                    bounds = null;
+                } else if (line.startsWith("# area: ")) {
+                    Matcher m = areaPattern.matcher(line);
+                    if (m.matches()) {
+                        bounds = " +bounds=" + String.join(",", m.group(3), m.group(1), m.group(4), m.group(2));
+                    }
+                } else {
+                    String s = line.substring(1).trim();
                     if (sb.length() == 0) {
-                        sb.append(line.substring(1).trim());
+                        sb.append(s);
                     } else {
-                        sb.append('(').append(line.substring(1).trim()).append(')');
+                        sb.append('(').append(s).append(')');
                     }
                 }
