Index: src/org/openstreetmap/josm/data/SystemOfMeasurement.java
===================================================================
--- src/org/openstreetmap/josm/data/SystemOfMeasurement.java	(revision 16786)
+++ src/org/openstreetmap/josm/data/SystemOfMeasurement.java	(working copy)
@@ -74,9 +74,9 @@
      * Known systems of measurement.
      * @since 3406
      */
-    public static final Map<String, SystemOfMeasurement> ALL_SYSTEMS = Collections.unmodifiableMap(
+    public static final Map<String, SystemOfMeasurement> ALL_SYSTEMS =
             Stream.of(METRIC, CHINESE, IMPERIAL, NAUTICAL_MILE)
-            .collect(Collectors.toMap(SystemOfMeasurement::getName, Function.identity())));
+            .collect(Collectors.toMap(SystemOfMeasurement::getName, Function.identity()));
 
     /**
      * Preferences entry for system of measurement.
Index: src/org/openstreetmap/josm/data/osm/DataSet.java
===================================================================
--- src/org/openstreetmap/josm/data/osm/DataSet.java	(revision 16786)
+++ src/org/openstreetmap/josm/data/osm/DataSet.java	(working copy)
@@ -333,6 +333,20 @@
         checkModifiable();
         this.version = version;
     }
+    
+    private double scale = 1;
+    
+    @Override
+    public double getScale() {
+        return scale;
+    }
+    
+    @Override
+    public void setScale(double scale) {
+        if (scale > 0) {
+            this.scale = scale;
+        }
+    }
 
     @Override
     public DownloadPolicy getDownloadPolicy() {
Index: src/org/openstreetmap/josm/data/osm/OsmData.java
===================================================================
--- src/org/openstreetmap/josm/data/osm/OsmData.java	(revision 16786)
+++ src/org/openstreetmap/josm/data/osm/OsmData.java	(working copy)
@@ -35,6 +35,10 @@
      * @return the API version this dataset was created from. May be null.
      */
     String getVersion();
+    
+    double getScale();
+    
+    void setScale(double scale);
 
     /**
      * Returns the name of this data set (optional).
Index: src/org/openstreetmap/josm/io/AbstractReader.java
===================================================================
--- src/org/openstreetmap/josm/io/AbstractReader.java	(revision 16786)
+++ src/org/openstreetmap/josm/io/AbstractReader.java	(working copy)
@@ -390,6 +390,18 @@
             ds.lock();
         }
     }
+    
+    protected final void parseScale(String scale) {
+        if (scale != null) {
+            double sc = 1;
+            try {
+                sc = Double.parseDouble(scale);
+            } catch (NumberFormatException e) {
+                sc = 1;
+            }
+            ds.setScale(sc);
+        }
+    }
 
     protected final void parseBounds(String generator, String minlon, String minlat, String maxlon, String maxlat, String origin)
             throws IllegalDataException {
Index: src/org/openstreetmap/josm/io/OsmReader.java
===================================================================
--- src/org/openstreetmap/josm/io/OsmReader.java	(revision 16786)
+++ src/org/openstreetmap/josm/io/OsmReader.java	(working copy)
@@ -144,6 +144,7 @@
             parseDownloadPolicy("download", parser.getAttributeValue(null, "download"));
             parseUploadPolicy("upload", parser.getAttributeValue(null, "upload"));
             parseLocked(parser.getAttributeValue(null, "locked"));
+            parseScale(parser.getAttributeValue(null, "scale"));
         } catch (IllegalDataException e) {
             throwException(e);
         }
Index: src/org/openstreetmap/josm/io/OsmWriter.java
===================================================================
--- src/org/openstreetmap/josm/io/OsmWriter.java	(revision 16786)
+++ src/org/openstreetmap/josm/io/OsmWriter.java	(working copy)
@@ -108,6 +108,10 @@
     }
 
     private void header(DownloadPolicy download, UploadPolicy upload, boolean locked) {
+        header(download, upload, locked, 1);
+    }
+
+    private void header(DownloadPolicy download, UploadPolicy upload, boolean locked, double scale) {
         out.println("<?xml version='1.0' encoding='UTF-8'?>");
         out.print("<osm version='");
         out.print(version);
@@ -122,6 +126,10 @@
         if (locked) {
             out.print("' locked='true");
         }
+        if (scale != 1 && scale > 0) {
+            out.print("' scale='");
+            out.print(Double.toString(scale));
+        }
         out.println("' generator='JOSM'>");
     }
 
@@ -158,7 +166,7 @@
      * @since 12800
      */
     public void write(DataSet data) {
-        header(data.getDownloadPolicy(), data.getUploadPolicy(), data.isLocked());
+        header(data.getDownloadPolicy(), data.getUploadPolicy(), data.isLocked(), data.getScale());
         writeDataSources(data);
         writeContent(data);
         footer();
