Index: /trunk/src/org/openstreetmap/josm/io/OsmServerReader.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/io/OsmServerReader.java	(revision 9184)
+++ /trunk/src/org/openstreetmap/josm/io/OsmServerReader.java	(revision 9185)
@@ -131,5 +131,5 @@
 
             try {
-                activeConnection = client.connect();
+                activeConnection = client.connect(progressMonitor);
             } catch (Exception e) {
                 Main.error(e);
@@ -158,6 +158,5 @@
 
                 activeConnection.uncompressAccordingToContentDisposition(uncompressAccordingToContentDisposition);
-                InputStream in = new ProgressInputStream(activeConnection, progressMonitor);
-                return in;
+                return activeConnection.getContent();
             } catch (OsmTransferException e) {
                 throw e;
Index: /trunk/src/org/openstreetmap/josm/io/ProgressInputStream.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/io/ProgressInputStream.java	(revision 9184)
+++ /trunk/src/org/openstreetmap/josm/io/ProgressInputStream.java	(revision 9185)
@@ -10,5 +10,4 @@
 import org.openstreetmap.josm.gui.progress.NullProgressMonitor;
 import org.openstreetmap.josm.gui.progress.ProgressMonitor;
-import org.openstreetmap.josm.tools.HttpClient;
 
 /**
@@ -18,31 +17,35 @@
 public class ProgressInputStream extends InputStream {
 
+    private final StreamProgressUpdater updater;
     private final InputStream in;
-    private final long size;
-    private int readSoFar;
-    private int lastDialogUpdate;
-    private final ProgressMonitor progressMonitor;
 
+    /**
+     * Constructs a new {@code ProgressInputStream}.
+     *
+     * @param in the stream to monitor
+     * @param size the total size which will be sent
+     * @param progressMonitor the monitor to report to
+     * @since 9172
+     */
     public ProgressInputStream(InputStream in, long size, ProgressMonitor progressMonitor) {
         if (progressMonitor == null) {
             progressMonitor = NullProgressMonitor.INSTANCE;
         }
+        this.updater = new StreamProgressUpdater(size, progressMonitor, tr("Downloading data..."));
         this.in = in;
-        this.size = size;
-        this.progressMonitor = progressMonitor;
-        progressMonitor.beginTask(tr("Contacting OSM Server..."), 1);
-        progressMonitor.indeterminateSubTask(null);
-        initProgressMonitor();
     }
 
-    public ProgressInputStream(HttpClient.Response response, ProgressMonitor progressMonitor) throws IOException {
-        this(response.getContent(), response.getContentLength(), progressMonitor);
-    }
-
+    /**
+     * Constructs a new {@code ProgressInputStream}.
+     *
+     * Will call {@link URLConnection#getInputStream()} to obtain the stream to monitor.
+     *
+     * @param con the connection to monitor
+     * @param progressMonitor the monitor to report to
+     */
     public ProgressInputStream(URLConnection con, ProgressMonitor progressMonitor) throws OsmTransferException {
         if (progressMonitor == null) {
             progressMonitor = NullProgressMonitor.INSTANCE;
         }
-        this.progressMonitor = progressMonitor;
         progressMonitor.beginTask(tr("Contacting OSM Server..."), 1);
         progressMonitor.indeterminateSubTask(null);
@@ -50,5 +53,5 @@
         try {
             this.in = con.getInputStream();
-            this.size = con.getContentLength();
+            this.updater = new StreamProgressUpdater(con.getContentLength(), progressMonitor, tr("Downloading data..."));
         } catch (IOException e) {
             progressMonitor.finishTask();
@@ -57,58 +60,35 @@
             throw new OsmTransferException(e);
         }
-        initProgressMonitor();
     }
 
-    protected void initProgressMonitor() {
-        if (size > 0) {
-            progressMonitor.subTask(tr("Downloading OSM data..."));
-            progressMonitor.setTicksCount((int) size);
-        } else {
-            progressMonitor.indeterminateSubTask(tr("Downloading OSM data..."));
+    @Override
+    public void close() throws IOException {
+        try {
+            in.close();
+        } finally {
+            updater.finishTask();
         }
     }
 
-    @Override public void close() throws IOException {
-        try {
-            in.close();
-        } finally {
-            progressMonitor.finishTask();
-        }
-    }
-
-    @Override public int read(byte[] b, int off, int len) throws IOException {
+    @Override
+    public int read(byte[] b, int off, int len) throws IOException {
         int read = in.read(b, off, len);
         if (read != -1) {
-            advanceTicker(read);
+            updater.advanceTicker(read);
         } else {
-            progressMonitor.finishTask();
+            updater.finishTask();
         }
         return read;
     }
 
-    @Override public int read() throws IOException {
+    @Override
+    public int read() throws IOException {
         int read = in.read();
         if (read != -1) {
-            advanceTicker(1);
+            updater.advanceTicker(1);
         } else {
-            progressMonitor.finishTask();
+            updater.finishTask();
         }
         return read;
     }
-
-    /**
-     * Increase ticker (progress counter and displayed text) by the given amount.
-     * @param amount number of ticks
-     */
-    private void advanceTicker(int amount) {
-        readSoFar += amount;
-
-        if (readSoFar / 1024 != lastDialogUpdate) {
-            lastDialogUpdate++;
-            if (size > 0) {
-                progressMonitor.setTicks(readSoFar);
-            }
-            progressMonitor.setExtraText(readSoFar/1024 + " KB");
-        }
-    }
 }
Index: /trunk/src/org/openstreetmap/josm/io/ProgressOutputStream.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/io/ProgressOutputStream.java	(revision 9185)
+++ /trunk/src/org/openstreetmap/josm/io/ProgressOutputStream.java	(revision 9185)
@@ -0,0 +1,56 @@
+package org.openstreetmap.josm.io;
+
+import static org.openstreetmap.josm.tools.I18n.tr;
+
+import java.io.IOException;
+import java.io.OutputStream;
+
+import org.openstreetmap.josm.gui.progress.NullProgressMonitor;
+import org.openstreetmap.josm.gui.progress.ProgressMonitor;
+
+/**
+ * An {@link OutputStream} which reports progress to the {@link ProgressMonitor}.
+ *
+ * @since 9185
+ */
+public class ProgressOutputStream extends OutputStream {
+
+    private final StreamProgressUpdater updater;
+    private final OutputStream out;
+
+    /**
+     * Constructs a new {@code ProgressOutputStream}.
+     *
+     * @param out the stream to monitor
+     * @param size the total size which will be sent
+     * @param progressMonitor the monitor to report to
+     */
+    public ProgressOutputStream(OutputStream out, long size, ProgressMonitor progressMonitor) {
+        if (progressMonitor == null) {
+            progressMonitor = NullProgressMonitor.INSTANCE;
+        }
+        this.updater = new StreamProgressUpdater(size, progressMonitor, tr("Uploading data ..."));
+        this.out = out;
+    }
+
+    @Override
+    public void write(byte[] b, int off, int len) throws IOException {
+        out.write(b, off, len);
+        updater.advanceTicker(len);
+    }
+
+    @Override
+    public void write(int b) throws IOException {
+        out.write(b);
+        updater.advanceTicker(1);
+    }
+
+    @Override
+    public void close() throws IOException {
+        try {
+            out.close();
+        } finally {
+            updater.finishTask();
+        }
+    }
+}
Index: /trunk/src/org/openstreetmap/josm/io/ProgressStream.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/io/ProgressStream.java	(revision 9185)
+++ /trunk/src/org/openstreetmap/josm/io/ProgressStream.java	(revision 9185)
@@ -0,0 +1,53 @@
+package org.openstreetmap.josm.io;
+
+import org.openstreetmap.josm.gui.progress.NullProgressMonitor;
+import org.openstreetmap.josm.gui.progress.ProgressMonitor;
+
+final class StreamProgressUpdater {
+
+    private final long size;
+    private final ProgressMonitor progressMonitor;
+    private final String taskTitle;
+    private int soFar;
+    private int lastDialogUpdate;
+
+    StreamProgressUpdater(long size, ProgressMonitor progressMonitor, String taskTitle) {
+        if (progressMonitor == null) {
+            progressMonitor = NullProgressMonitor.INSTANCE;
+        }
+        this.size = size;
+        this.progressMonitor = progressMonitor;
+        this.taskTitle = taskTitle;
+        initProgressMonitor();
+    }
+
+    private void initProgressMonitor() {
+        if (size > 0) {
+            progressMonitor.subTask(taskTitle);
+            progressMonitor.setTicksCount((int) size);
+        } else {
+            progressMonitor.indeterminateSubTask(taskTitle);
+        }
+    }
+
+    /**
+     * Increase ticker (progress counter and displayed text) by the given amount.
+     *
+     * @param amount number of ticks
+     */
+    void advanceTicker(int amount) {
+        soFar += amount;
+
+        if (soFar / 1024 != lastDialogUpdate) {
+            lastDialogUpdate++;
+            if (size > 0) {
+                progressMonitor.setTicks(soFar);
+            }
+            progressMonitor.setExtraText(soFar / 1024 + " KB");
+        }
+    }
+
+    void finishTask() {
+        progressMonitor.finishTask();
+    }
+}
Index: /trunk/src/org/openstreetmap/josm/tools/HttpClient.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/tools/HttpClient.java	(revision 9184)
+++ /trunk/src/org/openstreetmap/josm/tools/HttpClient.java	(revision 9185)
@@ -22,6 +22,9 @@
 import org.openstreetmap.josm.Main;
 import org.openstreetmap.josm.data.Version;
+import org.openstreetmap.josm.gui.progress.NullProgressMonitor;
 import org.openstreetmap.josm.gui.progress.ProgressMonitor;
 import org.openstreetmap.josm.io.Compression;
+import org.openstreetmap.josm.io.ProgressInputStream;
+import org.openstreetmap.josm.io.ProgressOutputStream;
 import org.openstreetmap.josm.io.UTFInputStreamReader;
 
@@ -61,10 +64,13 @@
     /**
      * Opens the HTTP connection.
-     * @param monitor progress monitor
+     * @param progressMonitor progress monitor
      * @return HTTP response
      * @throws IOException if any I/O error occurs
      * @since 9179
      */
-    public Response connect(ProgressMonitor monitor) throws IOException {
+    public Response connect(ProgressMonitor progressMonitor) throws IOException {
+        if (progressMonitor == null) {
+            progressMonitor = NullProgressMonitor.INSTANCE;
+        }
         final HttpURLConnection connection = (HttpURLConnection) url.openConnection();
         connection.setRequestMethod(requestMethod);
@@ -89,5 +95,6 @@
         }
 
-        // FIXME: use ProgressMonitor
+        progressMonitor.beginTask(tr("Contacting Server..."), 1);
+        progressMonitor.indeterminateSubTask(null);
 
         if ("PUT".equals(requestMethod) || "POST".equals(requestMethod) || "DELETE".equals(requestMethod)) {
@@ -95,5 +102,6 @@
             headers.put("Content-Length", String.valueOf(requestBody.length));
             connection.setDoOutput(true);
-            try (OutputStream out = new BufferedOutputStream(connection.getOutputStream())) {
+            try (OutputStream out = new BufferedOutputStream(
+                    new ProgressOutputStream(connection.getOutputStream(), requestBody.length, progressMonitor))) {
                 out.write(requestBody);
             }
@@ -137,5 +145,5 @@
                 }
             }
-            Response response = new Response(connection);
+            Response response = new Response(connection, progressMonitor);
             successfulConnection = true;
             return response;
@@ -152,4 +160,5 @@
     public static final class Response {
         private final HttpURLConnection connection;
+        private final ProgressMonitor monitor;
         private final int responseCode;
         private final String responseMessage;
@@ -157,7 +166,9 @@
         private boolean uncompressAccordingToContentDisposition;
 
-        private Response(HttpURLConnection connection) throws IOException {
+        private Response(HttpURLConnection connection, ProgressMonitor monitor) throws IOException {
             CheckParameterUtil.ensureParameterNotNull(connection, "connection");
+            CheckParameterUtil.ensureParameterNotNull(monitor, "monitor");
             this.connection = connection;
+            this.monitor = monitor;
             this.responseCode = connection.getResponseCode();
             this.responseMessage = connection.getResponseMessage();
@@ -227,4 +238,5 @@
                 in = connection.getErrorStream();
             }
+            in = new ProgressInputStream(in, getContentLength(), monitor);
             in = "gzip".equalsIgnoreCase(getContentEncoding()) ? new GZIPInputStream(in) : in;
             Compression compression = Compression.NONE;
