diff --git a/AndroidManifest.xml b/AndroidManifest.xml
index 4ae6970..92867d9 100644
--- a/AndroidManifest.xml
+++ b/AndroidManifest.xml
@@ -44,7 +44,6 @@
             <intent-filter>
                 <action android:name="android.intent.action.BOOT_COMPLETED" />
                 <action android:name="android.intent.action.QUICKBOOT_POWERON" />
-                <action android:name="android.intent.action.ACTION_POWER_CONNECTED" />
             </intent-filter>
         </receiver>
 
diff --git a/res/drawable-hdpi/updater_white.png b/res/drawable-hdpi/updater_white.png
new file mode 100755
index 0000000..3037ce2
--- /dev/null
+++ b/res/drawable-hdpi/updater_white.png
Binary files differ
diff --git a/res/drawable-mdpi/updater_white.png b/res/drawable-mdpi/updater_white.png
new file mode 100755
index 0000000..9669692
--- /dev/null
+++ b/res/drawable-mdpi/updater_white.png
Binary files differ
diff --git a/res/drawable-xhdpi/updater_white.png b/res/drawable-xhdpi/updater_white.png
new file mode 100755
index 0000000..544dc37
--- /dev/null
+++ b/res/drawable-xhdpi/updater_white.png
Binary files differ
diff --git a/res/drawable-xxhdpi/updater_white.png b/res/drawable-xxhdpi/updater_white.png
new file mode 100755
index 0000000..54a5956
--- /dev/null
+++ b/res/drawable-xxhdpi/updater_white.png
Binary files differ
diff --git a/res/drawable-xxxhdpi/updater_white.png b/res/drawable-xxxhdpi/updater_white.png
new file mode 100755
index 0000000..508cf5c
--- /dev/null
+++ b/res/drawable-xxxhdpi/updater_white.png
Binary files differ
diff --git a/res/values/config.xml b/res/values/config.xml
index 1b3970b..e29ac31 100644
--- a/res/values/config.xml
+++ b/res/values/config.xml
@@ -7,7 +7,7 @@
 	<string name="config_xml" translatable="false">.xml</string>
 	<string name="config_sig" translatable="false">.sig</string>
 	
-    <integer name="defaultVersionNumber">1</integer>
+    <string name="defaultVersionId">1</string>
     <string name="defaultVersionName" translatable="false">Almond</string>
     <string name="defaultBuildNumber" translatable="false">1.0</string>
     <string name="defaultBuildDate" translatable="false">0</string>
@@ -16,7 +16,7 @@
     <string name="defaultBetaStatus" translatable="false">0</string>
     
     <!-- Device Model without spaces separated by semicolon. Ex: FP1;FP1U;FP2 -->
-    <string name="knownFPDevices" translatable="false">FP1;FP1U</string>
+    <string name="knownFPDevices" translatable="false">FP1;FP1U;FP2</string>
     
     <string name="oneGBDataPartition" translatable="false">/originalPartition</string>
 	<string name="unifiedDataPartition" translatable="false">/unifiedPartition</string>
@@ -25,6 +25,8 @@
 	<string name="recoverySdCardPath" translatable="false">/sdcard</string>
 	<string name="updaterFolder" translatable="false">/updater/</string>
 	<integer name="FP1DataPartitionSizeMb">1100</integer>
+
+	<string name="FP2Model" translatable="false">FP2</string>
 	
 	<!-- Packager -->
 	<string name="removePlayStoreCommand" translatable="false">rm /data/app/com.android.vending-*.apk</string>
diff --git a/src/com/fairphone/updater/FairphoneUpdater.java b/src/com/fairphone/updater/FairphoneUpdater.java
index c86898d..285afbb 100644
--- a/src/com/fairphone/updater/FairphoneUpdater.java
+++ b/src/com/fairphone/updater/FairphoneUpdater.java
@@ -200,13 +200,23 @@
     void getSelectedVersionFromSharedPreferences()
     {
         String versionImageType = mSharedPreferences.getString(PREFERENCE_SELECTED_VERSION_TYPE, "");
-        int versionNumber = mSharedPreferences.getInt(PREFERENCE_SELECTED_VERSION_NUMBER, 0);
+        String versionNumber = "0";
+        try {
+            versionNumber = mSharedPreferences.getString(PREFERENCE_SELECTED_VERSION_NUMBER, "0");
+        } catch (ClassCastException e) {
+            versionNumber = Integer.toString(mSharedPreferences.getInt(PREFERENCE_SELECTED_VERSION_NUMBER, 0));
+        }
         mSelectedVersion = UpdaterData.getInstance().getVersion(versionImageType, versionNumber);
     }
 
     void getSelectedStoreFromSharedPreferences()
     {
-        int storeNumber = mSharedPreferences.getInt(PREFERENCE_SELECTED_STORE_NUMBER, -1);
+        String storeNumber = "-1";
+        try {
+            storeNumber = mSharedPreferences.getString(PREFERENCE_SELECTED_STORE_NUMBER, "-1");
+        } catch (ClassCastException e) {
+            storeNumber = Integer.toString(mSharedPreferences.getInt(PREFERENCE_SELECTED_STORE_NUMBER, -1));
+        }
         mSelectedStore = UpdaterData.getInstance().getStore(storeNumber);
     }
 
