Resolved issues:

Changing fragments outside UI thread
Download of gapps does not stop anymore.
MD5 check does not crash
diff --git a/src/com/fairphone/updater/FairphoneUpdater.java b/src/com/fairphone/updater/FairphoneUpdater.java
index 9eda49c..fb1bf61 100644
--- a/src/com/fairphone/updater/FairphoneUpdater.java
+++ b/src/com/fairphone/updater/FairphoneUpdater.java
@@ -464,21 +464,30 @@
         }
     }
 
-    public void removeLastFragment(boolean forceFinish)
+    public void removeLastFragment(final boolean  forceFinish)
     {
-        FragmentManager fragManager = getSupportFragmentManager();
-        if (fragManager != null)
+        runOnUiThread(new Runnable()
         {
-            boolean popSuccess = fragManager.popBackStackImmediate();
-            if (forceFinish && !popSuccess)
+            
+            @Override
+            public void run()
             {
-                finish();
+                FragmentManager fragManager = getSupportFragmentManager();
+                if (fragManager != null)
+                {
+                    boolean popSuccess = fragManager.popBackStackImmediate();
+                    if (forceFinish && !popSuccess)
+                    {
+                        finish();
+                    }
+                }
+                else
+                {
+                    Log.e(TAG, "removeLastFragment - Couldn't get FragmentManager");
+                }
             }
-        }
-        else
-        {
-            Log.e(TAG, "removeLastFragment - Couldn't get FragmentManager");
-        }
+        });
+        
     }
 
     public int getFragmentCount()
