Index: trunk/src/org/openstreetmap/josm/io/StreamProgressUpdater.java
===================================================================
--- trunk/src/org/openstreetmap/josm/io/StreamProgressUpdater.java	(revision 9273)
+++ trunk/src/org/openstreetmap/josm/io/StreamProgressUpdater.java	(revision 9274)
@@ -2,6 +2,9 @@
 package org.openstreetmap.josm.io;
 
+import java.util.Locale;
+
 import org.openstreetmap.josm.gui.progress.NullProgressMonitor;
 import org.openstreetmap.josm.gui.progress.ProgressMonitor;
+import org.openstreetmap.josm.tools.Utils;
 
 final class StreamProgressUpdater {
@@ -45,5 +48,5 @@
                 progressMonitor.setTicks(soFar);
             }
-            progressMonitor.setExtraText(soFar / 1024 + " KB");
+            progressMonitor.setExtraText(Utils.getSizeString(soFar, Locale.getDefault()));
         }
     }
Index: trunk/src/org/openstreetmap/josm/tools/HttpClient.java
===================================================================
--- trunk/src/org/openstreetmap/josm/tools/HttpClient.java	(revision 9273)
+++ trunk/src/org/openstreetmap/josm/tools/HttpClient.java	(revision 9274)
@@ -13,4 +13,5 @@
 import java.net.URL;
 import java.util.List;
+import java.util.Locale;
 import java.util.Map;
 import java.util.Scanner;
@@ -99,5 +100,5 @@
 
         if ("PUT".equals(requestMethod) || "POST".equals(requestMethod) || "DELETE".equals(requestMethod)) {
-            Main.info("{0} {1} ({2} kB) ...", requestMethod, url, requestBody.length / 1024);
+            Main.info("{0} {1} ({2}) ...", requestMethod, url, Utils.getSizeString(requestBody.length, Locale.getDefault()));
             headers.put("Content-Length", String.valueOf(requestBody.length));
             connection.setDoOutput(true);
@@ -116,5 +117,7 @@
                         requestMethod, url, hasReason ? " (" + reasonForRequest + ")" : "",
                         connection.getResponseCode(),
-                        connection.getContentLengthLong() > 0 ? " (" + connection.getContentLengthLong() / 1024 + "KB)" : ""
+                        connection.getContentLengthLong() > 0
+                                ? " (" + Utils.getSizeString(connection.getContentLengthLong(), Locale.getDefault()) + ")"
+                                : ""
                 );
                 if (Main.isDebugEnabled()) {
Index: trunk/src/org/openstreetmap/josm/tools/Utils.java
===================================================================
--- trunk/src/org/openstreetmap/josm/tools/Utils.java	(revision 9273)
+++ trunk/src/org/openstreetmap/josm/tools/Utils.java	(revision 9274)
@@ -1146,4 +1146,31 @@
 
     /**
+     * Returns a human readable representation (B, kB, MB, ...) for the given number of byes.
+     * @param bytes the number of bytes
+     * @param locale the locale used for formatting
+     * @return a human readable representation
+     * @since 9274
+     */
+    public static String getSizeString(long bytes, Locale locale) {
+        if (bytes < 0) {
+            throw new IllegalArgumentException("bytes must be >= 0");
+        }
+        final String[] units = {"B", "kB", "MB", "GB", "TB", "PB", "EB", "ZB", "YB"};
+        int unitIndex = 0;
+        double value = bytes;
+        while (value >= 1024 && unitIndex < units.length) {
+            value /= 1024;
+            unitIndex++;
+        }
+        if (value > 100 || unitIndex == 0) {
+            return String.format(locale, "%.0f %s", value, units[unitIndex]);
+        } else if (value > 10) {
+            return String.format(locale, "%.1f %s", value, units[unitIndex]);
+        } else {
+            return String.format(locale, "%.2f %s", value, units[unitIndex]);
+        }
+    }
+
+    /**
      * Returns a human readable representation of a list of positions.
      * <p>
Index: trunk/test/unit/org/openstreetmap/josm/tools/UtilsTest.java
===================================================================
--- trunk/test/unit/org/openstreetmap/josm/tools/UtilsTest.java	(revision 9273)
+++ trunk/test/unit/org/openstreetmap/josm/tools/UtilsTest.java	(revision 9274)
@@ -8,4 +8,5 @@
 import java.net.URL;
 import java.util.Arrays;
+import java.util.Locale;
 
 import org.junit.Assert;
@@ -163,3 +164,25 @@
         assertEquals("1\n2\n3", Utils.restrictStringLines("1\n2\n3", 4));
     }
+
+    /**
+     * Test of {@link Utils#getSizeString} method.
+     */
+    @Test
+    public void testSizeString() throws Exception {
+        assertEquals("0 B", Utils.getSizeString(0, Locale.ENGLISH));
+        assertEquals("123 B", Utils.getSizeString(123, Locale.ENGLISH));
+        assertEquals("1023 B", Utils.getSizeString(1023, Locale.ENGLISH));
+        assertEquals("1.00 kB", Utils.getSizeString(1024, Locale.ENGLISH));
+        assertEquals("11.7 kB", Utils.getSizeString(12024, Locale.ENGLISH));
+        assertEquals("8.00 EB", Utils.getSizeString(Long.MAX_VALUE, Locale.ENGLISH));
+    }
+
+    /**
+     * Test of {@link Utils#getSizeString} method.
+     */
+    @Test(expected = IllegalArgumentException.class)
+    public void testSizeStringNegative() throws Exception {
+        Utils.getSizeString(-1, Locale.ENGLISH);
+    }
+
 }
