diff --git a/res/layout/activity_beta_enabler.xml b/res/layout/activity_beta_enabler.xml
index d646bb8..12c7fe8 100644
--- a/res/layout/activity_beta_enabler.xml
+++ b/res/layout/activity_beta_enabler.xml
@@ -2,16 +2,26 @@
     xmlns:tools="http://schemas.android.com/tools"
     android:layout_width="match_parent"
     android:layout_height="match_parent"
+	android:background="@color/blue"
     tools:context="com.fairphone.updater.BetaEnabler" >
 
-	<Button
-	    android:id="@+id/beta_activator"
-	    android:layout_width="wrap_content"
-	    android:layout_height="wrap_content"
-	    android:layout_centerHorizontal="true"
-	    android:layout_centerVertical="true"
-	    style="@style/ButtonSmallBlueDark"
-	    android:text="@string/beta_is_enabled" 
-	    android:enabled="false"/>
+	<include layout="@layout/header"/>
+
+	<FrameLayout
+		android:layout_width="wrap_content"
+		android:layout_height="wrap_content"
+		android:layout_centerHorizontal="true"
+		android:layout_centerVertical="true"
+		android:paddingTop="@dimen/header_big_height">
+
+		<Button
+			android:id="@+id/beta_activator"
+			android:layout_width="wrap_content"
+			android:layout_height="wrap_content"
+			style="@style/ButtonWhiteBlue"
+			android:text="@string/beta_is_enabled"
+			android:enabled="false"/>
+
+	</FrameLayout>
 
 </RelativeLayout>
diff --git a/res/layout/header.xml b/res/layout/header.xml
index 20efa42..b6f030f 100644
--- a/res/layout/header.xml
+++ b/res/layout/header.xml
@@ -13,7 +13,7 @@
             android:ellipsize="end"
             android:fontFamily="sans-serif-thin"
             android:gravity="center_vertical|center_horizontal"
-            android:lines="1"
+            android:lines="2"
             android:text="@string/app_full_name"
             android:textColor="@color/blue"
             android:textSize="@dimen/header_big_text_size" />
diff --git a/res/values/colors.xml b/res/values/colors.xml
index 7eac390..e343feb 100644
--- a/res/values/colors.xml
+++ b/res/values/colors.xml
@@ -27,6 +27,7 @@
     <color name="pink_light">#f286b6</color>
     <color name="pink_light_transparent">#f0dbe4</color>
     <color name="red">#c3474c</color>
+    <color name="design_pink">#d7617f</color>
 
     <!-- GOOGLE COLORS (DEPENDENCIES) -->
     <color name="google_blue">#33b5e5</color>
diff --git a/res/values/config.xml b/res/values/config.xml
index 3ae7fe3..3160eda 100644
--- a/res/values/config.xml
+++ b/res/values/config.xml
@@ -11,7 +11,7 @@
     <string name="defaultVersionName" translatable="false">Almond</string>
     <string name="defaultBuildNumber" translatable="false">1.0</string>
     <string name="defaultImageType" translatable="false">fairphone</string>
-    <string name="defaultBetaStatus" translatable="false">0</string>
+    <bool name="defaultBetaStatus" translatable="false">false</bool>
     
     <!-- Device Model without spaces separated by semicolon. Ex: FP1;FP1U;FP2 -->
     <string name="knownFPDevices" translatable="false">FP1;FP1U;FP2</string>
diff --git a/res/values/strings.xml b/res/values/strings.xml
index 4d290e2..d5cfabd 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -78,4 +78,5 @@
     <string name="connect_to_wifi">Please connect to a Wi-Fi network</string>
     <string name="charge_battery">Please charge your battery to at least 80%</string>
     <string name="got_it">Got it</string>
+    <string name="beta_mode">beta mode</string>
 </resources>
\ No newline at end of file
diff --git a/src/com/fairphone/updater/BetaEnabler.java b/src/com/fairphone/updater/BetaEnabler.java
index 5d64c24..806f60a 100644
--- a/src/com/fairphone/updater/BetaEnabler.java
+++ b/src/com/fairphone/updater/BetaEnabler.java
@@ -2,6 +2,9 @@
 package com.fairphone.updater;
 
 import android.app.Activity;
