- Adapt the fragments to work with both versions and stores
diff --git a/src/com/fairphone/updater/FairphoneUpdater.java b/src/com/fairphone/updater/FairphoneUpdater.java
index 029359b..613a9a3 100644
--- a/src/com/fairphone/updater/FairphoneUpdater.java
+++ b/src/com/fairphone/updater/FairphoneUpdater.java
@@ -21,6 +21,7 @@
 import android.widget.Toast;
 
 import com.crashlytics.android.Crashlytics;
+import com.fairphone.updater.data.DownloadableItem;
 import com.fairphone.updater.data.Store;
 import com.fairphone.updater.data.UpdaterData;
 import com.fairphone.updater.data.Version;
@@ -40,11 +41,11 @@
     public static final String FAIRPHONE_UPDATER_NEW_VERSION_RECEIVED = "FairphoneUpdater.NEW.VERSION.RECEIVED";
 
     public static final String PREFERENCE_FIRST_TIME_ANDROID = "FirstTimeAndroid";
-    
+
     public static final String PREFERENCE_FIRST_TIME_FAIRPHONE = "FirstTimeFairphone";
-    
+
     public static final String PREFERENCE_FIRST_TIME_APP_STORE = "FirstTimeAppStore";
-    
+
     public static final String PREFERENCE_CURRENT_UPDATER_STATE = "CurrentUpdaterState";
 
     private static final String PREFERENCE_DOWNLOAD_ID = "LatestUpdateDownloadId";
@@ -58,7 +59,7 @@
     public static final String FAIRPHONE_UPDATER_CONFIG_DOWNLOAD_FAILED = "FairphoneUpdater.Config.File.Download.FAILED";
 
     public static final String FAIRPHONE_UPDATER_CONFIG_DOWNLOAD_LINK = "FairphoneUpdater.ConfigFile.Download.LINK";
-    
+
     public static final String PREFERENCE_SELECTED_STORE_NUMBER = "SelectedStoreNumber";
 
     public static enum UpdaterState
@@ -86,17 +87,18 @@
     private TextView headerOtherOSText;
     private ImageButton headerFairphoneInfoButton;
     private ImageButton headerAndroidInfoButton;
-    
+
     private boolean mIsFirstTimeAndroid;
     private boolean mIsFirstTimeAppStore;
     private boolean mIsFirstTimeFairphone;
-    
-    
+
     private Store mSelectedStore;
-    
+
+    private TextView headerMainAppStoreText;
+
     public static enum HeaderType
     {
-        MAIN_FAIRPHONE, MAIN_ANDROID, FAIRPHONE, ANDROID, OTHER_OS, APP_STORE
+        MAIN_FAIRPHONE, MAIN_ANDROID, MAIN_APP_STORE, FAIRPHONE, ANDROID, OTHER_OS, APP_STORE
     };
 
     @Override
@@ -116,11 +118,11 @@
 
         // update first times
         mIsFirstTimeAndroid = mSharedPreferences.getBoolean(PREFERENCE_FIRST_TIME_ANDROID, true);
-        
+
         mIsFirstTimeFairphone = mSharedPreferences.getBoolean(PREFERENCE_FIRST_TIME_FAIRPHONE, true);
-        
+
         mIsFirstTimeAppStore = mSharedPreferences.getBoolean(PREFERENCE_FIRST_TIME_APP_STORE, true);
-        
+
         // check current state
         mCurrentState = getCurrentUpdaterState();
 
@@ -171,7 +173,7 @@
         int versionNumber = mSharedPreferences.getInt(PREFERENCE_SELECTED_VERSION_NUMBER, 0);
         mSelectedVersion = UpdaterData.getInstance().getVersion(versionImageType, versionNumber);
     }
