Index: src/org/openstreetmap/josm/io/ProgressReader.java
===================================================================
--- src/org/openstreetmap/josm/io/ProgressReader.java	(revision 108)
+++ src/org/openstreetmap/josm/io/ProgressReader.java	(revision 109)
@@ -3,6 +3,4 @@
 import java.io.IOException;
 import java.io.InputStream;
-import java.io.InputStreamReader;
-import java.io.Reader;
 import java.net.URLConnection;
 
@@ -16,11 +14,14 @@
 public class ProgressReader extends InputStream {
 
-	private final Reader in;
+	private final InputStream in;
 	private final BoundedRangeModel progress;
 	private final JLabel currentAction;
 	private int readSoFar = 0;
+	private int lastDialogUpdate = 0;
+	private final URLConnection connection;
 
 	public ProgressReader(URLConnection con, BoundedRangeModel progress, JLabel currentAction) throws IOException {
-		this.in = new InputStreamReader(con.getInputStream());
+		this.connection = con;
+		this.in = con.getInputStream();
 		this.progress = progress;
 		this.currentAction = currentAction;
@@ -31,5 +32,5 @@
 			progress.setMaximum(0);
 		progress.setValue(0);
-    }
+	}
 
 	@Override public void close() throws IOException {
@@ -37,23 +38,42 @@
 	}
 
+	@Override public int read(byte[] b, int off, int len) throws IOException {
+		int read = in.read(b, off, len);
+		if (read != -1)
+			advanceTicker(read);
+		return read;
+	}
+
 	@Override public int read() throws IOException {
 		int read = in.read();
-		readSoFar++;
+		if (read != -1)
+			advanceTicker(1);
+		return read;
+	}
 
-		String progStr = " ("+readSoFar+"/";
-		if (progress.getMaximum() == 0)
-			progStr += "???)";
-		else
-			progStr += progress.getMaximum()+")";
-		
-		String cur = currentAction.getText();
-		int i = cur.indexOf(' ');
-		if (i != -1)
-			cur = cur.substring(0, i) + progStr;
-		else
-			cur += progStr;
-		currentAction.setText(cur);
-		progress.setValue(readSoFar);
-		return read;
-    }
+	/**
+	 * Increase ticker (progress counter and displayed text) by the given amount.
+	 * @param amount
+	 */
+	private void advanceTicker(int amount) {
+		if (progress.getMaximum() == 0 && connection.getContentLength() != -1)
+			progress.setMaximum(connection.getContentLength());
+
+		readSoFar += amount;
+
+		if (readSoFar / 1024 != lastDialogUpdate) {
+			lastDialogUpdate++;
+			String progStr = " "+readSoFar/1024+"/";
+			progStr += (progress.getMaximum()==0) ? "??? KB" : (progress.getMaximum()/1024)+" KB";
+			progress.setValue(readSoFar);
+
+			String cur = currentAction.getText();
+			int i = cur.indexOf(' ');
+			if (i != -1)
+				cur = cur.substring(0, i) + progStr;
+			else
+				cur += progStr;
+			currentAction.setText(cur);
+		}
+	}
 }