@@ -619,7 +629,7 @@
         {
             if(isVersion)
             {
-                itemName = getVersionName((Version) item);
+                itemName = ((Version) item).getHumanReadableName();
             }
             else
             {
@@ -629,18 +639,7 @@
         return itemName;
     }
 
-    public String getVersionName(Version version)
-    {
-        String itemName = "";
-        if (version != null)
-        {
-            if(mCurrentState != UpdaterState.ZIP_INSTALL) {
-                itemName = version.getImageTypeDescription(getResources()) + " ";
-            }
-            itemName += version.getName() + " " + version.getBuildNumber();
-        }
-        return itemName;
-    }
+
 
     public static String getStoreName(Store store)
     {
@@ -654,12 +653,12 @@
 
     public String getDeviceVersionName()
     {
-        return getVersionName(mDeviceVersion);
+        return mDeviceVersion.getHumanReadableName();
     }
 
     public String getLatestVersionName()
     {
-        return getVersionName(mLatestVersion);
+        return mLatestVersion.getHumanReadableName();
     }
 
     public Version getDeviceVersion()
@@ -698,25 +697,25 @@
 
     public void setSelectedVersion(Version selectedVersion)
     {
-        int versionNumber = selectedVersion != null ? selectedVersion.getNumber() : 0;
+        String versionNumber = selectedVersion != null ? selectedVersion.getId() : "0";
         String versionImageType = selectedVersion != null ? selectedVersion.getImageType() : "";
 
         clearSelectedVersion(versionNumber, versionImageType);
 
         mSelectedVersion = UpdaterData.getInstance().getVersion(versionImageType, versionNumber);
-        clearSelectedStore(-1);
+        clearSelectedStore("-1");
     }
 
     public void clearSelectedItems()
     {
-        clearSelectedVersion(0, "");
-        clearSelectedStore(-1);
+        clearSelectedVersion("0", "");
+        clearSelectedStore("-1");
     }
 
-    private void clearSelectedVersion(int versionNumber, String versionImageType)
+    private void clearSelectedVersion(String versionNumber, String versionImageType)
     {
         Editor editor = mSharedPreferences.edit();
-        editor.putInt(PREFERENCE_SELECTED_VERSION_NUMBER, versionNumber);
+        editor.putString(PREFERENCE_SELECTED_VERSION_NUMBER, versionNumber);
         editor.putString(PREFERENCE_SELECTED_VERSION_TYPE, versionImageType);
         editor.commit();
 
@@ -725,18 +724,18 @@
 
     public void setSelectedStore(Store selectedStore)
     {
-        int storeNumber = selectedStore != null ? selectedStore.getNumber() : -1;
+        String storeNumber = selectedStore != null ? selectedStore.getId() : "-1";
 
         clearSelectedStore(storeNumber);
 
         mSelectedStore = UpdaterData.getInstance().getStore(storeNumber);
-        clearSelectedVersion(0, "");
+        clearSelectedVersion("0", "");
     }
 
-    private void clearSelectedStore(int storeNumber)
+    private void clearSelectedStore(String storeNumber)
     {
         Editor editor = mSharedPreferences.edit();
-        editor.putInt(PREFERENCE_SELECTED_STORE_NUMBER, storeNumber);
+        editor.putString(PREFERENCE_SELECTED_STORE_NUMBER, storeNumber);
         editor.commit();
 
         mSelectedStore = null;
diff --git a/src/com/fairphone/updater/UpdaterService.java b/src/com/fairphone/updater/UpdaterService.java
index dbb0303..598bc4b 100644
--- a/src/com/fairphone/updater/UpdaterService.java
+++ b/src/com/fairphone/updater/UpdaterService.java
@@ -31,7 +31,6 @@
 import android.content.SharedPreferences.Editor;
 import android.content.res.Resources;
 import android.database.Cursor;
-import android.graphics.BitmapFactory;
 import android.net.ConnectivityManager;
 import android.net.Uri;
 import android.os.Build;
@@ -153,7 +152,7 @@
         
         PendingIntent contentIntent = PendingIntent.getActivity(context, 0, notificationIntent, 0);
 
-	    NotificationCompat.Builder mBuilder = new NotificationCompat.Builder(context).setSmallIcon(R.drawable.updater_tray_icon)
+	NotificationCompat.Builder mBuilder = new NotificationCompat.Builder(context).setSmallIcon(R.drawable.updater_white)
 			    .setContentTitle(context.getResources().getString(R.string.app_full_name))
 			    .setContentText(context.getResources().getString(R.string.appStoreReinstall))
 			    .setAutoCancel(true)
@@ -329,7 +328,7 @@
                 final String defaultCharset = Charset.defaultCharset().displayName();
                 sb.append("&os=").append(URLEncoder.encode(currentVersion.getAndroidVersion(), defaultCharset));
                 sb.append("&b_n=").append(URLEncoder.encode(currentVersion.getBuildNumber(), defaultCharset));
-                sb.append("&ota_v_n=").append(URLEncoder.encode(String.valueOf(currentVersion.getNumber()), defaultCharset));
+                sb.append("&ota_v_n=").append(URLEncoder.encode(String.valueOf(currentVersion.getId()), defaultCharset));
                 sb.append("&d=").append(URLEncoder.encode(currentVersion.getReleaseDate(), defaultCharset));
                 sb.append("&beta=").append(URLEncoder.encode(currentVersion.getBetaStatus(), defaultCharset));
                 sb.append("&dev=").append(FairphoneUpdater.DEV_MODE_ENABLED ? "1" : "0");
@@ -352,8 +351,7 @@
         NotificationManager manager = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
 
         NotificationCompat.Builder builder =
-                new NotificationCompat.Builder(context).setSmallIcon(R.drawable.updater_tray_icon_small)
-                        .setLargeIcon(BitmapFactory.decodeResource(context.getResources(), R.drawable.updater_tray_icon))
+                new NotificationCompat.Builder(context).setSmallIcon(R.drawable.updater_white)
                         .setContentTitle(context.getResources().getString(R.string.app_full_name))
                         .setContentText(context.getResources().getString(R.string.fairphone_update_message));
 
@@ -613,7 +611,6 @@
         {
 
             boolean removeReceiver = false;
-
             DownloadManager.Query query = new DownloadManager.Query();
 
             query.setFilterById(mLatestFileDownloadId);
@@ -668,4 +665,4 @@
             }
         }
     }
-}
\ No newline at end of file
+}
diff --git a/src/com/fairphone/updater/data/DownloadableItem.java b/src/com/fairphone/updater/data/DownloadableItem.java
index 1513fca..f631809 100644
--- a/src/com/fairphone/updater/data/DownloadableItem.java
+++ b/src/com/fairphone/updater/data/DownloadableItem.java
@@ -16,19 +16,19 @@
 
 package com.fairphone.updater.data;
 