-    
+
     protected void getSelectedStoreFromSharedPreferences()
     {
         int storeNumber = mSharedPreferences.getInt(PREFERENCE_SELECTED_STORE_NUMBER, 0);
@@ -239,11 +241,11 @@
     {
         headerMainFairphoneText = (TextView) findViewById(R.id.header_main_fairphone_text);
         headerMainAndroidText = (TextView) findViewById(R.id.header_main_android_text);
+        headerMainAppStoreText = (TextView) findViewById(R.id.header_main_app_store_text);
         headerFairphoneText = (TextView) findViewById(R.id.header_fairphone_text);
         headerAndroidText = (TextView) findViewById(R.id.header_android_text);
         headerOtherOSText = (TextView) findViewById(R.id.header_other_os_text);
         headerAppStoreText = (TextView) findViewById(R.id.header_app_store_text);
-        
 
         OnClickListener headerBackPressListener = new OnClickListener()
         {
@@ -258,23 +260,23 @@
         headerAndroidText.setOnClickListener(headerBackPressListener);
         headerAppStoreText.setOnClickListener(headerBackPressListener);
         headerOtherOSText.setOnClickListener(headerBackPressListener);
-        
-        headerFairphoneInfoButton = (ImageButton)findViewById(R.id.header_fairphone_info_button);
-        headerAndroidInfoButton = (ImageButton)findViewById(R.id.header_android_info_button);
-        
+
+        headerFairphoneInfoButton = (ImageButton) findViewById(R.id.header_fairphone_info_button);
+        headerAndroidInfoButton = (ImageButton) findViewById(R.id.header_android_info_button);
+
         headerFairphoneInfoButton.setOnClickListener(new OnClickListener()
         {
-            
+
             @Override
             public void onClick(View v)
             {
                 showInfoPopupDialog(DetailLayoutType.FAIRPHONE);
             }
         });
-        
+
         headerAndroidInfoButton.setOnClickListener(new OnClickListener()
         {
-            
+
             @Override
             public void onClick(View v)
             {
@@ -282,16 +284,14 @@
             }
         });
     }
-    
 
     private void showInfoPopupDialog(DetailLayoutType layoutType)
     {
         FragmentManager fm = getSupportFragmentManager();
-        InfoPopupDialog popupDialog =
-                new InfoPopupDialog(layoutType);
+        InfoPopupDialog popupDialog = new InfoPopupDialog(layoutType);
         popupDialog.show(fm, layoutType.name());
     }
-    
+
     @Override
     public void onBackPressed()
     {
@@ -319,23 +319,25 @@
             case FAIRPHONE:
                 headerMainFairphoneText.setVisibility(View.GONE);
                 headerMainAndroidText.setVisibility(View.GONE);
+                headerMainAppStoreText.setVisibility(View.GONE);
                 headerFairphoneText.setVisibility(View.VISIBLE);
                 headerAndroidText.setVisibility(View.GONE);
                 headerAppStoreText.setVisibility(View.GONE);
                 headerOtherOSText.setVisibility(View.GONE);
 
                 headerFairphoneText.setText(headerText);
-                
-                if(showInfo && mIsFirstTimeFairphone){
+
+                if (showInfo && mIsFirstTimeFairphone)
+                {
                     showInfoPopupDialog(DetailLayoutType.UPDATE_FAIRPHONE);
                     Editor editor = mSharedPreferences.edit();
-                    
+
                     mIsFirstTimeFairphone = false;
-                    
+
                     editor.putBoolean(PREFERENCE_FIRST_TIME_FAIRPHONE, mIsFirstTimeFairphone);
                     editor.commit();
                 }
-                
+
                 headerFairphoneInfoButton.setVisibility(showInfo ? View.VISIBLE : View.GONE);
                 headerAndroidInfoButton.setVisibility(View.GONE);
                 break;
@@ -343,23 +345,25 @@
             case ANDROID:
                 headerMainFairphoneText.setVisibility(View.GONE);
                 headerMainAndroidText.setVisibility(View.GONE);
+                headerMainAppStoreText.setVisibility(View.GONE);
                 headerFairphoneText.setVisibility(View.GONE);
                 headerAndroidText.setVisibility(View.VISIBLE);
                 headerAppStoreText.setVisibility(View.GONE);
                 headerOtherOSText.setVisibility(View.GONE);
 
                 headerAndroidText.setText(headerText);
-                
-                if(showInfo && mIsFirstTimeAndroid){
+
+                if (showInfo && mIsFirstTimeAndroid)
+                {
                     showInfoPopupDialog(DetailLayoutType.UPDATE_ANDROID);
                     Editor editor = mSharedPreferences.edit();
-                    
+
                     mIsFirstTimeAndroid = false;
-                    
+
                     editor.putBoolean(PREFERENCE_FIRST_TIME_ANDROID, mIsFirstTimeAndroid);
                     editor.commit();
                 }
-                
+
                 headerFairphoneInfoButton.setVisibility(View.GONE);
                 headerAndroidInfoButton.setVisibility(showInfo ? View.VISIBLE : View.GONE);
                 break;
@@ -367,38 +371,40 @@
             case APP_STORE:
                 headerMainFairphoneText.setVisibility(View.GONE);
                 headerMainAndroidText.setVisibility(View.GONE);
+                headerMainAppStoreText.setVisibility(View.GONE);
                 headerFairphoneText.setVisibility(View.GONE);
                 headerAndroidText.setVisibility(View.GONE);
                 headerAppStoreText.setVisibility(View.VISIBLE);
                 headerOtherOSText.setVisibility(View.GONE);
 
                 headerAppStoreText.setText(headerText);
-                
-                if(showInfo && mIsFirstTimeAppStore){
+
+                if (showInfo && mIsFirstTimeAppStore)
+                {
                     showInfoPopupDialog(DetailLayoutType.APP_STORE);
                     Editor editor = mSharedPreferences.edit();
-                    
+
                     mIsFirstTimeAppStore = false;
-                    
+
                     editor.putBoolean(PREFERENCE_FIRST_TIME_APP_STORE, mIsFirstTimeAppStore);
                     editor.commit();
                 }
-                
+
                 headerFairphoneInfoButton.setVisibility(View.GONE);
-                headerAndroidInfoButton.setVisibility(showInfo ? View.VISIBLE : View.GONE);
+                headerAndroidInfoButton.setVisibility(View.GONE);
                 break;
 
-                
             case OTHER_OS:
                 headerMainFairphoneText.setVisibility(View.GONE);
                 headerMainAndroidText.setVisibility(View.GONE);
+                headerMainAppStoreText.setVisibility(View.GONE);
                 headerFairphoneText.setVisibility(View.GONE);
                 headerAndroidText.setVisibility(View.GONE);
                 headerAppStoreText.setVisibility(View.GONE);
                 headerOtherOSText.setVisibility(View.VISIBLE);
 
                 headerOtherOSText.setText(headerText);
-                
+
                 headerFairphoneInfoButton.setVisibility(View.GONE);
                 headerAndroidInfoButton.setVisibility(View.GONE);
                 break;
@@ -406,11 +412,25 @@
             case MAIN_ANDROID:
                 headerMainFairphoneText.setVisibility(View.GONE);
                 headerMainAndroidText.setVisibility(View.VISIBLE);
+                headerMainAppStoreText.setVisibility(View.GONE);
                 headerFairphoneText.setVisibility(View.GONE);
                 headerAndroidText.setVisibility(View.GONE);
                 headerAppStoreText.setVisibility(View.GONE);
                 headerOtherOSText.setVisibility(View.GONE);
+
+                headerFairphoneInfoButton.setVisibility(View.GONE);
+                headerAndroidInfoButton.setVisibility(View.GONE);
+                break;
                 
+            case MAIN_APP_STORE:
+                headerMainFairphoneText.setVisibility(View.GONE);
+                headerMainAndroidText.setVisibility(View.GONE);
+                headerMainAppStoreText.setVisibility(View.VISIBLE);
+                headerFairphoneText.setVisibility(View.GONE);
+                headerAndroidText.setVisibility(View.GONE);
+                headerAppStoreText.setVisibility(View.GONE);
+                headerOtherOSText.setVisibility(View.GONE);
+
                 headerFairphoneInfoButton.setVisibility(View.GONE);
                 headerAndroidInfoButton.setVisibility(View.GONE);
                 break;
@@ -423,7 +443,7 @@
                 headerAndroidText.setVisibility(View.GONE);
                 headerAppStoreText.setVisibility(View.GONE);
                 headerOtherOSText.setVisibility(View.GONE);
-                
+
                 headerFairphoneInfoButton.setVisibility(View.GONE);
                 headerAndroidInfoButton.setVisibility(View.GONE);
                 break;
@@ -451,11 +471,19 @@
             // In case this activity was started with special instructions from
             // an
             // Intent, pass the Intent's extras to the fragment as arguments
-            firstFragment.setArguments(getIntent().getExtras());
+            Intent intent = getIntent();
+            if (firstFragment != null && intent != null)
+            {
+                Bundle bundle = intent.getExtras();
+                if (bundle != null)
+                {
+                    firstFragment.setArguments(bundle);
+                }
+            }
 
             // Add the fragment to the 'fragment_container' FrameLayout
             FragmentManager fragManager = getSupportFragmentManager();
-            if (fragManager != null)
+            if (firstFragment != null && fragManager != null)
             {
                 fragManager.beginTransaction().add(R.id.fragment_holder, firstFragment).commit();
             }
@@ -487,7 +515,7 @@
                 firstFragment = new MainFragment();
                 break;
         }
-        
+
         return firstFragment;
     }
 
@@ -495,7 +523,7 @@
     {
 
         Fragment topFragment = getTopFragment();
-        if (topFragment == null || (topFragment != null && !newFragment.getClass().equals(topFragment.getClass())))
+        if (topFragment == null || (topFragment != null && newFragment != null && !newFragment.getClass().equals(topFragment.getClass())))
         {
             FragmentManager fragManager = getSupportFragmentManager();
             if (fragManager != null)
@@ -523,11 +551,11 @@
         }
     }
 
-    public void removeLastFragment(final boolean  forceFinish)
+    public void removeLastFragment(final boolean forceFinish)
     {
         runOnUiThread(new Runnable()
         {
-            
+
             @Override
             public void run()
             {
@@ -546,7 +574,7 @@
                 }
             }
         });
-        
+
     }
 
     public int getFragmentCount()
@@ -656,29 +684,39 @@
         return update;
     }
 
-    public String getVersionName(Version version)
+    public String getItemName(DownloadableItem item)
     {
-        String versionName = "";
-        if (version != null)
+        String itemName = "";
+        if (item != null)
         {
-            versionName = version.getImageTypeDescription(getResources()) + " " + version.getName() + " " + version.getBuildNumber();
+            if (item instanceof Version)
+            {
+                Version version = (Version) item;
+                itemName = version.getImageTypeDescription(getResources()) + " " + version.getName() + " " + version.getBuildNumber();
+            }
+            else if (item instanceof Store)
+            {
+
+                Store store = (Store) item;
+                itemName = store.getName();
+            }
         }
-        return versionName;
+        return itemName;
     }
 
     public String getDeviceVersionName()
     {
-        return getVersionName(mDeviceVersion);
+        return getItemName(mDeviceVersion);
     }
 
     public String getLatestVersionName()
     {
-        return getVersionName(mLatestVersion);
+        return getItemName(mLatestVersion);
     }
 
     public String getSelectedVersionName()
     {
-        return getVersionName(mSelectedVersion);
+        return getItemName(mSelectedVersion);
     }
 
     public Version getDeviceVersion()
@@ -695,7 +733,7 @@
     {
         return mSelectedVersion;
     }
-    
+
     public Store getSelectedStore()
     {
         return mSelectedStore;
@@ -726,16 +764,22 @@
         clearSelectedStore(0);
     }
 
+    public void clearSelectedItems()
+    {
+        clearSelectedVersion(0, "");
+        clearSelectedStore(0);
+    }
+
     private void clearSelectedVersion(int versionNumber, String versionImageType)
     {
         Editor editor = mSharedPreferences.edit();
         editor.putInt(PREFERENCE_SELECTED_VERSION_NUMBER, versionNumber);
         editor.putString(PREFERENCE_SELECTED_VERSION_TYPE, versionImageType);
         editor.commit();
-        
+
         mSelectedVersion = null;
     }
-    
+
     public void setSelectedStore(Store selectedStore)
     {
         int storeNumber = selectedStore != null ? selectedStore.getNumber() : 0;
@@ -751,7 +795,7 @@
         Editor editor = mSharedPreferences.edit();
         editor.putInt(PREFERENCE_SELECTED_STORE_NUMBER, storeNumber);
         editor.commit();
-        
+
         mSelectedStore = null;
     }
 
@@ -787,7 +831,7 @@
         {
             Toast.makeText(this, "Widget start", Toast.LENGTH_LONG).show();
         }
-        
+
         // check current state
         mCurrentState = getCurrentUpdaterState();
 
@@ -865,5 +909,5 @@
     {
         mLatestUpdateDownloadId = latestUpdateDownloadId;
         savePreference(PREFERENCE_DOWNLOAD_ID, mLatestUpdateDownloadId);
-    }  
+    }
 }