+import android.content.Context;
+import android.content.SharedPreferences;
+import android.os.Handler;
 import android.view.View;
 import android.view.View.OnClickListener;
 import android.widget.Button;
@@ -11,8 +14,7 @@
 
 public class BetaEnabler extends Activity {
 
-    public static final String FAIRPHONE_BETA_PROPERTY = "fairphone.ota.beta";
-    private static final String BETA_DISABLED = "0";
+    public static final String BETA_DISABLED = "0";
     public static final String BETA_ENABLED = "1";
     
     @Override
@@ -28,12 +30,20 @@
             b.setOnClickListener(new OnClickListener() {
                 @Override
                 public void onClick(View v) {
-                    Utils.setBetaPropToEnable();
+                    Utils.enableBeta(getApplicationContext());
                     if (isBetaEnabled()) {
                         Button b = (Button) findViewById(R.id.beta_activator);
                         b.setEnabled(false);
                         b.setText(R.string.beta_is_enabled);
                         b.setOnClickListener(null);
+                        final Handler handler = new Handler();
+                        handler.postDelayed(new Runnable() {
+                            @Override
+                            public void run() {
+                                Utils.restartUpdater(BetaEnabler.this);
+                            }
+                        }, 1000);
+
                     } else {
                         Toast.makeText(getApplicationContext(), R.string.beta_activation_failed, Toast.LENGTH_LONG).show();
                     }
@@ -41,9 +51,10 @@
             });
         }
     }
-    
-    private static boolean isBetaEnabled(){
-        return Utils.getprop(FAIRPHONE_BETA_PROPERTY, BETA_DISABLED).equals(BETA_ENABLED);
+
+    private boolean isBetaEnabled(){
+        SharedPreferences settings = getSharedPreferences(FairphoneUpdater.FAIRPHONE_UPDATER_PREFERENCES, Context.MODE_PRIVATE);
+        return settings.getBoolean(FairphoneUpdater.PREFERENCE_BETA_MODE, getResources().getBoolean(R.bool.defaultBetaStatus));
     }
     
 }
diff --git a/src/com/fairphone/updater/FairphoneUpdater.java b/src/com/fairphone/updater/FairphoneUpdater.java
index e297f33..d9605ea 100644
--- a/src/com/fairphone/updater/FairphoneUpdater.java
+++ b/src/com/fairphone/updater/FairphoneUpdater.java
@@ -13,6 +13,7 @@
 import android.support.v4.app.FragmentActivity;
 import android.support.v4.app.FragmentManager;
 import android.support.v4.app.FragmentTransaction;
+import android.text.Html;
 import android.text.TextUtils;
 import android.util.Log;
 import android.view.View;
@@ -67,6 +68,8 @@
     public static final String PREFERENCE_SELECTED_STORE_NUMBER = "SelectedStoreNumber";
     
     public static final String PREFERENCE_OTA_DOWNLOAD_URL = "OtaDownloadUrl";
+
+    public static final String PREFERENCE_BETA_MODE = "BetaMode";
     
     private static final String TAG_FIRST_FRAGMENT = "FIRST_FRAGMENT";
     private String mZipPath;
@@ -176,6 +179,8 @@
 
         initHeaderViews();
 
+        setupHeader();
+
         setupFragments(savedInstanceState);
 
         startService();
@@ -185,7 +190,7 @@
     
     void setupBetaStatus()
     {
-        BETA_MODE_ENABLED = mDeviceVersion.getBetaStatus().equals("1");
+        BETA_MODE_ENABLED = mSharedPreferences.getBoolean(PREFERENCE_BETA_MODE, getResources().getBoolean(R.bool.defaultBetaStatus));
     }
 
     private void isDeviceSupported()
@@ -309,6 +314,15 @@
         });
     }
 