diff --git a/src/com/fairphone/updater/fragments/DownloadAndRestartFragment.java b/src/com/fairphone/updater/fragments/DownloadAndRestartFragment.java
index 68dfc26..6357be9 100644
--- a/src/com/fairphone/updater/fragments/DownloadAndRestartFragment.java
+++ b/src/com/fairphone/updater/fragments/DownloadAndRestartFragment.java
@@ -178,9 +178,26 @@
             public void run()
             {
 
+                System.out.println(" +++++++++++++++++++++++++++++++ running startDownloadProgressUpdateThread +++++++++++++++++++++++++++++++ ");
                 boolean downloading = true;
 
-                long latestUpdateDownloadId = mainActivity.getLatestDownloadId();
+                long latestUpdateDownloadId = 0;
+
+                int count = 3;
+
+                while (((latestUpdateDownloadId = mainActivity.getLatestDownloadId()) <= 0) && count > 0){
+                    try
+                    {
+                        Thread.sleep(2000);
+                        System.out.println(" +++++++++++++++++++++++++++++++ count: " + count + " +++++++++++++++++++++++++++++++ ");
+                        count--;
+                    } catch (InterruptedException e)
+                    {
+                        e.printStackTrace();
+                    }
+                }
+                System.out.println(" +++++++++++++++++++++++++++++++ " + latestUpdateDownloadId + " +++++++++++++++++++++++++++++++ ");
+
                 while (mDownloadManager != null && latestUpdateDownloadId != 0 && downloading)
                 {
 
@@ -188,6 +205,10 @@
                     q.setFilterById(latestUpdateDownloadId);
 
                     Cursor cursor = mDownloadManager != null ? mDownloadManager.query(q) : null;
+                    
+                    if(cursor == null){
+                        System.out.println(" +++++++++++++++++++++++++++++++ cursor is null +++++++++++++++++++++++++++++++ ");
+                    }
                     if (cursor != null && cursor.moveToFirst())
                     {
                         try
@@ -381,18 +402,24 @@
 
             Cursor cursor = mDownloadManager != null ? mDownloadManager.query(query) : null;
 
+            System.out.println(" ---------------------- cursor : " + cursor + " ----------------------------------");
+            
             if (cursor != null && cursor.moveToFirst())
             {
                 int columnIndex = cursor.getColumnIndex(DownloadManager.COLUMN_STATUS);
                 int status = cursor.getInt(columnIndex);
 
+                System.out.println("status from cursor: " + status);
+                
                 switch (status)
                 {
+                    
                     case DownloadManager.STATUS_SUCCESSFUL:
                         mainActivity.updateStatePreference(UpdaterState.PREINSTALL);
                         toggleDownloadProgressAndRestart();
                         break;
                     case DownloadManager.STATUS_RUNNING:
+                    case DownloadManager.STATUS_PENDING:
                         startDownloadProgressUpdateThread();
                         break;
                     case DownloadManager.STATUS_FAILED:
diff --git a/src/com/fairphone/updater/gappsinstaller/GappsInstallerHelper.java b/src/com/fairphone/updater/gappsinstaller/GappsInstallerHelper.java
index f57a2c4..b2e0b43 100644
--- a/src/com/fairphone/updater/gappsinstaller/GappsInstallerHelper.java
+++ b/src/com/fairphone/updater/gappsinstaller/GappsInstallerHelper.java
@@ -746,11 +746,24 @@
 
                 while (downloading && download_id != 0)
                 {
-
                     DownloadManager.Query q = new DownloadManager.Query();
                     q.setFilterById(download_id);
+                    
+                    Cursor cursor = null;
+                    int count = 3;
+                    if(mDownloadManager != null){
+                        while(((cursor = mDownloadManager.query(q)) == null) && count > 0){
+                            try{
+                            Thread.sleep(1000);
+                            count--;
+                            }catch(Exception e){}
+                        }
+                    }
+                    if(cursor == null){
+                        System.out.println("Cursor is null");
+                    }
 
-                    Cursor cursor = mDownloadManager != null ? mDownloadManager.query(q) : null;
+//                    Cursor cursor = mDownloadManager != null ? mDownloadManager.query(q) : null;
                     if (cursor != null && cursor.moveToFirst())
                     {
                         try
@@ -779,7 +792,9 @@
                                 switch (cursor.getInt(cursor.getColumnIndex(DownloadManager.COLUMN_STATUS)))
                                 {
                                     case DownloadManager.STATUS_SUCCESSFUL:
+                                        System.out.println("*************************** in THREAD status == DownloadManager.STATUS_SUCCESSFUL");
                                     case DownloadManager.STATUS_FAILED:
+                                        System.out.println("*************************** in THREAD status == DownloadManager.STATUS_FAILED");
                                         downloading = false;
 
                                         bytes_downloaded = 0;
@@ -938,6 +953,8 @@
 
             long currentDownloadID = intent.getLongExtra(DownloadManager.EXTRA_DOWNLOAD_ID, 0);
             int currentState = getCurrentState();
+            
+            System.out.println("*************************** state = " + currentDownloadID);
             long downloadID = 0;
 
             switch (currentState)
@@ -969,10 +986,11 @@
 
                     if (status == DownloadManager.STATUS_SUCCESSFUL)
                     {
+                        System.out.println("*************************** status == DownloadManager.STATUS_SUCCESSFUL");
                         // Retrieve the saved download id
                         if (downloadID == mConfigFileDownloadId)
                         {
-
+                            
                             String targetPath = DOWNLOAD_PATH + ZIP_CONTENT_PATH;
                             String cfgFilename = mContext.getResources().getString(R.string.gapps_installer_config_file);
                             String fileCfgExt = mContext.getResources().getString(R.string.gapps_installer_cfg);
@@ -1063,9 +1081,12 @@
                     }
                     else if (status == DownloadManager.STATUS_FAILED)
                     {
+                        System.out.println("*************************** status == DownloadManager.STATUS_FAILED");
                         Toast.makeText(mContext, R.string.google_apps_download_error, Toast.LENGTH_LONG).show();
 
                         checkGappsAreInstalled();
+                    }else {
+                        System.out.println("*************************** status == " + status);
                     }
                 }
                 if (cursor != null)
diff --git a/src/com/fairphone/updater/tools/Utils.java b/src/com/fairphone/updater/tools/Utils.java
index b61d708..d54ce0c 100644
--- a/src/com/fairphone/updater/tools/Utils.java
+++ b/src/com/fairphone/updater/tools/Utils.java
@@ -228,7 +228,9 @@
             return output;
         } catch (IOException e)
         {
-            throw new RuntimeException("Unable to process file for MD5", e);
+            Log.e(TAG, "Error digesting MD5", e);
+            return null;
+//            throw new RuntimeException("Unable to process file for MD5", e);
         } finally
         {
             try