diff --git a/src/com/fairphone/updater/data/VersionParserHelper.java b/src/com/fairphone/updater/data/VersionParserHelper.java
index faa3651..9fbc205 100644
--- a/src/com/fairphone/updater/data/VersionParserHelper.java
+++ b/src/com/fairphone/updater/data/VersionParserHelper.java
@@ -48,27 +48,6 @@
     private static final String CURRENT_VERSION_IMAGE_TYPE = "fairphone.ota.image_type";
     private static final String CURRENT_VERSION_BUILD_DATE = "ro.build.date.utc";
 
-    public static String getFilenameFromDownloadableItem(DownloadableItem item)
-    {
-        StringBuilder filename = new StringBuilder();
-        filename.append("fp_");
-        if (item != null)
-        {
-            if (item instanceof Version)
-            {
-                filename.append("update_");
-
-            }
-            else if (item instanceof Store)
-            {
-                filename.append("store_");
-            }
-            filename.append(item.getNumber());
-        }
-        filename.append(".zip");
-        return filename.toString();
-    }
-
     public static Version getDeviceVersion(Context context)
     {
 
diff --git a/src/com/fairphone/updater/fragments/DownloadAndRestartFragment.java b/src/com/fairphone/updater/fragments/DownloadAndRestartFragment.java
index b310a8c..66c111f 100644
--- a/src/com/fairphone/updater/fragments/DownloadAndRestartFragment.java
+++ b/src/com/fairphone/updater/fragments/DownloadAndRestartFragment.java
@@ -33,14 +33,13 @@
 import android.widget.Toast;
 
 import com.fairphone.updater.FairphoneUpdater;
-import com.fairphone.updater.UpdaterService;
 import com.fairphone.updater.FairphoneUpdater.HeaderType;
 import com.fairphone.updater.FairphoneUpdater.UpdaterState;
 import com.fairphone.updater.R;
+import com.fairphone.updater.UpdaterService;
 import com.fairphone.updater.data.DownloadableItem;
 import com.fairphone.updater.data.Store;
 import com.fairphone.updater.data.Version;
-import com.fairphone.updater.data.VersionParserHelper;
 import com.fairphone.updater.tools.Utils;
 import com.stericson.RootTools.RootTools;
 import com.stericson.RootTools.exceptions.RootDeniedException;
@@ -209,24 +208,7 @@
 
     private void updateHeader()
     {
-        if (mIsVersion)
-        {
-            updateVersionHeader();
-        }
-        else
-        {
-            updateAppStoreHeader();
-        }
-    }
-
-    private void updateAppStoreHeader()
-    {
-        mainActivity.updateHeader(HeaderType.MAIN_FAIRPHONE, "", false);
-    }
-
-    private void updateVersionHeader()
-    {
-        if (mSelectedVersion != null)
+        if (mIsVersion && mSelectedVersion != null)
         {
             if (Version.IMAGE_TYPE_FAIRPHONE.equalsIgnoreCase(mSelectedVersion.getImageType()))
             {
@@ -237,6 +219,10 @@
                 mainActivity.updateHeader(HeaderType.MAIN_ANDROID, "", false);
             }
         }
+        else if (mSelectedStore != null)
+        {
+            mainActivity.updateHeader(HeaderType.MAIN_APP_STORE, "", false);
+        }
         else
         {
             mainActivity.updateHeader(HeaderType.MAIN_FAIRPHONE, "", false);
@@ -251,8 +237,6 @@
             @Override
             public void run()
             {
-
-                System.out.println(" +++++++++++++++++++++++++++++++ running startDownloadProgressUpdateThread +++++++++++++++++++++++++++++++ ");
                 boolean downloading = true;
 
                 long latestUpdateDownloadId = 0;
@@ -264,14 +248,12 @@
                     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)
                 {
@@ -281,10 +263,6 @@
 
                     Cursor cursor = mDownloadManager != null ? mDownloadManager.query(q) : null;
 
-                    if (cursor == null)
-                    {
-                        System.out.println(" +++++++++++++++++++++++++++++++ cursor is null +++++++++++++++++++++++++++++++ ");
-                    }
                     if (cursor != null && cursor.moveToFirst())
                     {
                         try
@@ -373,13 +351,10 @@
 
         updateHeader();
 
-        if (mIsVersion)
+        DownloadableItem item = mIsVersion ? mSelectedVersion : mSelectedStore;
+        if (item != null)
         {
-            mDownloadVersionName.setText(mainActivity.getVersionName(mSelectedVersion));
-        }
-        else
-        {
-            mDownloadVersionName.setText(mSelectedStore.getName());
+            mDownloadVersionName.setText(mainActivity.getItemName(item));
         }
 
         toggleDownloadProgressAndRestart();
@@ -488,14 +463,10 @@
                         break;
                     case DownloadManager.STATUS_FAILED:
                         Resources resources = getResources();
-                        if (mSelectedVersion != null)
+                        DownloadableItem item = mIsVersion ? mSelectedVersion : mSelectedStore;
+                        if (item != null)
                         {
-                            String downloadTitle = mSelectedVersion.getName() + " " + mSelectedVersion.getImageTypeDescription(resources);
-                            Toast.makeText(mainActivity, resources.getString(R.string.error_downloading) + " " + downloadTitle, Toast.LENGTH_LONG).show();
-                        }
-                        else if (mSelectedStore != null)
-                        {
-                            String downloadTitle = mSelectedStore.getName();
+                            String downloadTitle = Utils.getDownloadTitleFromDownloadableItem(getResources(), item);
                             Toast.makeText(mainActivity, resources.getString(R.string.error_downloading) + " " + downloadTitle, Toast.LENGTH_LONG).show();
                         }
                         else
@@ -590,7 +561,7 @@
         Resources resources = getResources();
         DownloadableItem item = mIsVersion ? mSelectedVersion : mSelectedStore;
 
-        File f = new File("/" + resources.getString(R.string.recoveryCachePath) + "/" + VersionParserHelper.getFilenameFromDownloadableItem(item));
+        File f = new File("/" + resources.getString(R.string.recoveryCachePath) + "/" + Utils.getFilenameFromDownloadableItem(item));
         if (!f.exists())
         {
             abortUpdateProcess();
@@ -598,8 +569,6 @@
         else if (item != null && RootTools.isAccessGiven())
         {
             // set the command for the recovery
-            // Process p;
-
             try
             {
 
@@ -612,13 +581,12 @@
                 if (Utils.hasUnifiedPartition(resources))
                 {
                     Shell.runRootCommand(new CommandCapture(0, "echo '--update_package=/" + resources.getString(R.string.recoveryCachePath) + "/"
-                            + VersionParserHelper.getFilenameFromDownloadableItem(item) + "' >> /cache/recovery/command"));
+                            + Utils.getFilenameFromDownloadableItem(item) + "' >> /cache/recovery/command"));
                 }
                 else
                 {
                     Shell.runRootCommand(new CommandCapture(0, "echo '--update_package=/" + resources.getString(R.string.recoverySdCardPath)
-                            + resources.getString(R.string.updaterFolder) + VersionParserHelper.getFilenameFromDownloadableItem(item)
-                            + "' >> /cache/recovery/command"));
+                            + resources.getString(R.string.updaterFolder) + Utils.getFilenameFromDownloadableItem(item) + "' >> /cache/recovery/command"));
                 }
             } catch (IOException e)
             {
@@ -656,6 +624,7 @@
             try
             {
                 mainActivity.updateStatePreference(UpdaterState.NORMAL);
+                mainActivity.clearSelectedItems();
                 Shell.runRootCommand(new CommandCapture(0, "reboot recovery"));
             } catch (IOException e)
             {
@@ -685,7 +654,7 @@
             CopyFileToCacheTask copyTask = new CopyFileToCacheTask();
             if (item != null)
             {
-                copyTask.execute(file.getPath(), Environment.getDownloadCacheDirectory() + "/" + VersionParserHelper.getFilenameFromDownloadableItem(item));
+                copyTask.execute(file.getPath(), Environment.getDownloadCacheDirectory() + "/" + Utils.getFilenameFromDownloadableItem(item));
             }
             else
             {
@@ -809,8 +778,7 @@
     private String getDownloadPath(DownloadableItem item)
     {
         Resources resources = mainActivity.getResources();
-        return Environment.getExternalStorageDirectory() + resources.getString(R.string.updaterFolder)
-                + VersionParserHelper.getFilenameFromDownloadableItem(item);
+        return Environment.getExternalStorageDirectory() + resources.getString(R.string.updaterFolder) + Utils.getFilenameFromDownloadableItem(item);
     }
 
     public void abortUpdateProcess()
@@ -819,7 +787,6 @@
 
         mainActivity.runOnUiThread(new Runnable()
         {
-
             @Override
             public void run()
             {
@@ -827,6 +794,7 @@
                 if (mainActivity.getFragmentCount() == 1 && mainActivity.getBackStackSize() == 0)
                 {
                     mainActivity.changeState(UpdaterState.NORMAL);
+                    mainActivity.clearSelectedItems();
                 }
                 else
                 {
@@ -834,7 +802,5 @@
                 }
             }
         });
-
     }
-
 }
diff --git a/src/com/fairphone/updater/fragments/MainFragment.java b/src/com/fairphone/updater/fragments/MainFragment.java
index ef06c35..3751710 100644
--- a/src/com/fairphone/updater/fragments/MainFragment.java
+++ b/src/com/fairphone/updater/fragments/MainFragment.java
@@ -150,7 +150,7 @@
             @Override
             public void onClick(View v)
             {
-                VersionDetailFragment fragment = new VersionDetailFragment();
+                VersionDetailFragment fragment = new VersionDetailFragment(true);
 
                 Version latestVersion = mainActivity.getLatestVersion();
                 if (latestVersion != null)
diff --git a/src/com/fairphone/updater/fragments/VersionDetailFragment.java b/src/com/fairphone/updater/fragments/VersionDetailFragment.java
index afc2818..e876f47 100644
--- a/src/com/fairphone/updater/fragments/VersionDetailFragment.java
+++ b/src/com/fairphone/updater/fragments/VersionDetailFragment.java
@@ -24,11 +24,10 @@
 import com.fairphone.updater.FairphoneUpdater.HeaderType;
 import com.fairphone.updater.FairphoneUpdater.UpdaterState;
 import com.fairphone.updater.R;
+import com.fairphone.updater.data.DownloadableItem;
 import com.fairphone.updater.data.Store;
 import com.fairphone.updater.data.Version;
-import com.fairphone.updater.data.VersionParserHelper;
 import com.fairphone.updater.fragments.ConfirmationPopupDialog.ConfirmationPopupDialogListener;
-import com.fairphone.updater.fragments.VersionDetailFragment.DetailLayoutType;
 import com.fairphone.updater.tools.Utils;
 
 public class VersionDetailFragment extends BaseFragment
@@ -53,9 +52,15 @@
     private DetailLayoutType mDetailLayoutType;
     private boolean mIsOSChange;
     private boolean mIsOlderVersion;
-
-    // store download
     private Store mSelectedStore;
+    private boolean mIsVersion;
+
+    public VersionDetailFragment(boolean isVersion)
+    {
+        super();
+
+        mIsVersion = isVersion;
+    }
 
     @Override
     public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
@@ -109,7 +114,7 @@
             @Override
             public void onClick(View v)
             {
-                startItemDownload();
+                startDownload();
             }
         });
     }
@@ -133,26 +138,21 @@
 
     private void updateReleaseNotesText()
     {
-        if (mSelectedVersion != null)
+        DownloadableItem item = mIsVersion ? mSelectedVersion : mSelectedStore;
+        if (item != null)
         {
-            mVersion_release_notes_text.setText(mSelectedVersion.getReleaseNotes(Locale.getDefault().getLanguage()));
-        }
-        else if (mSelectedStore != null)
-        {
-            mVersion_release_notes_text.setText(mSelectedStore.getReleaseNotes(Locale.getDefault().getLanguage()));
+            mVersion_release_notes_text.setText(item.getReleaseNotes(Locale.getDefault().getLanguage()));
         }
     }
 
     private void updateVersionName()
     {
+        DownloadableItem item = mIsVersion ? mSelectedVersion : mSelectedStore;
+
         mVersion_details_title_text.setText(mVersionDetailsTitle);
-        if (mSelectedVersion != null)
+        if (item != null)
         {
-            mVersion_details_name_text.setText(mainActivity.getVersionName(mSelectedVersion));
-        }
-        else if (mSelectedStore != null)
-        {
-            mVersion_details_name_text.setText(mSelectedStore.getName());
+            mVersion_details_name_text.setText(mainActivity.getItemName(item));
         }
     }
 
@@ -177,8 +177,8 @@
 
         Resources resources = mainActivity.getResources();
         Version deviceVersion = mainActivity.getDeviceVersion();
-        
-        if (mSelectedVersion != null)
+
+        if (mIsVersion && mSelectedVersion != null)
         {
             mHeaderType = mainActivity.getHeaderTypeFromImageType(mSelectedVersion != null ? mSelectedVersion.getImageType() : "");
         }
@@ -202,21 +202,21 @@
                 break;
 
             case ANDROID:
-                mHeaderText = mainActivity.getVersionName(mSelectedVersion);
+                mHeaderText = mainActivity.getItemName(mSelectedVersion);
                 mVersionDetailsTitle = resources.getString(R.string.new_os);
                 mIsOSChange = deviceVersion.getImageType().equalsIgnoreCase(Version.IMAGE_TYPE_FAIRPHONE);
                 mIsOlderVersion =
                         (deviceVersion.getImageType().equalsIgnoreCase(Version.IMAGE_TYPE_AOSP) && deviceVersion.isNewerVersionThan(mSelectedVersion));
                 break;
             case APP_STORE:
-                mHeaderText = mSelectedStore.getName();
+                mHeaderText = mainActivity.getItemName(mSelectedStore);
                 mVersionDetailsTitle = resources.getString(R.string.install);
                 mIsOSChange = false;
                 mIsOlderVersion = false;
                 break;
             case FAIRPHONE:
             default:
-                mHeaderText = mainActivity.getVersionName(mSelectedVersion);
+                mHeaderText = mainActivity.getItemName(mSelectedVersion);
                 mVersionDetailsTitle = resources.getString(R.string.older_version);
                 mIsOSChange = deviceVersion.getImageType().equalsIgnoreCase(Version.IMAGE_TYPE_AOSP);
                 mIsOlderVersion =
@@ -257,71 +257,20 @@
 
         return request;
     }
-    
-    public void startUpdateStoreDownload()
-    {
-
-        // use only on WiFi
-        if (isWiFiEnabled())
-        {
-            if (mSelectedStore != null)
-            {
-                // set the download for the latest version on the download
-                // manager
-                String fileName = VersionParserHelper.getFilenameFromDownloadableItem(mSelectedStore);
-                String downloadTitle = mSelectedStore.getName();
-                Request request = createDownloadRequest(mSelectedStore.getDownloadLink() + Utils.getModelAndOS(mainActivity), fileName, downloadTitle);
-                if (request != null && mDownloadManager != null)
-                {
-                    long mLatestUpdateDownloadId = mDownloadManager.enqueue(request);
-
-                    // save it on the shared preferences
-                    mainActivity.saveLatestUpdateDownloadId(mLatestUpdateDownloadId);
-
-                    // change state to download
-                    mainActivity.changeState(UpdaterState.DOWNLOAD);
-                }
-                else
-                {
-                    Toast.makeText(mainActivity, getResources().getString(R.string.error_downloading) + " " + downloadTitle, Toast.LENGTH_LONG).show();
-                }
-            }
-        }
-        else
-        {
-            Resources resources = this.getResources();
-
-            AlertDialog.Builder disclaimerDialog = new AlertDialog.Builder(mainActivity);
-
-            disclaimerDialog.setTitle(resources.getString(R.string.wifi_disabled));
-
-            // Setting Dialog Message
-            disclaimerDialog.setMessage(resources.getString(R.string.wifi_discaimer_message));
-            disclaimerDialog.setPositiveButton(resources.getString(android.R.string.ok), new DialogInterface.OnClickListener()
-            {
-                public void onClick(DialogInterface dialog, int id)
-                {
-                    // do nothing, since the state is still the same
-                }
-            });
-            disclaimerDialog.create();
-            disclaimerDialog.show();
-        }
-    }
 
     public void startUpdateDownload()
     {
-
+        DownloadableItem item = mIsVersion ? mSelectedVersion : mSelectedStore;
         // use only on WiFi
         if (isWiFiEnabled())
         {
-            if (mSelectedVersion != null)
+            if (item != null)
             {
                 // set the download for the latest version on the download
                 // manager
-                String fileName = VersionParserHelper.getFilenameFromDownloadableItem(mSelectedVersion);
-                String downloadTitle = mSelectedVersion.getName() + " " + mSelectedVersion.getImageTypeDescription(getResources());
-                Request request = createDownloadRequest(mSelectedVersion.getDownloadLink() + Utils.getModelAndOS(mainActivity), fileName, downloadTitle);
+                String fileName = Utils.getFilenameFromDownloadableItem(item);
+                String downloadTitle = Utils.getDownloadTitleFromDownloadableItem(getResources(), item);
+                Request request = createDownloadRequest(item.getDownloadLink() + Utils.getModelAndOS(mainActivity), fileName, downloadTitle);
                 if (request != null && mDownloadManager != null)
                 {
                     long mLatestUpdateDownloadId = mDownloadManager.enqueue(request);
@@ -342,21 +291,21 @@
         {
             Resources resources = this.getResources();
 
-            AlertDialog.Builder disclaimerDialog = new AlertDialog.Builder(mainActivity);
+            AlertDialog.Builder wifiOffDialog = new AlertDialog.Builder(mainActivity);
 
-            disclaimerDialog.setTitle(resources.getString(R.string.wifi_disabled));
+            wifiOffDialog.setTitle(resources.getString(R.string.wifi_disabled));
 
             // Setting Dialog Message
-            disclaimerDialog.setMessage(resources.getString(R.string.wifi_discaimer_message));
-            disclaimerDialog.setPositiveButton(resources.getString(android.R.string.ok), new DialogInterface.OnClickListener()
+            wifiOffDialog.setMessage(resources.getString(R.string.wifi_discaimer_message));
+            wifiOffDialog.setPositiveButton(resources.getString(android.R.string.ok), new DialogInterface.OnClickListener()
             {
                 public void onClick(DialogInterface dialog, int id)
                 {
                     // do nothing, since the state is still the same
                 }
             });
-            disclaimerDialog.create();
-            disclaimerDialog.show();
+            wifiOffDialog.create();
+            wifiOffDialog.show();
         }
     }
 
@@ -382,81 +331,40 @@
         popupDialog.show(fm, version);
     }
 
-    public void startItemDownload()
+    public void startDownload()
     {
-        if (mDetailLayoutType == DetailLayoutType.APP_STORE)
+        if (mIsVersion && mSelectedVersion != null)
         {
-            startStoreDownload();
-        }
-        else
-        {
-            startVersionDownload();
-        }
-    }
-
-    private void startStoreDownload()
-    {
-        if (mSelectedStore != null)
-        {
-            mainActivity.setSelectedStore(mSelectedStore);
-            startStoreInstall();
-        }
-    }
-
-    public void startVersionDownload()
-    {
-        if (!Utils.areGappsInstalling(mainActivity))
-        {
-            if (mSelectedVersion != null)
+            if (mIsOSChange || mIsOlderVersion)
             {
-                if (mIsOSChange || mIsOlderVersion)
-                {
-                    showPopupDialog(mainActivity.getVersionName(mSelectedVersion), mSelectedVersion.hasEraseAllPartitionWarning(),
-                            new ConfirmationPopupDialogListener()
+                showPopupDialog(mainActivity.getItemName(mSelectedVersion), mSelectedVersion.hasEraseAllPartitionWarning(),
+                        new ConfirmationPopupDialogListener()
+                        {
+
+                            @Override
+                            public void onFinishPopUpDialog(boolean isOk)
                             {
-
-                                @Override
-                                public void onFinishPopUpDialog(boolean isOk)
+                                if (isOk)
                                 {
-                                    if (isOk)
-                                    {
-                                        mainActivity.setSelectedVersion(mSelectedVersion);
-                                        showEraseAllDataWarning(true);
-                                    }
+                                    mainActivity.setSelectedVersion(mSelectedVersion);
+                                    showEraseAllDataWarning(true);
                                 }
-                            });
-                }
-                else
-                {
-                    mainActivity.setSelectedVersion(mSelectedVersion);
-                    showEraseAllDataWarning(false);
-                }
-            }
-        }
-        else
-        {
-            showGappsInstalingWarning();
-        }
-    }
-
-    private void startStoreInstall()
-    {
-
-        final UpdaterState currentState = mainActivity.getCurrentUpdaterState();
-
-        if (mSelectedStore != null)
-        {
-            if (currentState == UpdaterState.NORMAL)
-            {
-                startUpdateStoreDownload();
+                            }
+                        });
             }
             else
             {
-                mainActivity.setSelectedStore(null);
+                mainActivity.setSelectedVersion(mSelectedVersion);
+                showEraseAllDataWarning(false);
             }
         }
+        else if (mSelectedStore != null)
+        {
+            mainActivity.setSelectedStore(mSelectedStore);
+            showStoreDisclaimer();
+        }
     }
-    
+
     private void showEraseAllDataWarning(boolean bypassEraseAllWarning)
     {
 
@@ -497,18 +405,42 @@
         }
     }
 
-    private void showGappsInstalingWarning()
+    protected void showStoreDisclaimer()
     {
-        new AlertDialog.Builder(mainActivity).setTitle(android.R.string.dialog_alert_title).setMessage(R.string.updater_google_apps_installing_description)
-                .setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener()
-                {
+        final UpdaterState currentState = mainActivity.getCurrentUpdaterState();
 
-                    @Override
-                    public void onClick(DialogInterface dialog, int which)
+        if (mSelectedStore != null && mSelectedStore.showDisclaimer())
+        {
+            new AlertDialog.Builder(mainActivity).setTitle(R.string.google_apps_disclaimer_title).setMessage(R.string.google_apps_disclaimer_description)
+                    .setPositiveButton(R.string.google_apps_disclaimer_agree, new DialogInterface.OnClickListener()
                     {
-                        // close dialog
-                    }
-                }).show();
-    }
 
+                        @Override
+                        public void onClick(DialogInterface dialog, int which)
+                        {
+                            if (currentState == UpdaterState.NORMAL)
+                            {
+                                startUpdateDownload();
+                            }
+                        }
+                    }).setNegativeButton(android.R.string.cancel, new DialogInterface.OnClickListener()
+                    {
+                        public void onClick(DialogInterface dialog, int which)
+                        {
+                            mainActivity.setSelectedStore(null);
+                        }
+                    }).show();
+        }
+        else
+        {
+            if (currentState == UpdaterState.NORMAL)
+            {
+                startUpdateDownload();
+            }
+            else
+            {
+                mainActivity.setSelectedStore(null);
+            }
+        }
+    }
 }