-import java.util.HashMap;
-import java.util.Map;
-
 import android.text.TextUtils;
 import android.util.Log;
 
+import java.util.HashMap;
+import java.util.Map;
+
 public abstract class DownloadableItem
 {
     private static final String TAG = DownloadableItem.class.getSimpleName();
 
     public static final String DEFAULT_NOTES_LANG = "en";
 
-    private int mNumber;
+    private String mId;
 
     private String mName;
 
@@ -46,7 +46,7 @@
 
     DownloadableItem()
     {
-        mNumber = 0;
+        mId = "";
         mName = "";
         mOTADownloadLink = "";
         mOTAMd5Sum = "";
@@ -59,7 +59,7 @@
 
     DownloadableItem(DownloadableItem other)
     {
-        mNumber = other.mNumber;
+        mId = other.mId;
         mName = other.mName;
         mOTADownloadLink = other.mOTADownloadLink;
         mOTAMd5Sum = other.mOTAMd5Sum;
@@ -70,26 +70,14 @@
         mReleaseNotesMap = other.mReleaseNotesMap;
     }
 
-    public int getNumber()
+    public String getId()
     {
-        return mNumber;
+        return mId;
     }
 
-    public void setNumber(String number)
+    public void setId(String id)
     {
-        try
-        {
-            this.mNumber = Integer.valueOf(number);
-        } catch (NumberFormatException e)
-        {
-            Log.w(TAG, "Error decoding version number. Defaulting to 0: " + e.getLocalizedMessage());
-            this.mNumber = 0;
-        }
-    }
-
-    public void setNumber(int number)
-    {
-        this.mNumber = number;
+        this.mId = id;
     }
 
     public String getName()
@@ -129,7 +117,7 @@
 
         if (item != null)
         {
-            result = this.mNumber > item.mNumber;
+            result = !this.mId.equals(item.mId);
         }
         else
         {
diff --git a/src/com/fairphone/updater/data/Store.java b/src/com/fairphone/updater/data/Store.java
index 0b5813e..71e8ad4 100644
--- a/src/com/fairphone/updater/data/Store.java
+++ b/src/com/fairphone/updater/data/Store.java
@@ -33,11 +33,11 @@
         int retVal;
         if (another != null)
         {
-            if (this.getNumber() > another.getNumber())
+            if (!this.getId().equals(another.getId()))
             {
                 retVal = 1;
             }
-            else if (this.getNumber() == another.getNumber())
+            else if (this.getId() == another.getId())
             {
                 retVal = 0;
             }
diff --git a/src/com/fairphone/updater/data/UpdaterData.java b/src/com/fairphone/updater/data/UpdaterData.java
index 3daacb2..1e7ddb1 100644
--- a/src/com/fairphone/updater/data/UpdaterData.java
+++ b/src/com/fairphone/updater/data/UpdaterData.java
@@ -16,15 +16,15 @@
 
     private static UpdaterData mInstance;
 
-    private int mLatestAOSPVersionNumber;
+    private String mLatestAOSPVersionNumber;
 
-    private int mLatestFairphoneVersionNumber;
+    private String mLatestFairphoneVersionNumber;
 
-    private final Map<Integer, Version> mAOSPVersionMap;
+    private final Map<String, Version> mAOSPVersionMap;
 
-    private final Map<Integer, Version> mFairphoneVersionMap;
+    private final Map<String, Version> mFairphoneVersionMap;
     
-    private final Map<Integer, Store> mAppStoresMap;
+    private final Map<String, Store> mAppStoresMap;
 
     public static UpdaterData getInstance()
     {
@@ -37,8 +37,8 @@
 
     private UpdaterData()
     {
-        mLatestAOSPVersionNumber = 0;
-        mLatestFairphoneVersionNumber = 0;
+        mLatestAOSPVersionNumber = "0";
+        mLatestFairphoneVersionNumber = "0";
         mAOSPVersionMap = new HashMap<>();
         mFairphoneVersionMap = new HashMap<>();
         mAppStoresMap = new HashMap<>();
@@ -46,8 +46,8 @@
 
     public void resetUpdaterData()
     {
-        mLatestAOSPVersionNumber = 0;
-        mLatestFairphoneVersionNumber = 0;
+        mLatestAOSPVersionNumber = "0";
+        mLatestFairphoneVersionNumber = "0";
         mAOSPVersionMap.clear();
         mFairphoneVersionMap.clear();
         mAppStoresMap.clear();
@@ -58,16 +58,16 @@
         mLatestAOSPVersionNumber = getLatestVersionFromTag(latestVersion);
     }
 
-    private static int getLatestVersionFromTag(String latestVersion)
+    private static String getLatestVersionFromTag(String latestVersion)
     {
-        int latestVersionNumber;
+        String latestVersionNumber;
         try
         {
-            latestVersionNumber = Integer.valueOf(latestVersion);
+            latestVersionNumber = latestVersion;
         } catch (NumberFormatException e)
         {
             Log.w(TAG, "Error decoding latest version number. Defaulting to 0: " + e.getLocalizedMessage());
-            latestVersionNumber = 0;
+            latestVersionNumber = "0";
         }
         return latestVersionNumber;
     }
@@ -79,17 +79,17 @@
 
     public void addAOSPVersion(Version version)
     {
-        mAOSPVersionMap.put(version.getNumber(), version);
+        mAOSPVersionMap.put(version.getId(), version);
     }
 
     public void addFairphoneVersion(Version version)
     {
-        mFairphoneVersionMap.put(version.getNumber(), version);
+        mFairphoneVersionMap.put(version.getId(), version);
     }
     
     public void addAppStore(Store store)
     {
-        mAppStoresMap.put(store.getNumber(), store);
+        mAppStoresMap.put(store.getId(), store);
     }
 
     public Version getLatestVersion(String imageType)
@@ -145,7 +145,7 @@
 	    return mapToOrderedStoreList(mAppStoresMap.values());
     }
 
-    public Version getVersion(String imageType, int versionNumber)
+    public Version getVersion(String imageType, String versionNumber)
     {
         Version version = null;
         if (Version.IMAGE_TYPE_AOSP.equalsIgnoreCase(imageType))
@@ -160,7 +160,7 @@
         return version;
     }
     
-    public Store getStore(int storeNumber)
+    public Store getStore(String storeNumber)
     {
         return mAppStoresMap.get(storeNumber);
     }
diff --git a/src/com/fairphone/updater/data/Version.java b/src/com/fairphone/updater/data/Version.java
index 29ba80a..483fe27 100644
--- a/src/com/fairphone/updater/data/Version.java
+++ b/src/com/fairphone/updater/data/Version.java
@@ -24,6 +24,8 @@
 
 import java.util.ArrayList;
 import java.util.List;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
 
 public class Version extends DownloadableItem implements Comparable<Version>
 {
@@ -45,8 +47,6 @@
 
     private final List<Integer> mDependencies;
 
-    public static final int ZIP_INSTALL_VERSION = 999;
-
     public Version()
     {
         super();
@@ -147,11 +147,11 @@
         int retVal;
         if (another != null)
         {
-            if (this.getNumber() < another.getNumber() && this.mImageType.equalsIgnoreCase(another.mImageType))
+            if (!this.getId().equals(another.getId()) && this.mImageType.equalsIgnoreCase(another.mImageType))
             {
                 retVal = 1;
             }
-            else if (this.getNumber() == another.getNumber() && this.mImageType.equalsIgnoreCase(another.mImageType))
+            else if (this.getId() == another.getId() && this.mImageType.equalsIgnoreCase(another.mImageType))
             {
                 retVal = 0;
             }
@@ -195,4 +195,41 @@
 //        return mDependencies;
 //    }
 // --Commented out by Inspection STOP (09/02/2015 19:47)
+
+    /**
+     * This method retrieves the int.int.int part of the fingerprint
+     * @return the version as string or empty string if no version was found
+     */
+    public String getBuildNumberFromId(){
+        String id = getId();
+        Pattern pattern = Pattern.compile(".*?\\d+.*?(\\d+)(\\.)(\\d+)(\\.)(\\d+)", Pattern.CASE_INSENSITIVE | Pattern.DOTALL);    // is this pattern sufficient?
+        Matcher matcher = pattern.matcher(id);                             // get version number from fingerprint
+        if (matcher.find()) {
+            return  matcher.group(1) + "." +matcher.group(3) + "." + matcher.group(5);
+        }
+        Log.d(TAG,String.format("Failed to determine version number from fingerprint: %s",id));
+        return ""; /* we don't know what version is here */
+    }
+
+    /**
+     * This method constructs the current version type from the device fingerprint
+     * @return A human (english) version type to be displayed on the screen
+     */
+    public String getCurrentImageType() {
+        String id = getId();
+        if(id.contains("gms")) {
+            return "Fairphone OS";
+        } else if (id.contains("sibon")) {
+            return "Fairphone Open Source OS";
+        } else if (id.contains("AOSP+")) {
+            return "Fairphone Internal";
+        } else {
+            // we do have a version but.. we don't know about it. return the full "number"
+            return id;
+        }
+    }
+
+    public String getHumanReadableName() {
+        return getName() + " " + getBuildNumber();
+    }
 }
diff --git a/src/com/fairphone/updater/data/VersionParserHelper.java b/src/com/fairphone/updater/data/VersionParserHelper.java
index c2b7fcf..2df0e43 100644
--- a/src/com/fairphone/updater/data/VersionParserHelper.java
+++ b/src/com/fairphone/updater/data/VersionParserHelper.java
@@ -49,36 +49,52 @@
     private static final String CURRENT_ANDROID_VERSION = "fairphone.ota.android_version";
     private static final String CURRENT_VERSION_IMAGE_TYPE = "fairphone.ota.image_type";
     private static final String CURRENT_VERSION_BUILD_DATE = "ro.build.date.utc";
+    private static final String CURRENT_VERSION_ID = "ro.build.version.incremental";                // for FP2
+
 
     private static Version version;
     public static Version getDeviceVersion(Context context)
     {
         if (version == null){
             Version versionBuilder = new Version();
-            String[] suportedDevices = context.getResources().getString(R.string.knownFPDevices).split(";");
+            String[] supportedDevices = context.getResources().getString(R.string.knownFPDevices).split(";");
             String modelWithoutSpaces = Build.MODEL.replaceAll("\\s", "");
             boolean knownFPDevice = false;
-            for(String device : suportedDevices){
+            for (String device : supportedDevices) {
                 knownFPDevice = knownFPDevice || device.equals(modelWithoutSpaces);
             }
 
-            try
-            {
-                versionBuilder.setNumber(Integer.valueOf(getSystemData(context, CURRENT_VERSION_NUMBER, knownFPDevice)));
-            } catch (NumberFormatException e)
-            {
-                int defaultVersionNumber = context.getResources().getInteger(R.integer.defaultVersionNumber);
-                Log.w(TAG, "Error parsing current version number. Defaulting to " + defaultVersionNumber + ": " + e.getLocalizedMessage());
-                versionBuilder.setNumber(defaultVersionNumber);
+            if(modelWithoutSpaces.equals(context.getResources().getString(R.string.FP2Model))) {
+                // FP2
+                try {
+                    versionBuilder.setId(getSystemData(context, CURRENT_VERSION_ID, knownFPDevice));
+                } catch (NumberFormatException e) {
+                    String defaultVersionId = context.getResources().getString(R.string.defaultVersionId);
+                    Log.w(TAG, "Error parsing current version id. Defaulting to " + defaultVersionId + ": " + e.getLocalizedMessage());
+                    versionBuilder.setId(defaultVersionId);
+                }
+                versionBuilder.setName(versionBuilder.getCurrentImageType());
+                versionBuilder.setBuildNumber(versionBuilder.getBuildNumberFromId());
+            } else {
+                // FP1(U)
+                try
+                {
+                    versionBuilder.setId(getSystemData(context, CURRENT_VERSION_NUMBER, knownFPDevice) );
+                } catch (NumberFormatException e) {
+                    String defaultVersionNumber = context.getResources().getString(R.string.defaultVersionId);
+                    Log.w(TAG, "Error parsing current version number. Defaulting to " + defaultVersionNumber + ": " + e.getLocalizedMessage());
+                    versionBuilder.setId(defaultVersionNumber);
+                }
+                versionBuilder.setName(getSystemData(context, CURRENT_VERSION_NAME, knownFPDevice));
+                versionBuilder.setBuildNumber(getSystemData(context, CURRENT_VERSION_BUILD_NUMBER, knownFPDevice));
             }
-            versionBuilder.setName(getSystemData(context, CURRENT_VERSION_NAME, knownFPDevice));
-            versionBuilder.setBuildNumber(getSystemData(context, CURRENT_VERSION_BUILD_NUMBER, knownFPDevice));
+
             versionBuilder.setAndroidVersion(getSystemData(context, CURRENT_ANDROID_VERSION, knownFPDevice));
             versionBuilder.setImageType(getSystemData(context, CURRENT_VERSION_IMAGE_TYPE, knownFPDevice));
             versionBuilder.setReleaseDate(getSystemData(context, CURRENT_VERSION_BUILD_DATE, knownFPDevice));
             versionBuilder.setBetaStatus(getSystemData(context, CURRENT_BETA_STATUS, knownFPDevice));
 
-            Version versionData = UpdaterData.getInstance().getVersion(versionBuilder.getImageType(), versionBuilder.getNumber());
+            Version versionData = UpdaterData.getInstance().getVersion(versionBuilder.getImageType(), versionBuilder.getId());
             versionBuilder.setThumbnailLink(versionData != null ? versionData.getThumbnailLink() : "");
             versionBuilder.setReleaseNotes(Locale.getDefault().getLanguage(), versionData != null ? versionData.getReleaseNotes(Locale.getDefault().getLanguage()) : "");
             version = versionBuilder;
@@ -92,7 +108,7 @@
 		String result;
 	    switch (property) {
 		    case CURRENT_VERSION_NUMBER:
-			    result = Utils.getprop(CURRENT_VERSION_NUMBER, useDefaults ? String.valueOf(context.getResources().getInteger(R.integer.defaultVersionNumber)) : "");
+			    result = Utils.getprop(CURRENT_VERSION_NUMBER, useDefaults ? String.valueOf(context.getResources().getString(R.string.defaultVersionId)) : "");
 			    break;
 		    case CURRENT_VERSION_NAME:
 			    result = Utils.getprop(CURRENT_VERSION_NAME, useDefaults ? context.getResources().getString(R.string.defaultVersionName) : "");
@@ -112,6 +128,9 @@
 		    case CURRENT_BETA_STATUS:
 			    result = Utils.getprop(CURRENT_BETA_STATUS, useDefaults ? context.getResources().getString(R.string.defaultBetaStatus) : "0");
 			    break;
+            case CURRENT_VERSION_ID:
+                result = Utils.getprop(CURRENT_VERSION_ID, useDefaults ? "" : ""); // TODO: define default value for fingerprint
+                break;
 		    default:
 			    result = "";
 			    break;
@@ -347,7 +366,7 @@
 
         if (tagName.equalsIgnoreCase(XML_TAGS.VERSION.name()))
         {
-            updateVersion.setNumber(xpp.getAttributeValue(0));
+            updateVersion.setId(xpp.getAttributeValue(0));
         }
         else if (tagName.equalsIgnoreCase(XML_TAGS.ANDROID_VERSION.name()))
         {
@@ -382,7 +401,7 @@
 
         if (tagName.equalsIgnoreCase(XML_TAGS.STORE.name()))
         {
-            updateStore.setNumber(xpp.getAttributeValue(0));
+            updateStore.setId(xpp.getAttributeValue(0));
         }
         else if (tagName.equalsIgnoreCase(XML_TAGS.SHOW_DISCLAIMER.name()))
         {
diff --git a/src/com/fairphone/updater/fragments/DownloadAndRestartFragment.java b/src/com/fairphone/updater/fragments/DownloadAndRestartFragment.java
index 85f11b5..397bc8c 100644
--- a/src/com/fairphone/updater/fragments/DownloadAndRestartFragment.java
+++ b/src/com/fairphone/updater/fragments/DownloadAndRestartFragment.java
@@ -1,9 +1,5 @@
 package com.fairphone.updater.fragments;
 
-import java.io.File;
-import java.io.IOException;
-import java.util.concurrent.TimeoutException;
-
 import android.annotation.SuppressLint;
 import android.app.AlertDialog;
 import android.app.DownloadManager;
@@ -39,7 +35,6 @@
 import com.fairphone.updater.UpdaterService;
 import com.fairphone.updater.data.DownloadableItem;
 import com.fairphone.updater.data.Store;
-import com.fairphone.updater.data.UpdaterData;
 import com.fairphone.updater.data.Version;
 import com.fairphone.updater.data.VersionParserHelper;
 import com.fairphone.updater.tools.PrivilegeChecker;
@@ -48,6 +43,10 @@
 import com.stericson.RootTools.execution.CommandCapture;
 import com.stericson.RootTools.execution.Shell;
 
+import java.io.File;
+import java.io.IOException;
+import java.util.concurrent.TimeoutException;
+
 @SuppressLint("ValidFragment")
 public class DownloadAndRestartFragment extends BaseFragment
 {
@@ -124,9 +123,8 @@
             version = new Version();
             version.setName(resources.getString(R.string.install) + " " + zipName);
             version.setDownloadLink(mainActivity.getZipFilePath());
-            version.setNumber(Version.ZIP_INSTALL_VERSION);
-        }
-        else
+            version.setId(null);
+        } else
         {
             version = mainActivity.getSelectedVersion();
         }
diff --git a/src/com/fairphone/updater/fragments/MainFragment.java b/src/com/fairphone/updater/fragments/MainFragment.java
index ed5688e..b738b6d 100644
--- a/src/com/fairphone/updater/fragments/MainFragment.java
+++ b/src/com/fairphone/updater/fragments/MainFragment.java
@@ -23,7 +23,6 @@
 import com.fairphone.updater.FairphoneUpdater.HeaderType;
 import com.fairphone.updater.FairphoneUpdater.UpdaterState;
 import com.fairphone.updater.R;
-import com.fairphone.updater.data.Store;
 import com.fairphone.updater.data.UpdaterData;
 import com.fairphone.updater.data.Version;
 import com.fairphone.updater.fragments.VersionDetailFragment.DetailLayoutType;
diff --git a/src/com/fairphone/updater/fragments/VersionDetailFragment.java b/src/com/fairphone/updater/fragments/VersionDetailFragment.java
index 0632ed6..17dc7f0 100644
--- a/src/com/fairphone/updater/fragments/VersionDetailFragment.java
+++ b/src/com/fairphone/updater/fragments/VersionDetailFragment.java
@@ -7,7 +7,6 @@
 import android.content.Context;
 import android.content.DialogInterface;
 import android.content.res.Resources;
-import android.net.ConnectivityManager;
 import android.net.Uri;
 import android.os.Bundle;
 import android.os.Environment;
@@ -209,7 +208,7 @@
                 break;
 
             case ANDROID:
-                mHeaderText = mainActivity.getVersionName(mSelectedVersion);
+                mHeaderText = mSelectedVersion.getHumanReadableName();
                 mVersionDetailsTitle = resources.getString(R.string.new_os);
                 mIsOSChange = deviceVersion.getImageType().equalsIgnoreCase(Version.IMAGE_TYPE_FAIRPHONE);
                 mIsOlderVersion =
@@ -223,7 +222,7 @@
                 break;
             case FAIRPHONE:
             default:
-                mHeaderText = mainActivity.getVersionName(mSelectedVersion);
+                mHeaderText = mSelectedVersion.getHumanReadableName();
                 mVersionDetailsTitle = resources.getString(R.string.older_version);
                 mIsOSChange = deviceVersion.getImageType().equalsIgnoreCase(Version.IMAGE_TYPE_AOSP);
                 mIsOlderVersion =
@@ -362,7 +361,7 @@
         {
             if (mIsOSChange || mIsOlderVersion)
             {
-                showPopupDialog(mainActivity.getVersionName(mSelectedVersion), mSelectedVersion.hasEraseAllPartitionWarning(),
+                showPopupDialog(mSelectedVersion.getHumanReadableName(), mSelectedVersion.hasEraseAllPartitionWarning(),
                         new ConfirmationPopupDialogListener()
                         {
 
diff --git a/src/com/fairphone/updater/fragments/VersionListFragment.java b/src/com/fairphone/updater/fragments/VersionListFragment.java
index 938d9c3..09fd9f9 100644
--- a/src/com/fairphone/updater/fragments/VersionListFragment.java
+++ b/src/com/fairphone/updater/fragments/VersionListFragment.java
@@ -1,7 +1,5 @@
 package com.fairphone.updater.fragments;
 
-import java.util.List;
-
 import android.content.res.Resources;
 import android.os.Bundle;
 import android.view.LayoutInflater;
@@ -17,6 +15,8 @@
 import com.fairphone.updater.data.Version;
 import com.fairphone.updater.fragments.VersionDetailFragment.DetailLayoutType;
 
+import java.util.List;
+
 public class VersionListFragment extends BaseFragment
 {
 
@@ -151,7 +151,7 @@
 
                 mVersionListContainer.addView(versionLayout);
 
-                versionLayout.setText(mainActivity.getVersionName(version));
+                versionLayout.setText(version.getHumanReadableName());
 
                 versionLayout.setOnClickListener(new OnClickListener()
                 {
@@ -186,7 +186,7 @@
     private void setupFairphoneLatestVersion()
     {
         final Version latestFairphoneVersion = UpdaterData.getInstance().getLatestVersion(Version.IMAGE_TYPE_FAIRPHONE);
-        mLatestVersionDetailsButton.setText(mainActivity.getVersionName(latestFairphoneVersion));
+        mLatestVersionDetailsButton.setText(latestFairphoneVersion.getHumanReadableName());
 
         if (mainActivity.getDeviceVersion().compareTo(latestFairphoneVersion) == 0)
         {
@@ -233,7 +233,7 @@
 
                 mVersionListContainer.addView(versionLayout);
 
-                versionLayout.setText(mainActivity.getVersionName(version));
+                versionLayout.setText(version.getHumanReadableName());
 
                 versionLayout.setOnClickListener(new OnClickListener()
                 {
@@ -269,7 +269,7 @@
     private void setupAndroidLatestVersion()
     {
         final Version latestAOSPVersion = UpdaterData.getInstance().getLatestVersion(Version.IMAGE_TYPE_AOSP);
-        mLatestVersionDetailsButton.setText(mainActivity.getVersionName(latestAOSPVersion));
+        mLatestVersionDetailsButton.setText(latestAOSPVersion.getHumanReadableName());
 
         if (mainActivity.getDeviceVersion().compareTo(latestAOSPVersion) == 0)
         {
diff --git a/src/com/fairphone/updater/tools/Utils.java b/src/com/fairphone/updater/tools/Utils.java
index 1fc64cc..bb4e038 100644
--- a/src/com/fairphone/updater/tools/Utils.java
+++ b/src/com/fairphone/updater/tools/Utils.java
@@ -80,7 +80,7 @@
     private static final double PERCENT_100 = 100d;
     private static final char CHAR_SPACE = ' ';
     private static final char CHAR_ZERO = '0';
-    public static final int GAPPS_STORE_NUMBER = 0;
+    public static final String GAPPS_STORE_NUMBER = "0";
 
     private static double getPartitionSizeInGBytes(File path)
     {
@@ -371,7 +371,6 @@
         if (item != null)
         {
             filename.append(type);
-            filename.append(item.getNumber());
         }
         filename.append(".zip");
         return filename;
