Index: /trunk/src/org/openstreetmap/josm/io/OsmWriter.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/io/OsmWriter.java	(revision 13484)
+++ /trunk/src/org/openstreetmap/josm/io/OsmWriter.java	(revision 13485)
@@ -18,4 +18,5 @@
 import org.openstreetmap.josm.data.osm.Changeset;
 import org.openstreetmap.josm.data.osm.DataSet;
+import org.openstreetmap.josm.data.osm.DataSet.DownloadPolicy;
 import org.openstreetmap.josm.data.osm.DataSet.UploadPolicy;
 import org.openstreetmap.josm.data.osm.INode;
@@ -90,19 +91,52 @@
     }
 
+    /**
+     * Writes OSM header with normal download and upload policies.
+     */
     public void header() {
-        header(UploadPolicy.NORMAL);
-    }
-
+        header(DownloadPolicy.NORMAL, UploadPolicy.NORMAL);
+    }
+
+    /**
+     * Writes OSM header with normal download policy and given upload policy.
+     * @deprecated Use {@link #header(DownloadPolicy, UploadPolicy)} instead
+     * @param upload upload policy
+     */
+    @Deprecated
     public void header(UploadPolicy upload) {
+        header(DownloadPolicy.NORMAL, upload);
+    }
+
+    /**
+     * Writes OSM header with given download upload policies.
+     * @param download download policy
+     * @param upload upload policy
+     * @since 13485
+     */
+    public void header(DownloadPolicy download, UploadPolicy upload) {
+        header(download, upload, false);
+    }
+
+    private void header(DownloadPolicy download, UploadPolicy upload, boolean locked) {
         out.println("<?xml version='1.0' encoding='UTF-8'?>");
         out.print("<osm version='");
         out.print(version);
+        if (download != null && download != DownloadPolicy.NORMAL) {
+            out.print("' download='");
+            out.print(download.getXmlFlag());
+        }
         if (upload != null && upload != UploadPolicy.NORMAL) {
             out.print("' upload='");
             out.print(upload.getXmlFlag());
         }
+        if (locked) {
+            out.print("' locked=true");
+        }
         out.println("' generator='JOSM'>");
     }
 
+    /**
+     * Writes OSM footer.
+     */
     public void footer() {
         out.println("</osm>");
@@ -135,5 +169,5 @@
      */
     public void write(DataSet data) {
-        header(data.getUploadPolicy());
+        header(data.getDownloadPolicy(), data.getUploadPolicy(), data.isLocked());
         writeDataSources(data);
         writeContent(data);
Index: /trunk/src/org/openstreetmap/josm/tools/RightAndLefthandTraffic.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/tools/RightAndLefthandTraffic.java	(revision 13484)
+++ /trunk/src/org/openstreetmap/josm/tools/RightAndLefthandTraffic.java	(revision 13485)
@@ -24,4 +24,6 @@
 import org.openstreetmap.josm.data.coor.LatLon;
 import org.openstreetmap.josm.data.osm.DataSet;
+import org.openstreetmap.josm.data.osm.DataSet.DownloadPolicy;
+import org.openstreetmap.josm.data.osm.DataSet.UploadPolicy;
 import org.openstreetmap.josm.data.osm.OsmPrimitive;
 import org.openstreetmap.josm.data.osm.Relation;
@@ -158,5 +160,5 @@
              OsmWriter w = OsmWriterFactory.createOsmWriter(new PrintWriter(writer), false, ds.getVersion())
             ) {
-            w.header(DataSet.UploadPolicy.DISCOURAGED);
+            w.header(DownloadPolicy.NORMAL, UploadPolicy.DISCOURAGED);
             w.writeContent(ds);
             w.footer();
Index: /trunk/test/unit/org/openstreetmap/josm/io/OsmWriterTest.java
===================================================================
--- /trunk/test/unit/org/openstreetmap/josm/io/OsmWriterTest.java	(revision 13484)
+++ /trunk/test/unit/org/openstreetmap/josm/io/OsmWriterTest.java	(revision 13485)
@@ -3,5 +3,9 @@
 
 import static org.junit.Assert.assertArrayEquals;
+import static org.junit.Assert.assertEquals;
 
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.io.PrintWriter;
 import java.util.ArrayList;
 import java.util.Arrays;
@@ -10,4 +14,6 @@
 
 import org.junit.Test;
+import org.openstreetmap.josm.data.osm.DataSet.DownloadPolicy;
+import org.openstreetmap.josm.data.osm.DataSet.UploadPolicy;
 import org.openstreetmap.josm.data.osm.NodeData;
 
@@ -37,3 +43,27 @@
         }, longIds);
     }
+
+    /**
+     * Unit test of {@link OsmWriter#header(DownloadPolicy, UploadPolicy)}.
+     * @throws IOException if an I/O error occurs
+     */
+    @Test
+    public void testHeader() throws IOException {
+        doTestHeader(null, null,
+                "<osm version='0.6' generator='JOSM'>");
+        doTestHeader(DownloadPolicy.NORMAL, UploadPolicy.NORMAL,
+                "<osm version='0.6' generator='JOSM'>");
+        doTestHeader(DownloadPolicy.BLOCKED, UploadPolicy.BLOCKED,
+                "<osm version='0.6' download='never' upload='never' generator='JOSM'>");
+    }
+
+    private static void doTestHeader(DownloadPolicy download, UploadPolicy upload, String expected) throws IOException {
+        ByteArrayOutputStream baos = new ByteArrayOutputStream();
+        try (PrintWriter out = new PrintWriter(baos);
+             OsmWriter writer = OsmWriterFactory.createOsmWriter(out, true, OsmWriter.DEFAULT_API_VERSION)) {
+            writer.header(download, upload);
+        }
+        assertEquals("<?xml version='1.0' encoding='UTF-8'?>" + expected,
+                baos.toString("UTF-8").replaceAll("\r", "").replaceAll("\n", ""));
+    }
 }