diff --git a/src/com/fairphone/updater/fragments/VersionListFragment.java b/src/com/fairphone/updater/fragments/VersionListFragment.java
index ff0f208..67bc21f 100644
--- a/src/com/fairphone/updater/fragments/VersionListFragment.java
+++ b/src/com/fairphone/updater/fragments/VersionListFragment.java
@@ -120,7 +120,7 @@
 
                     if (selectedStore != null)
                     {
-                        VersionDetailFragment versionDetail = new VersionDetailFragment();
+                        VersionDetailFragment versionDetail = new VersionDetailFragment(false);
 
                         versionDetail.setupFragment(selectedStore, DetailLayoutType.APP_STORE);
 
@@ -170,7 +170,7 @@
 
                 mVersionListContainer.addView(versionLayout);
 
-                versionLayout.setText(mainActivity.getVersionName(version));
+                versionLayout.setText(mainActivity.getItemName(version));
 
                 versionLayout.setOnClickListener(new OnClickListener()
                 {
@@ -181,7 +181,7 @@
 
                         if (selectedVersion != null)
                         {
-                            VersionDetailFragment versionDetail = new VersionDetailFragment();
+                            VersionDetailFragment versionDetail = new VersionDetailFragment(true);
 
                             versionDetail.setupFragment(selectedVersion, DetailLayoutType.FAIRPHONE);
 
@@ -205,7 +205,7 @@
     private void setupFairphoneLatestVersion()
     {
         final Version latestFairphoneVersion = UpdaterData.getInstance().getLatestVersion(Version.IMAGE_TYPE_FAIRPHONE);
-        mLatestVersionDetailsButton.setText(mainActivity.getVersionName(latestFairphoneVersion));
+        mLatestVersionDetailsButton.setText(mainActivity.getItemName(latestFairphoneVersion));
 
         if (mainActivity.getDeviceVersion().compareTo(latestFairphoneVersion) == 0)
         {
@@ -224,7 +224,7 @@
             {
                 if (latestFairphoneVersion != null)
                 {
-                    VersionDetailFragment versionDetail = new VersionDetailFragment();
+                    VersionDetailFragment versionDetail = new VersionDetailFragment(true);
 
                     versionDetail.setupFragment(latestFairphoneVersion, DetailLayoutType.FAIRPHONE);
 
@@ -252,7 +252,7 @@
 
                 mVersionListContainer.addView(versionLayout);
 
-                versionLayout.setText(mainActivity.getVersionName(version));
+                versionLayout.setText(mainActivity.getItemName(version));
 
                 versionLayout.setOnClickListener(new OnClickListener()
                 {
@@ -264,7 +264,7 @@
 
                         if (selectedVersion != null)
                         {
-                            VersionDetailFragment versionDetail = new VersionDetailFragment();
+                            VersionDetailFragment versionDetail = new VersionDetailFragment(true);
 
                             versionDetail.setupFragment(selectedVersion, DetailLayoutType.ANDROID);
 
@@ -288,7 +288,7 @@
     private void setupAndroidLatestVersion()
     {
         final Version latestAOSPVersion = UpdaterData.getInstance().getLatestVersion(Version.IMAGE_TYPE_AOSP);
-        mLatestVersionDetailsButton.setText(mainActivity.getVersionName(latestAOSPVersion));
+        mLatestVersionDetailsButton.setText(mainActivity.getItemName(latestAOSPVersion));
 
         if (mainActivity.getDeviceVersion().compareTo(latestAOSPVersion) == 0)
         {
@@ -307,7 +307,7 @@
             {
                 if (latestAOSPVersion != null)
                 {
-                    VersionDetailFragment versionDetail = new VersionDetailFragment();
+                    VersionDetailFragment versionDetail = new VersionDetailFragment(true);
 
                     versionDetail.setupFragment(latestAOSPVersion, DetailLayoutType.ANDROID);
 
diff --git a/src/com/fairphone/updater/gappsinstaller/GappsInstallerHelper.java b/src/com/fairphone/updater/gappsinstaller/GappsInstallerHelper.java
index a525a11..8557b29 100644
--- a/src/com/fairphone/updater/gappsinstaller/GappsInstallerHelper.java
+++ b/src/com/fairphone/updater/gappsinstaller/GappsInstallerHelper.java
@@ -30,7 +30,6 @@
 
     public static final String PREFS_GOOGLE_APPS_INSTALLER_DATA = "FAIRPHONE_GOOGLE_APPS_INSTALLER_DATA";
     public static final String GOOGLE_APPS_INSTALLER_STATE = "com.fairphone.updater.gapps.WIDGET_STATE";
-    public static final String GAPPS_REINSTALATION = "com.fairphone.updater.gapps.GAPPS_REINSTALATION_REQUEST";
 
     public static final int GAPPS_STATES_INITIAL = 0;
     public static final int GAPPS_INSTALLED_STATE = 1;
diff --git a/src/com/fairphone/updater/tools/Utils.java b/src/com/fairphone/updater/tools/Utils.java
index c92368c..e6fdbad 100644
--- a/src/com/fairphone/updater/tools/Utils.java
+++ b/src/com/fairphone/updater/tools/Utils.java
@@ -29,19 +29,17 @@
 import android.app.ActivityManager.RunningServiceInfo;
 import android.content.Context;
 import android.content.Intent;
-import android.content.SharedPreferences;
 import android.content.res.Resources;
 import android.os.Build;
 import android.os.Environment;
 import android.util.Log;
 
-import com.fairphone.updater.FairphoneUpdater;
 import com.fairphone.updater.R;
-import com.fairphone.updater.FairphoneUpdater.UpdaterState;
 import com.fairphone.updater.UpdaterService;
+import com.fairphone.updater.data.DownloadableItem;
+import com.fairphone.updater.data.Store;
 import com.fairphone.updater.data.Version;
 import com.fairphone.updater.data.VersionParserHelper;
-import com.fairphone.updater.gappsinstaller.GappsInstallerHelper;
 
 public class Utils
 {
@@ -80,23 +78,6 @@
         return availableBlocks;
     }
 
-    public static boolean areGappsInstalling(Context context)
-    {
-        SharedPreferences gappsSharedPrefs = context.getSharedPreferences(GappsInstallerHelper.PREFS_GOOGLE_APPS_INSTALLER_DATA, Context.MODE_PRIVATE);
-
-        int currentState = gappsSharedPrefs.getInt(GappsInstallerHelper.GOOGLE_APPS_INSTALLER_STATE, GappsInstallerHelper.GAPPS_STATES_INITIAL);
-        return currentState != GappsInstallerHelper.GAPPS_STATES_INITIAL && currentState != GappsInstallerHelper.GAPPS_INSTALLED_STATE;
-    }
-
-    public static boolean isUpdaterInstalling(Context context)
-    {
-        SharedPreferences updaterSharedPrefs = context.getSharedPreferences(FairphoneUpdater.FAIRPHONE_UPDATER_PREFERENCES, Context.MODE_PRIVATE);
-
-        String currentState = updaterSharedPrefs.getString(FairphoneUpdater.PREFERENCE_CURRENT_UPDATER_STATE, UpdaterState.NORMAL.name());
-        UpdaterState state = UpdaterState.valueOf(currentState);
-        return state != UpdaterState.NORMAL;
-    }
-
     public static void startUpdaterService(Context context, boolean forceDownload)
     {
         boolean isRunning = isServiceRunning(context);
@@ -316,4 +297,41 @@
         double cacheSize = Utils.getPartitionSizeInBytes(Environment.getDownloadCacheDirectory());
         return cacheSize >= fileSize;
     }
+    public static String getFilenameFromDownloadableItem(DownloadableItem item)
+    {
+        StringBuilder filename = new StringBuilder();
+        filename.append("fp_");
+        if (item != null)
+        {
+            if (item instanceof Version)
+            {
+                filename.append("update_");
+            }
+            else if (item instanceof Store)
+            {
+                filename.append("store_");
+            }
+            filename.append(item.getNumber());
+        }
+        filename.append(".zip");
+        return filename.toString();
+    }
+    
+    public static String getDownloadTitleFromDownloadableItem(Resources resources, DownloadableItem item){
+        String title = "";
+        if (item != null)
+        {
+            if (item instanceof Version)
+            {
+                Version version = (Version) item;
+                title = version.getName() + " " + version.getImageTypeDescription(resources);
+            }
+            else if (item instanceof Store)
+            {
+                Store store = (Store) item;
+                title = store.getName();
+            }
+        }
+        return title;
+    }
 }