+    private void setupHeader() {
+        if(BETA_MODE_ENABLED) {
+            String input = "<br /><small><font color=" + getResources().getColor(R.color.design_pink) + ">" + getResources().getString(R.string.beta_mode) + "</font></small>";
+            headerMainFairphoneText.append(Html.fromHtml(input));
+            headerMainAndroidText.append(Html.fromHtml(input));
+            headerMainAppStoreText.append(Html.fromHtml(input));
+        }
+    }
+
     private void showInfoPopupDialog(DetailLayoutType layoutType)
     {
         FragmentManager fm = getSupportFragmentManager();
diff --git a/src/com/fairphone/updater/UpdaterService.java b/src/com/fairphone/updater/UpdaterService.java
index 629141d..f10a964 100644
--- a/src/com/fairphone/updater/UpdaterService.java
+++ b/src/com/fairphone/updater/UpdaterService.java
@@ -329,7 +329,7 @@
                     sb.append("&b_n=").append(URLEncoder.encode(currentVersion.getBuildNumber(), defaultCharset));
                 }
                 sb.append("&ota_v_n=").append(URLEncoder.encode(String.valueOf(currentVersion.getId()), defaultCharset));
-                sb.append("&beta=").append(URLEncoder.encode(currentVersion.getBetaStatus(), defaultCharset));
+                sb.append("&beta=").append(FairphoneUpdater.BETA_MODE_ENABLED ? BetaEnabler.BETA_ENABLED : BetaEnabler.BETA_DISABLED);
                 sb.append("&dev=").append(FairphoneUpdater.DEV_MODE_ENABLED ? "1" : "0");
             } catch (UnsupportedEncodingException e) {
                 Log.e(TAG, "Failed to add extra info on update request: "+e.getLocalizedMessage());
diff --git a/src/com/fairphone/updater/data/Version.java b/src/com/fairphone/updater/data/Version.java
index ac0ff34..197ba64 100644
--- a/src/com/fairphone/updater/data/Version.java
+++ b/src/com/fairphone/updater/data/Version.java
@@ -41,8 +41,6 @@
 
     private String mAndroidVersion;
 
-    private String mBetaStatus;
-
     private boolean mErasePartitionsWarning;
 
     private final List<Integer> mDependencies;
@@ -54,7 +52,6 @@
         mAndroidVersion = "";
         mImageType = IMAGE_TYPE_FAIRPHONE;
         mErasePartitionsWarning = false;
-        mBetaStatus = "";
     }
 
     public Version(Version other)
@@ -64,7 +61,6 @@
         mAndroidVersion = other.mAndroidVersion;
         mImageType = other.mImageType;
         mErasePartitionsWarning = other.hasEraseAllPartitionWarning();
-        mBetaStatus = other.mBetaStatus;
     }
 
     public void setEraseAllPartitionWarning()
@@ -92,16 +88,6 @@
         return mImageType;
     }
 
-    public void setBetaStatus(String betaStatus)
-    {
-        mBetaStatus = betaStatus;
-    }
-
-    public String getBetaStatus()
-    {
-        return mBetaStatus;
-    }
-
     public String getImageTypeDescription(Resources resources)
     {
         return Version.getImageTypeDescription(mImageType, resources);
diff --git a/src/com/fairphone/updater/data/VersionParserHelper.java b/src/com/fairphone/updater/data/VersionParserHelper.java
index 3bf8d1c..4120743 100644
--- a/src/com/fairphone/updater/data/VersionParserHelper.java
+++ b/src/com/fairphone/updater/data/VersionParserHelper.java
@@ -45,7 +45,6 @@
     private static final String CURRENT_VERSION_NUMBER = "fairphone.ota.version.number";
     private static final String CURRENT_VERSION_NAME = "fairphone.ota.version.name";
     private static final String CURRENT_VERSION_BUILD_NUMBER = "fairphone.ota.build_number";
-    private static final String CURRENT_BETA_STATUS = "fairphone.ota.beta";
     private static final String CURRENT_VERSION_IMAGE_TYPE = "fairphone.ota.image_type";
     private static final String CURRENT_VERSION_ID = "ro.build.version.incremental";                // for FP2
 
@@ -88,7 +87,6 @@
             }
 
             versionBuilder.setImageType(getSystemData(context, CURRENT_VERSION_IMAGE_TYPE, knownFPDevice));
