diff --git a/F-Droid/res/values/strings.xml b/F-Droid/res/values/strings.xml
index 16c41b048..5028c49bb 100644
--- a/F-Droid/res/values/strings.xml
+++ b/F-Droid/res/values/strings.xml
@@ -172,6 +172,13 @@
 	  - Percentage complete (int between 0-100)
 	-->
 	<string name="status_download">Downloading\n%2$s / %3$s (%4$d%%) from\n%1$s</string>
+
+	<!--
+	status_download_unknown_size takes two parameters:
+	  - Repository (url)
+	  - Downloaded size (human readable)
+	-->
+	<string name="status_download_unknown_size">Downloading\n%2$s from\n%1$s</string>
 	<string name="update_notification_title">Updating repositories</string>
 	<string name="status_processing_xml_percent">Processing %2$s / %3$s (%4$d%%) from %1$s</string>
 	<string name="status_connecting_to_repo">Connecting to\n%1$s</string>
diff --git a/F-Droid/src/org/fdroid/fdroid/AppDetails.java b/F-Droid/src/org/fdroid/fdroid/AppDetails.java
index c6c482b12..9ed74bd6c 100644
--- a/F-Droid/src/org/fdroid/fdroid/AppDetails.java
+++ b/F-Droid/src/org/fdroid/fdroid/AppDetails.java
@@ -1498,31 +1498,26 @@ public class AppDetails extends AppCompatActivity implements ProgressListener, A
         /**
          * Updates progress bar and captions to new values (in bytes).
          */
-        public void updateProgress(long progress, long total) {
-            // Avoid division by zero and other weird values
-            if (progress < 0 || total <= 0) {
+        public void updateProgress(long bytesDownloaded, long totalBytes) {
+            if (bytesDownloaded < 0 || totalBytes == 0) {
+                // Avoid division by zero and other weird values
                 return;
             }
-            long percent = progress * 100 / total;
-            setProgressVisible(true);
-            progressBar.setIndeterminate(false);
-            progressBar.setProgress((int) percent);
-            progressBar.setMax(100);
-            progressSize.setText(readableFileSize(progress) + " / " + readableFileSize(total));
-            progressPercent.setText(Long.toString(percent) + " %");
-        }
 
-        /**
-         * Converts a number of bytes to a human readable file size (eg 3.5 GiB).
-         *
-         * Based on http://stackoverflow.com/a/5599842
-         */
-        public String readableFileSize(long bytes) {
-            final String[] units = getResources().getStringArray(R.array.file_size_units);
-            if (bytes <= 0) return "0 " + units[0];
-            int digitGroups = (int) (Math.log10(bytes) / Math.log10(1024));
-            return new DecimalFormat("#,##0.#")
-                    .format(bytes / Math.pow(1024, digitGroups)) + " " + units[digitGroups];
+            if (totalBytes == -1) {
+                setProgressVisible(true);
+                progressBar.setIndeterminate(true);
+                progressSize.setText(Utils.getFriendlySize(bytesDownloaded));
+                progressPercent.setText("");
+            } else {
+                long percent = bytesDownloaded * 100 / totalBytes;
+                setProgressVisible(true);
+                progressBar.setIndeterminate(false);
+                progressBar.setProgress((int) percent);
+                progressBar.setMax(100);
+                progressSize.setText(Utils.getFriendlySize(bytesDownloaded) + " / " + Utils.getFriendlySize(totalBytes));
+                progressPercent.setText(Long.toString(percent) + " %");
+            }
         }
 
         /**
diff --git a/F-Droid/src/org/fdroid/fdroid/UpdateService.java b/F-Droid/src/org/fdroid/fdroid/UpdateService.java
index cd5195384..bdde37883 100644
--- a/F-Droid/src/org/fdroid/fdroid/UpdateService.java
+++ b/F-Droid/src/org/fdroid/fdroid/UpdateService.java
@@ -209,12 +209,17 @@ public class UpdateService extends IntentService implements ProgressListener {
 
             String repoAddress = intent.getStringExtra(Downloader.EXTRA_ADDRESS);
             int downloadedSize = intent.getIntExtra(Downloader.EXTRA_BYTES_READ, -1);
+            String downloadedSizeFriendly = Utils.getFriendlySize(downloadedSize);
             int totalSize = intent.getIntExtra(Downloader.EXTRA_TOTAL_BYTES, -1);
             int percent = (int) ((double) downloadedSize / totalSize * 100);
-            sendStatus(STATUS_INFO,
-                    getString(R.string.status_download, repoAddress,
-                            Utils.getFriendlySize(downloadedSize),
-                            Utils.getFriendlySize(totalSize), percent));
+            String message;
+            if (totalSize == -1) {
+                message = getString(R.string.status_download_unknown_size, repoAddress, downloadedSizeFriendly);
+            } else {
+                String totalSizeFriendly = Utils.getFriendlySize(totalSize);
+                message = getString(R.string.status_download, repoAddress, downloadedSizeFriendly, totalSizeFriendly, percent);
+            }
+            sendStatus(STATUS_INFO, message);
         }
     };
 
diff --git a/F-Droid/src/org/fdroid/fdroid/Utils.java b/F-Droid/src/org/fdroid/fdroid/Utils.java
index 14db5651d..e5ccd595c 100644
--- a/F-Droid/src/org/fdroid/fdroid/Utils.java
+++ b/F-Droid/src/org/fdroid/fdroid/Utils.java
@@ -186,7 +186,7 @@ public final class Utils {
         }
     }
 
-    public static String getFriendlySize(int size) {
+    public static String getFriendlySize(long size) {
         double s = size;
         int i = 0;
         while (i < FRIENDLY_SIZE_FORMAT.length - 1 && s >= 1024) {
diff --git a/F-Droid/src/org/fdroid/fdroid/net/Downloader.java b/F-Droid/src/org/fdroid/fdroid/net/Downloader.java
index 25084e603..3d987a606 100644
--- a/F-Droid/src/org/fdroid/fdroid/net/Downloader.java
+++ b/F-Droid/src/org/fdroid/fdroid/net/Downloader.java
@@ -154,11 +154,10 @@ public abstract class Downloader {
         throwExceptionIfInterrupted();
 
         sendProgress(bytesRead, totalBytes);
-        while (bytesRead < totalBytes) {
+        while (true) {
 
             int count;
-            if (input.available()>0) {
-
+            if (input.available() > 0) {
                 int readLength = Math.min(input.available(), buffer.length);
                 count = input.read(buffer, 0, readLength);
             } else {
diff --git a/F-Droid/src/org/fdroid/fdroid/views/swap/SwapAppsView.java b/F-Droid/src/org/fdroid/fdroid/views/swap/SwapAppsView.java
index f254fbcf8..6eb36fa28 100644
--- a/F-Droid/src/org/fdroid/fdroid/views/swap/SwapAppsView.java
+++ b/F-Droid/src/org/fdroid/fdroid/views/swap/SwapAppsView.java
@@ -293,6 +293,8 @@ public class SwapAppsView extends ListView implements
                         progressView.setIndeterminate(false);
                         progressView.setMax(100);
                         progressView.setProgress(progress);
+                    } else {
+                        progressView.setIndeterminate(true);
                     }
                 }
             };