Index: applications/editors/josm/plugins/poly/src/poly/PolyExporter.java
===================================================================
--- applications/editors/josm/plugins/poly/src/poly/PolyExporter.java	(revision 28745)
+++ applications/editors/josm/plugins/poly/src/poly/PolyExporter.java	(revision 28755)
@@ -9,4 +9,5 @@
 import java.util.ArrayList;
 import java.util.Comparator;
+import java.util.LinkedHashMap;
 import java.util.List;
 import java.util.Locale;
@@ -40,5 +41,5 @@
             try {
                 DataSet ds = ((OsmDataLayer)layer).data;
-                Map<Way, Boolean> ways = new TreeMap<Way, Boolean>(new AreaComparator());
+                Map<Way, Boolean> ways = new TreeMap<Way, Boolean>();
                 String polygonName = file.getName();
                 if( polygonName.indexOf('.') > 0 )
@@ -46,16 +47,5 @@
                 for( Way w : ds.getWays() ) {
                     if( w.isClosed() ) {
-                        boolean outer = true;
-                        for( OsmPrimitive p : w.getReferrers() ) {
-                            if( p instanceof Relation && ((Relation)p).isMultipolygon() ) {
-                                for( RelationMember m : ((Relation)p).getMembers() ) {
-                                    if( m.refersTo(w) && "inner".equals(m.getRole()) ) {
-                                        outer = false;
-                                        break;
-                                    }
-                                }
-                            }
-                            if( !outer ) break;
-                        }
+                        boolean outer = isOuter(w);
                         ways.put(w, outer);
                         if( w.hasKey("name") )
@@ -63,4 +53,5 @@
                     }
                 }
+                ways = sortOuterInner(ways);
 
                 int counter = 1;
@@ -70,8 +61,8 @@
                     if( !ways.get(w) )
                         writer.write('!');
-                    writer.write(w.hasKey("ref") ? w.get("ref") : String.valueOf(counter++));
+                    writer.write(String.valueOf(counter++));
                     writer.newLine();
                     for( Node n : w.getNodes() ) {
-                        writer.write(String.format(Locale.ENGLISH, "   %E   %E", n.getCoor().lon(), n.getCoor().lat()));
+                        writer.write(String.format(Locale.ENGLISH, "   %f   %f", n.getCoor().lon(), n.getCoor().lat()));
                         writer.newLine();
                     }
@@ -87,16 +78,30 @@
     }
 
-    private class AreaComparator implements Comparator<Way> {
-        @Override
-        public int compare( Way w1, Way w2 ) {
-            if( w1.hasKey("ref") && !w2.hasKey("ref") )
-                return -1;
-            else if( !w1.hasKey("ref") && w2.hasKey("ref") )
-                return 1;
-            else if( w1.hasKey("ref") && w2.hasKey("ref") && !w1.get("ref").equals(w2.get("ref")) )
-                return w1.get("ref").compareTo(w2.get("ref"));
+    private boolean isOuter( Way w ) {
+        for( OsmPrimitive p : w.getReferrers() ) {
+            if( p instanceof Relation && ((Relation)p).isMultipolygon() ) {
+                for( RelationMember m : ((Relation)p).getMembers() ) {
+                    if( m.refersTo(w) && "inner".equals(m.getRole()) ) {
+                        return false;
+                    }
+                }
+            }
+        }
+        return true;
+    }
+
+    private Map<Way, Boolean> sortOuterInner( Map<Way, Boolean> ways ) {
+        LinkedHashMap<Way, Boolean> result = new LinkedHashMap<Way, Boolean>(ways.size());
+        List<Way> inner = new ArrayList<Way>();
+        for( Way w : ways.keySet() ) {
+            Boolean outer = ways.get(w);
+            if( outer )
+                result.put(w, outer);
             else
-                return w1.compareTo(w2);
+                inner.add(w);
         }
+        for( Way w : inner )
+            result.put(w, Boolean.FALSE);
+        return result;
     }
 }
Index: applications/editors/josm/plugins/poly/src/poly/PolyImporter.java
===================================================================
--- applications/editors/josm/plugins/poly/src/poly/PolyImporter.java	(revision 28745)
+++ applications/editors/josm/plugins/poly/src/poly/PolyImporter.java	(revision 28755)
@@ -7,4 +7,6 @@
 import java.util.ArrayList;
 import java.util.List;
+import javax.swing.JOptionPane;
+import org.openstreetmap.josm.Main;
 import org.openstreetmap.josm.data.coor.LatLon;
 
@@ -73,4 +75,5 @@
         Area area = null;
         boolean parsingSection = false;
+        int fixedCoords = 0;
         while(true) {
             String line;
@@ -117,10 +120,23 @@
                         throw new IllegalDataException(tr("A polygon coordinate line must contain exactly 2 numbers"));
                     LatLon coord = new LatLon(coords[1], coords[0]);
-                    if( !coord.isValid() )
-                        throw new IllegalDataException(tr("Invalid coordinates were found: {0}, {1}", coord.lat(), coord.lon()));
+                    if( !coord.isValid() ) {
+                        // fix small deviations
+                        double lat = coord.lat();
+                        double lon = coord.lon();
+                        if( lon < -180.0 && lon> -185.0 ) lon = -180.0;
+                        if( lon > 180.0 && lon < 185.0 ) lon = 180.0;
+                        if( lat < -90.0 && lat > -95.0 ) lat = -90.0;
+                        if( lat > 90.0 && lat < 95.0 ) lat = 90.0;
+                        fixedCoords++;
+                        coord = new LatLon(lat, lon);
+                        if( !coord.isValid() )
+                            throw new IllegalDataException(tr("Invalid coordinates were found: {0}, {1}", coord.lat(), coord.lon()));
+                    }
                     area.addNode(coord);
                 }
             }
         }
+        if( fixedCoords > 0 )
+            JOptionPane.showMessageDialog(Main.parent, tr("{0} points were outside world bounds and were moved", fixedCoords), "Import poly", JOptionPane.WARNING_MESSAGE);
         return areas;
     }
@@ -195,5 +211,4 @@
             }
             way.addNode(way.getNode(0));
-            way.put("ref", name);
             if( polygonName != null )
                 way.put("name", polygonName);