-            versionBuilder.setBetaStatus(getSystemData(context, CURRENT_BETA_STATUS, knownFPDevice));
 
             Version versionData = UpdaterData.getInstance().getVersion(versionBuilder.getImageType(), versionBuilder.getId());
             versionBuilder.setThumbnailLink(versionData != null ? versionData.getThumbnailLink() : "");
@@ -115,9 +113,6 @@
 		    case CURRENT_VERSION_IMAGE_TYPE:
 			    result = Utils.getprop(CURRENT_VERSION_IMAGE_TYPE, useDefaults ? context.getResources().getString(R.string.defaultImageType) : "");
 			    break;
-		    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;
diff --git a/src/com/fairphone/updater/tools/Utils.java b/src/com/fairphone/updater/tools/Utils.java
index b42f558..706f315 100644
--- a/src/com/fairphone/updater/tools/Utils.java
+++ b/src/com/fairphone/updater/tools/Utils.java
@@ -16,10 +16,14 @@
 
 package com.fairphone.updater.tools;
 
+import android.app.Activity;
+import android.app.AlarmManager;
 import android.app.DownloadManager;
+import android.app.PendingIntent;
 import android.content.Context;
 import android.content.Intent;
 import android.content.IntentFilter;
+import android.content.SharedPreferences;
 import android.content.res.Resources;
 import android.database.Cursor;
 import android.net.ConnectivityManager;
@@ -32,7 +36,7 @@
 import android.util.Log;
 import android.widget.Toast;
 
-import com.fairphone.updater.BetaEnabler;
+import com.fairphone.updater.FairphoneUpdater;
 import com.fairphone.updater.R;
 import com.fairphone.updater.UpdaterService;
 import com.fairphone.updater.data.DownloadableItem;
@@ -425,22 +429,11 @@
         return result;
     }
 
-	public static void setBetaPropToEnable()
-    {
-        if(RootTools.isAccessGiven()) {
-            CommandCapture command = new CommandCapture(0, "/system/bin/setprop "+ BetaEnabler.FAIRPHONE_BETA_PROPERTY+" "+BetaEnabler.BETA_ENABLED);
-            try {
-                Shell.runRootCommand(command);
-            } catch (IOException | TimeoutException | RootDeniedException e) {
-	            Log.d(TAG, "Failed to setprop: " + e.getLocalizedMessage());
-            }
-        }
-        try {
-            Thread.sleep(200);
-        } catch (InterruptedException e) {
-
-        }
-        buildProps = null;
+    public static void enableBeta(Context context) {
+        SharedPreferences settings = context.getSharedPreferences(FairphoneUpdater.FAIRPHONE_UPDATER_PREFERENCES, Context.MODE_PRIVATE);
+        SharedPreferences.Editor editor = settings.edit();
+        editor.putBoolean(FairphoneUpdater.PREFERENCE_BETA_MODE, true);
+        editor.commit();
     }
 
     public static String getOtaPackagePath(Resources resources, DownloadableItem item, boolean isVersion, boolean isZipInstall){
@@ -682,4 +675,13 @@
     {
         return UpdaterData.getInstance().getStore(GAPPS_STORE_NUMBER);
     }
+
+    public static void restartUpdater(Activity activity) {
+        Intent startActivity = new Intent(activity.getApplicationContext(), FairphoneUpdater.class);
+        int pendingIntentId = 123456;
+        PendingIntent pendingIntent = PendingIntent.getActivity(activity.getApplicationContext(), pendingIntentId, startActivity, PendingIntent.FLAG_CANCEL_CURRENT);
+        AlarmManager mgr = (AlarmManager)activity.getApplicationContext().getSystemService(Context.ALARM_SERVICE);
+        mgr.set(AlarmManager.RTC, System.currentTimeMillis() + 100, pendingIntent);
+        System.exit(0);
+    }
 }
