diff --git a/README.md b/README.md
index b38ac0bba541e9c2d246ba5c40ef7dc9133dfc55..232cf35b7990ae47ef190da53214c7caf704018d 100644
--- a/README.md
+++ b/README.md
@@ -2,7 +2,7 @@
 
 This repository contains the source code for the [Bitmask](https://bitmask.net/) Android client. Bitmask Android offers one-click free VPN service from trusted providers of the LEAP stack.
 
-To lean about the stack, visit [leap.se](https://leap.se).
+To learn about the stack, visit [leap.se](https://leap.se).
 
 Please see the [issues](https://0xacab.org/leap/bitmask_android/issues) section to report any bugs or feature requests, and to see the list of known issues.
 
@@ -475,7 +475,7 @@ Please file bug tickets on our main [development platform](https://0xacab.org/le
 
 ## Contributing <a name="contributing"></a>
 
-Please fork this repository and contribute back using [pull requests](https://github.com/leapcode/leap_android/pulls).
+Please fork this repository and contribute back using [pull requests](https://0xacab.org/leap/bitmask_android/merge_requests).
 
 Our preferred method for receiving translations is our [Transifex project](https://www.transifex.com/projects/p/bitmask-android).
 
diff --git a/app/build.gradle b/app/build.gradle
index 5422b5e4613b678b5c60b12100d01d3e452f5799..1ade8155cfee887b952611c788113dd4106bc874 100644
--- a/app/build.gradle
+++ b/app/build.gradle
@@ -173,9 +173,7 @@ task copyIcsOpenVPNClasses( type: Copy ) {
 task copyIcsOpenVPNXml( type: Copy )  {
   println "copyIcsOpenVPNXml"
   from ('../ics-openvpn/main/') {
-    include '**/vpnstatus.xml'
     include '**/strings.xml'
-    include '**/vpnstatus.xml'
     include '**/refs.xml'
     include '**/white_rect.xml'
     include '**/plurals.xml'
diff --git a/app/src/main/java/se/leap/bitmaskclient/AbstractProviderDetailActivity.java b/app/src/main/java/se/leap/bitmaskclient/AbstractProviderDetailActivity.java
index 6738a6bb2f73dc4d3fb477539d4ddc616d0c55d8..6349cb15d47cb96cefa21ae8e930e3f60a2983dd 100644
--- a/app/src/main/java/se/leap/bitmaskclient/AbstractProviderDetailActivity.java
+++ b/app/src/main/java/se/leap/bitmaskclient/AbstractProviderDetailActivity.java
@@ -55,7 +55,7 @@ public abstract class AbstractProviderDetailActivity extends ConfigWizardBaseAct
 
         options.setAdapter(new ArrayAdapter<>(
                 this,
-                R.layout.single_list_item,
+                R.layout.v_single_list_item,
                 android.R.id.text1,
                 optionsList.toArray(new String[optionsList.size()])
         ));
diff --git a/app/src/main/java/se/leap/bitmaskclient/ConfigHelper.java b/app/src/main/java/se/leap/bitmaskclient/ConfigHelper.java
index f07a2a23209634306ef91b5132e609f75061e4cb..aaff9ebcc5237dba4b38c4bb75c5c9b12b8a0d6e 100644
--- a/app/src/main/java/se/leap/bitmaskclient/ConfigHelper.java
+++ b/app/src/main/java/se/leap/bitmaskclient/ConfigHelper.java
@@ -58,12 +58,14 @@ import java.util.Map;
 import java.util.Set;
 
 import static android.R.attr.name;
+import static se.leap.bitmaskclient.Constants.ALWAYS_ON_SHOW_DIALOG;
 import static se.leap.bitmaskclient.Constants.DEFAULT_SHARED_PREFS_BATTERY_SAVER;
 import static se.leap.bitmaskclient.Constants.PREFERENCES_APP_VERSION;
 import static se.leap.bitmaskclient.Constants.PROVIDER_CONFIGURED;
 import static se.leap.bitmaskclient.Constants.PROVIDER_EIP_DEFINITION;
 import static se.leap.bitmaskclient.Constants.PROVIDER_PRIVATE_KEY;
 import static se.leap.bitmaskclient.Constants.PROVIDER_VPN_CERTIFICATE;
+import static se.leap.bitmaskclient.Constants.SHARED_PREFERENCES;
 
 /**
  * Stores constants, and implements auxiliary methods used across all Bitmask Android classes.
@@ -417,9 +419,27 @@ public class ConfigHelper {
         preferences.edit().putBoolean(DEFAULT_SHARED_PREFS_BATTERY_SAVER, isEnabled).apply();
     }
 
-    public static boolean getSaveBattery(@NonNull Context context) {
+    public static boolean getSaveBattery(Context context) {
+        if (context == null) {
+            return false;
+        }
         SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(context);
         return preferences.getBoolean(DEFAULT_SHARED_PREFS_BATTERY_SAVER, false);
     }
 
+    public static void saveShowAlwaysOnDialog(Context context, boolean showAlwaysOnDialog) {
+        if (context == null) {
+            return;
+        }
+        SharedPreferences preferences = context.getSharedPreferences(SHARED_PREFERENCES, Context.MODE_PRIVATE);
+        preferences.edit().putBoolean(ALWAYS_ON_SHOW_DIALOG, showAlwaysOnDialog).apply();
+    }
+
+    public static boolean getShowAlwaysOnDialog(Context context) {
+        if (context == null) {
+            return true;
+        }
+        SharedPreferences preferences = context.getSharedPreferences(SHARED_PREFERENCES, Context.MODE_PRIVATE);
+        return preferences.getBoolean(ALWAYS_ON_SHOW_DIALOG, true);
+    }
 }
diff --git a/app/src/main/java/se/leap/bitmaskclient/Constants.java b/app/src/main/java/se/leap/bitmaskclient/Constants.java
index 58145015cfac0e1ce72171f7c5566bfdd275e04e..d719e8d3666c7cdd6cc4e43300fae67a5922cd86 100644
--- a/app/src/main/java/se/leap/bitmaskclient/Constants.java
+++ b/app/src/main/java/se/leap/bitmaskclient/Constants.java
@@ -8,6 +8,7 @@ public interface Constants {
 
     String SHARED_PREFERENCES = "LEAPPreferences";
     String PREFERENCES_APP_VERSION = "bitmask version";
+    String ALWAYS_ON_SHOW_DIALOG = "DIALOG.ALWAYS_ON_SHOW_DIALOG";
 
 
      //////////////////////////////////////////////
diff --git a/app/src/main/java/se/leap/bitmaskclient/DrawerSettingsAdapter.java b/app/src/main/java/se/leap/bitmaskclient/DrawerSettingsAdapter.java
index 867f3d480c274738241cb3b5cc06ea7de18f6530..8238df55e7d65a5d62c96acef2a927311659e1b3 100644
--- a/app/src/main/java/se/leap/bitmaskclient/DrawerSettingsAdapter.java
+++ b/app/src/main/java/se/leap/bitmaskclient/DrawerSettingsAdapter.java
@@ -39,6 +39,7 @@ public class DrawerSettingsAdapter extends BaseAdapter {
     public static final int LOG = 1;
     public static final int ABOUT = 2;
     public static final int BATTERY_SAVER = 3;
+    public static final int ALWAYS_ON = 4;
 
     //view types
     public final static int VIEW_SIMPLE_TEXT = 0;
@@ -175,14 +176,14 @@ public class DrawerSettingsAdapter extends BaseAdapter {
 
     @NonNull
     private View initSwitchBinding(ViewHolder holder) {
-        View convertView = mInflater.inflate(R.layout.switch_list_item, null);
+        View convertView = mInflater.inflate(R.layout.v_switch_list_item, null);
         holder.switchView = convertView.findViewById(android.R.id.text1);
         return convertView;
     }
 
     @NonNull
     private View initTextViewBinding(ViewHolder holder) {
-        View convertView = mInflater.inflate(R.layout.single_list_item, null);
+        View convertView = mInflater.inflate(R.layout.v_single_list_item, null);
         holder.textView = convertView.findViewById(android.R.id.text1);
         return convertView;
     }
diff --git a/app/src/main/java/se/leap/bitmaskclient/EipFragment.java b/app/src/main/java/se/leap/bitmaskclient/EipFragment.java
index 341208598533b4334d26f9338c9bde3d0b9f8c33..9fcdcac98bf70a989272bef7d36bafb6e9cf338d 100644
--- a/app/src/main/java/se/leap/bitmaskclient/EipFragment.java
+++ b/app/src/main/java/se/leap/bitmaskclient/EipFragment.java
@@ -38,7 +38,6 @@ import android.view.LayoutInflater;
 import android.view.View;
 import android.view.ViewGroup;
 import android.widget.Button;
-import android.widget.TextView;
 
 import java.util.Observable;
 import java.util.Observer;
@@ -145,7 +144,7 @@ public class EipFragment extends Fragment implements Observer {
     @Override
     public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
         eipStatus.addObserver(this);
-        View view = inflater.inflate(R.layout.eip_service_fragment, container, false);
+        View view = inflater.inflate(R.layout.f_eip, container, false);
         ButterKnife.inject(this, view);
 
         Bundle arguments = getArguments();
diff --git a/app/src/main/java/se/leap/bitmaskclient/MainActivity.java b/app/src/main/java/se/leap/bitmaskclient/MainActivity.java
index 1929461810d9aacf3da8b1a5bea459df9b462f42..d9917799ee2e1e8fe5d6440901c9b520aece3f44 100644
--- a/app/src/main/java/se/leap/bitmaskclient/MainActivity.java
+++ b/app/src/main/java/se/leap/bitmaskclient/MainActivity.java
@@ -113,7 +113,7 @@ public class MainActivity extends AppCompatActivity implements Observer {
     @Override
     protected void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
-        setContentView(R.layout.activity_main);
+        setContentView(R.layout.a_main);
         setSupportActionBar((Toolbar) findViewById(R.id.toolbar));
 
         mainActivityBroadcastReceiver = new MainActivityBroadcastReceiver();
@@ -140,6 +140,22 @@ public class MainActivity extends AppCompatActivity implements Observer {
         bindOpenVpnService();
     }
 
+    @Override
+    public void onBackPressed() {
+        FragmentManagerEnhanced fragmentManagerEnhanced = new FragmentManagerEnhanced(getSupportFragmentManager());
+        if (fragmentManagerEnhanced.findFragmentByTag(EipFragment.TAG) == null) {
+            Fragment fragment = new EipFragment();
+            Bundle bundle = new Bundle();
+            bundle.putParcelable(PROVIDER_KEY, provider);
+            fragment.setArguments(bundle);
+            fragmentManagerEnhanced.beginTransaction()
+                    .replace(R.id.container, fragment, EipFragment.TAG)
+                    .commit();
+        } else {
+            super.onBackPressed();
+        }
+    }
+
     @Override
     protected void onNewIntent(Intent intent) {
         super.onNewIntent(intent);
@@ -152,10 +168,12 @@ public class MainActivity extends AppCompatActivity implements Observer {
             return;
         }
 
+        String fragmentTag = null;
         Fragment fragment = null;
         switch (intent.getAction()) {
             case ACTION_SHOW_VPN_FRAGMENT:
                 fragment = new EipFragment();
+                fragmentTag = EipFragment.TAG;
                 Bundle bundle = new Bundle();
                 if (intent.hasExtra(ASK_TO_CANCEL_VPN)) {
                     bundle.putBoolean(ASK_TO_CANCEL_VPN, true);
@@ -175,7 +193,7 @@ public class MainActivity extends AppCompatActivity implements Observer {
 
         if (fragment != null) {
             new FragmentManagerEnhanced(getSupportFragmentManager()).beginTransaction()
-                    .replace(R.id.container, fragment)
+                    .replace(R.id.container, fragment, fragmentTag)
                     .commit();
         }
     }
@@ -214,7 +232,7 @@ public class MainActivity extends AppCompatActivity implements Observer {
         arguments.putParcelable(PROVIDER_KEY, provider);
         fragment.setArguments(arguments);
         new FragmentManagerEnhanced(getSupportFragmentManager()).beginTransaction()
-                .replace(R.id.container, fragment)
+                .replace(R.id.container, fragment, EipFragment.TAG)
                 .commit();
     }
 
diff --git a/app/src/main/java/se/leap/bitmaskclient/ProviderListBaseActivity.java b/app/src/main/java/se/leap/bitmaskclient/ProviderListBaseActivity.java
index 75fffaf73861414c04120332dafa3283f53266c0..e0d6e27d596d548e83ca20b0b63d402323a75c41 100644
--- a/app/src/main/java/se/leap/bitmaskclient/ProviderListBaseActivity.java
+++ b/app/src/main/java/se/leap/bitmaskclient/ProviderListBaseActivity.java
@@ -28,7 +28,6 @@ import android.support.v4.app.DialogFragment;
 import android.support.v4.app.FragmentTransaction;
 import android.support.v4.content.LocalBroadcastManager;
 import android.util.Log;
-import android.view.Menu;
 import android.widget.ListView;
 
 import com.pedrogomez.renderers.Renderer;
@@ -47,7 +46,6 @@ import butterknife.InjectView;
 import butterknife.OnItemClick;
 import se.leap.bitmaskclient.fragments.AboutFragment;
 
-import static se.leap.bitmaskclient.Constants.APP_ACTION_QUIT;
 import static se.leap.bitmaskclient.Constants.BROADCAST_PROVIDER_API_EVENT;
 import static se.leap.bitmaskclient.Constants.BROADCAST_RESULT_CODE;
 import static se.leap.bitmaskclient.Constants.BROADCAST_RESULT_KEY;
@@ -167,7 +165,7 @@ public abstract class ProviderListBaseActivity extends ConfigWizardBaseActivity
     }
 
     private void setUpInitialUI() {
-        setContentView(R.layout.provider_list_activity);
+        setContentView(R.layout.a_provider_list);
         setProviderHeaderText(R.string.setup_provider);
         hideProgressBar();
     }
diff --git a/app/src/main/java/se/leap/bitmaskclient/ProviderRenderer.java b/app/src/main/java/se/leap/bitmaskclient/ProviderRenderer.java
index 5b3e57285b14a7cfb7256368281e5a65075f9645..795c8e824c8c345fb1c03e305484cd994144c49f 100644
--- a/app/src/main/java/se/leap/bitmaskclient/ProviderRenderer.java
+++ b/app/src/main/java/se/leap/bitmaskclient/ProviderRenderer.java
@@ -25,7 +25,7 @@ public class ProviderRenderer extends Renderer<Provider> {
 
     @Override
     protected View inflate(LayoutInflater inflater, ViewGroup parent) {
-        View view = inflater.inflate(R.layout.provider_list_item, parent, false);
+        View view = inflater.inflate(R.layout.v_provider_list_item, parent, false);
         ButterKnife.inject(this, view);
         return view;
     }
diff --git a/app/src/main/java/se/leap/bitmaskclient/VpnNotificationManager.java b/app/src/main/java/se/leap/bitmaskclient/VpnNotificationManager.java
index 459f337bb2b32ea0169e22d8d3d3f7e30d037d9d..f4c7f6824d6981204cf1ddf8e9ecf29ead717460 100644
--- a/app/src/main/java/se/leap/bitmaskclient/VpnNotificationManager.java
+++ b/app/src/main/java/se/leap/bitmaskclient/VpnNotificationManager.java
@@ -111,8 +111,21 @@ public class VpnNotificationManager {
      * @param when
      */
     public void buildOpenVpnNotification(String profileName, final String msg, String tickerText, ConnectionStatus status, long when, String notificationChannelNewstatusId) {
+        String cancelString;
+        switch (status) {
+            // show cancel if no connection
+            case LEVEL_START:
+            case LEVEL_NONETWORK:
+            case LEVEL_CONNECTING_SERVER_REPLIED:
+            case LEVEL_CONNECTING_NO_SERVER_REPLY_YET:
+                cancelString = context.getString(R.string.cancel);
+                break;
+            // show disconnect if connection exists
+            default:
+                cancelString = context.getString(R.string.cancel_connection);
+        }
         NotificationCompat.Action.Builder actionBuilder = new NotificationCompat.Action.
-                Builder(R.drawable.ic_menu_close_clear_cancel, context.getString(R.string.cancel_connection), getDisconnectIntent());
+                Builder(R.drawable.ic_menu_close_clear_cancel, cancelString, getDisconnectIntent());
         String title;
         if (isEmpty(profileName)) {
             title = context.getString(R.string.app_name);
@@ -200,7 +213,7 @@ public class VpnNotificationManager {
      */
     private RemoteViews getKitkatCustomRemoteView(ConnectionStatus status, String title, String message) {
         int iconResource = getIconByConnectionStatus(status);
-        RemoteViews remoteViews = new RemoteViews(context.getPackageName(), R.layout.custom_notification_layout);
+        RemoteViews remoteViews = new RemoteViews(context.getPackageName(), R.layout.v_custom_notification);
         remoteViews.setImageViewResource(R.id.image_icon, iconResource);
         remoteViews.setTextViewText(R.id.message, message);
         remoteViews.setTextViewText(R.id.title, title);
diff --git a/app/src/main/java/se/leap/bitmaskclient/drawer/NavigationDrawerFragment.java b/app/src/main/java/se/leap/bitmaskclient/drawer/NavigationDrawerFragment.java
index 28925efcc64a1eb90f223d0396e50d7480ec37f8..f9adede72398075341d91ac6a2a387941ae800bc 100644
--- a/app/src/main/java/se/leap/bitmaskclient/drawer/NavigationDrawerFragment.java
+++ b/app/src/main/java/se/leap/bitmaskclient/drawer/NavigationDrawerFragment.java
@@ -22,10 +22,13 @@ import android.content.DialogInterface;
 import android.content.Intent;
 import android.content.SharedPreferences;
 import android.content.res.Configuration;
+import android.os.Build;
 import android.os.Bundle;
 import android.os.Handler;
+import android.support.v4.app.DialogFragment;
 import android.support.v4.app.Fragment;
 import android.support.v4.app.FragmentManager;
+import android.support.v4.app.FragmentTransaction;
 import android.support.v4.view.GravityCompat;
 import android.support.v4.widget.DrawerLayout;
 import android.support.v7.app.ActionBar;
@@ -49,6 +52,8 @@ import android.widget.Toast;
 import se.leap.bitmaskclient.ConfigHelper;
 import se.leap.bitmaskclient.DrawerSettingsAdapter;
 import se.leap.bitmaskclient.DrawerSettingsAdapter.DrawerSettingsItem;
+import se.leap.bitmaskclient.FragmentManagerEnhanced;
+import se.leap.bitmaskclient.fragments.AlwaysOnDialog;
 import se.leap.bitmaskclient.EipFragment;
 import se.leap.bitmaskclient.Provider;
 import se.leap.bitmaskclient.ProviderListActivity;
@@ -59,10 +64,12 @@ import se.leap.bitmaskclient.fragments.LogFragment;
 import static android.content.Context.MODE_PRIVATE;
 import static se.leap.bitmaskclient.BitmaskApp.getRefWatcher;
 import static se.leap.bitmaskclient.ConfigHelper.getSaveBattery;
+import static se.leap.bitmaskclient.ConfigHelper.getShowAlwaysOnDialog;
 import static se.leap.bitmaskclient.Constants.PROVIDER_KEY;
 import static se.leap.bitmaskclient.Constants.REQUEST_CODE_SWITCH_PROVIDER;
 import static se.leap.bitmaskclient.Constants.SHARED_PREFERENCES;
 import static se.leap.bitmaskclient.DrawerSettingsAdapter.ABOUT;
+import static se.leap.bitmaskclient.DrawerSettingsAdapter.ALWAYS_ON;
 import static se.leap.bitmaskclient.DrawerSettingsAdapter.BATTERY_SAVER;
 import static se.leap.bitmaskclient.DrawerSettingsAdapter.DrawerSettingsItem.getSimpleTextInstance;
 import static se.leap.bitmaskclient.DrawerSettingsAdapter.DrawerSettingsItem.getSwitchInstance;
@@ -135,7 +142,7 @@ public class NavigationDrawerFragment extends Fragment {
     @Override
     public View onCreateView(LayoutInflater inflater, ViewGroup container,
                              Bundle savedInstanceState) {
-        mDrawerView = inflater.inflate(R.layout.drawer_main, container, false);
+        mDrawerView = inflater.inflate(R.layout.f_drawer_main, container, false);
         restoreFromSavedInstance(savedInstanceState);
         return mDrawerView;
     }
@@ -180,6 +187,9 @@ public class NavigationDrawerFragment extends Fragment {
                         }
                     }));
         }
+        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
+            settingsListAdapter.addItem(getSimpleTextInstance(getString(R.string.always_on_vpn), ALWAYS_ON));
+        }
         settingsListAdapter.addItem(getSimpleTextInstance(getString(switch_provider_menu_option), SWITCH_PROVIDER));
         settingsListAdapter.addItem(getSimpleTextInstance(getString(log_fragment_title), LOG));
         settingsListAdapter.addItem(getSimpleTextInstance(getString(about_fragment_title), ABOUT));
@@ -194,7 +204,7 @@ public class NavigationDrawerFragment extends Fragment {
         });
 
         accountListAdapter = new ArrayAdapter<>(actionBar.getThemedContext(),
-                R.layout.single_list_item,
+                R.layout.v_single_list_item,
                 android.R.id.text1);
 
         createListAdapterData();
@@ -317,7 +327,8 @@ public class NavigationDrawerFragment extends Fragment {
         try {
             AlertDialog.Builder alertBuilder = new AlertDialog.Builder(getActivity());
             showEnableExperimentalFeature = true;
-            alertDialog = alertBuilder.setTitle(activity.getString(R.string.save_battery))
+            alertDialog = alertBuilder
+                    .setTitle(activity.getString(R.string.save_battery))
                     .setMessage(activity.getString(R.string.save_battery_message))
                     .setPositiveButton((android.R.string.yes), new DialogInterface.OnClickListener() {
                         @Override
@@ -347,6 +358,19 @@ public class NavigationDrawerFragment extends Fragment {
         } catch (IllegalStateException e) {
             e.printStackTrace();
         }
+    }
+
+    public void showAlwaysOnDialog() {
+        try {
+
+            FragmentTransaction fragmentTransaction = new FragmentManagerEnhanced(
+                    getActivity().getSupportFragmentManager()).removePreviousFragment(
+                    AlwaysOnDialog.TAG);
+            DialogFragment newFragment = new AlwaysOnDialog();
+            newFragment.show(fragmentTransaction, AlwaysOnDialog.TAG);
+        } catch (IllegalStateException | NullPointerException e) {
+            e.printStackTrace();
+        }
 
     }
 
@@ -371,11 +395,6 @@ public class NavigationDrawerFragment extends Fragment {
             return true;
         }
 
-        if (item.getItemId() == R.id.action_example) {
-            Toast.makeText(getActivity(), "Example action.", Toast.LENGTH_SHORT).show();
-            return true;
-        }
-
         return super.onOptionsItemSelected(item);
     }
 
@@ -428,10 +447,12 @@ public class NavigationDrawerFragment extends Fragment {
         // update the main content by replacing fragments
         FragmentManager fragmentManager = getFragmentManager();
         Fragment fragment = null;
+        String fragmentTag = null;
 
         if (parent == mDrawerAccountsListView) {
             mTitle = getString(R.string.vpn_fragment_title);
             fragment = new EipFragment();
+            fragmentTag = EipFragment.TAG;
             Bundle arguments = new Bundle();
             Provider currentProvider = ConfigHelper.getSavedProviderFromSharedPreferences(preferences);
             arguments.putParcelable(PROVIDER_KEY, currentProvider);
@@ -451,6 +472,15 @@ public class NavigationDrawerFragment extends Fragment {
                     mTitle = getString(about_fragment_title);
                     fragment = new AboutFragment();
                     break;
+                case ALWAYS_ON:
+                    if (getShowAlwaysOnDialog(getContext())) {
+                        showAlwaysOnDialog();
+                    } else {
+                        Intent intent = new Intent("android.net.vpn.SETTINGS");
+                        intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
+                        startActivity(intent);
+                    }
+                    break;
                 default:
                     break;
             }
@@ -458,7 +488,7 @@ public class NavigationDrawerFragment extends Fragment {
 
         if (fragment != null) {
             fragmentManager.beginTransaction()
-                    .replace(R.id.container, fragment)
+                    .replace(R.id.container, fragment, fragmentTag)
                     .commit();
         }
 
diff --git a/app/src/main/java/se/leap/bitmaskclient/fragments/AboutFragment.java b/app/src/main/java/se/leap/bitmaskclient/fragments/AboutFragment.java
index 113ce3976679451521cafca15f9a61bf41e2e6f1..2f37f5b0db1a5dfc840eb40ad474317fda8ee674 100644
--- a/app/src/main/java/se/leap/bitmaskclient/fragments/AboutFragment.java
+++ b/app/src/main/java/se/leap/bitmaskclient/fragments/AboutFragment.java
@@ -3,7 +3,6 @@ package se.leap.bitmaskclient.fragments;
 import android.content.pm.PackageInfo;
 import android.content.pm.PackageManager.NameNotFoundException;
 import android.os.Bundle;
-import android.support.annotation.Nullable;
 import android.support.v4.app.Fragment;
 import android.view.LayoutInflater;
 import android.view.View;
@@ -24,7 +23,7 @@ public class AboutFragment extends Fragment {
 
     @Override
     public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
-        View view = inflater.inflate(R.layout.about, container, false);
+        View view = inflater.inflate(R.layout.f_about, container, false);
         ButterKnife.inject(this, view);
         return view;
     }
diff --git a/app/src/main/java/se/leap/bitmaskclient/fragments/AlwaysOnDialog.java b/app/src/main/java/se/leap/bitmaskclient/fragments/AlwaysOnDialog.java
new file mode 100644
index 0000000000000000000000000000000000000000..3558f37842dc69c765ecd07119aea524630fc44b
--- /dev/null
+++ b/app/src/main/java/se/leap/bitmaskclient/fragments/AlwaysOnDialog.java
@@ -0,0 +1,71 @@
+package se.leap.bitmaskclient.fragments;
+
+import android.app.Dialog;
+import android.content.DialogInterface;
+import android.content.Intent;
+import android.os.Bundle;
+import android.support.annotation.NonNull;
+import android.support.annotation.Nullable;
+import android.support.v7.app.AlertDialog;
+import android.support.v7.app.AppCompatDialogFragment;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.widget.CheckBox;
+
+import butterknife.ButterKnife;
+import butterknife.InjectView;
+import se.leap.bitmaskclient.R;
+import se.leap.bitmaskclient.views.IconTextView;
+
+import static se.leap.bitmaskclient.ConfigHelper.saveShowAlwaysOnDialog;
+
+/**
+ * Created by cyberta on 25.02.18.
+ */
+
+
+
+public class AlwaysOnDialog extends AppCompatDialogFragment {
+
+    public final static String TAG = AlwaysOnDialog.class.getName();
+
+    @InjectView(R.id.do_not_show_again)
+    CheckBox doNotShowAgainCheckBox;
+
+    @InjectView(R.id.user_message)
+    IconTextView userMessage;
+
+    @Override
+    public void onCreate(@Nullable Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+    }
+
+    @NonNull
+    @Override
+    public Dialog onCreateDialog(Bundle savedInstanceState) {
+        AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
+        LayoutInflater inflater = getActivity().getLayoutInflater();
+        View view = inflater.inflate(R.layout.d_checkbox_confirm, null);
+        ButterKnife.inject(this, view);
+
+        userMessage.setIcon(R.drawable.ic_settings);
+        userMessage.setText(getString(R.string.always_on_vpn_user_message));
+        builder.setView(view)
+                .setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener() {
+                    public void onClick(DialogInterface dialog, int id) {
+                        if (doNotShowAgainCheckBox.isChecked()) {
+                            saveShowAlwaysOnDialog(getContext(), false);
+                        }
+                        Intent intent = new Intent("android.net.vpn.SETTINGS");
+                        intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
+                        startActivity(intent);
+                    }
+                })
+                .setNegativeButton(R.string.cancel, new DialogInterface.OnClickListener() {
+                    public void onClick(DialogInterface dialog, int id) {
+                        dialog.cancel();
+                    }
+                });
+        return builder.create();
+    }
+}
diff --git a/app/src/main/java/se/leap/bitmaskclient/views/IconTextView.java b/app/src/main/java/se/leap/bitmaskclient/views/IconTextView.java
new file mode 100644
index 0000000000000000000000000000000000000000..0af33c680e31c26d61b1d65501eb7aba15fcb3a8
--- /dev/null
+++ b/app/src/main/java/se/leap/bitmaskclient/views/IconTextView.java
@@ -0,0 +1,96 @@
+package se.leap.bitmaskclient.views;
+
+
+import android.content.Context;
+import android.graphics.PorterDuff;
+import android.graphics.drawable.Drawable;
+import android.support.v7.widget.AppCompatTextView;
+import android.text.Spannable;
+import android.text.style.ImageSpan;
+import android.util.AttributeSet;
+
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+public class IconTextView extends AppCompatTextView {
+
+    private int imageResource = 0;
+    /**
+     * Regex pattern that looks for embedded images of the format: [img src=imageName/]
+     */
+    public static final String PATTERN = "\\Q[img src]\\E";
+
+    public IconTextView(Context context, AttributeSet attrs, int defStyle) {
+        super(context, attrs, defStyle);
+    }
+
+    public IconTextView(Context context, AttributeSet attrs) {
+        super(context, attrs);
+    }
+
+    public IconTextView(Context context) {
+        super(context);
+    }
+
+    @Override
+    public void setText(CharSequence text, BufferType type) {
+        final Spannable spannable = getTextWithImages(getContext(), text, getLineHeight(), getCurrentTextColor());
+        super.setText(spannable, BufferType.SPANNABLE);
+    }
+
+    public void setIcon(int imageResource) {
+        this.imageResource = imageResource;
+    }
+
+    private Spannable getTextWithImages(Context context, CharSequence text, int lineHeight, int colour) {
+        final Spannable spannable = Spannable.Factory.getInstance().newSpannable(text);
+        addImages(context, spannable, lineHeight, colour);
+        return spannable;
+    }
+
+    private void addImages(Context context, Spannable spannable, int lineHeight, int colour) {
+        final Pattern refImg = Pattern.compile(PATTERN);
+
+        final Matcher matcher = refImg.matcher(spannable);
+        while (matcher.find()) {
+            boolean set = true;
+            for (ImageSpan span : spannable.getSpans(matcher.start(), matcher.end(), ImageSpan.class)) {
+                if (spannable.getSpanStart(span) >= matcher.start()
+                        && spannable.getSpanEnd(span) <= matcher.end()) {
+                    spannable.removeSpan(span);
+                } else {
+                    set = false;
+                    break;
+                }
+            }
+            if (set && imageResource != 0) {
+                spannable.setSpan(makeImageSpan(context, imageResource, lineHeight, colour),
+                        matcher.start(),
+                        matcher.end(),
+                        Spannable.SPAN_EXCLUSIVE_EXCLUSIVE
+                );
+            }
+        }
+    }
+
+    /**
+     * Create an ImageSpan for the given icon drawable. This also sets the image size and colour.
+     * Works best with a white, square icon because of the colouring and resizing.
+     *
+     * @param context       The Android Context.
+     * @param drawableResId A drawable resource Id.
+     * @param size          The desired size (i.e. width and height) of the image icon in pixels.
+     *                      Use the lineHeight of the TextView to make the image inline with the
+     *                      surrounding text.
+     * @param colour        The colour (careful: NOT a resource Id) to apply to the image.
+     * @return An ImageSpan, aligned with the bottom of the text.
+     */
+    private ImageSpan makeImageSpan(Context context, int drawableResId, int size, int colour) {
+        final Drawable drawable = context.getResources().getDrawable(drawableResId);
+        drawable.mutate();
+        drawable.setColorFilter(colour, PorterDuff.Mode.MULTIPLY);
+        drawable.setBounds(0, 0, size, size);
+        return new ImageSpan(drawable, ImageSpan.ALIGN_BOTTOM);
+    }
+
+}
\ No newline at end of file
diff --git a/app/src/main/res/drawable-hdpi/ic_settings.png b/app/src/main/res/drawable-hdpi/ic_settings.png
new file mode 100644
index 0000000000000000000000000000000000000000..d3322976112cc14b286b867f32394a57acb85f73
Binary files /dev/null and b/app/src/main/res/drawable-hdpi/ic_settings.png differ
diff --git a/app/src/main/res/drawable-ldpi/ic_settings.png b/app/src/main/res/drawable-ldpi/ic_settings.png
new file mode 100644
index 0000000000000000000000000000000000000000..2fe034645a1b4f85ae6b4a81592f77f12f19bcbe
Binary files /dev/null and b/app/src/main/res/drawable-ldpi/ic_settings.png differ
diff --git a/app/src/main/res/drawable-mdpi/ic_settings.png b/app/src/main/res/drawable-mdpi/ic_settings.png
new file mode 100644
index 0000000000000000000000000000000000000000..b5988be9306f70a1847265f3a340321e55861f89
Binary files /dev/null and b/app/src/main/res/drawable-mdpi/ic_settings.png differ
diff --git a/app/src/main/res/drawable-xhdpi/ic_settings.png b/app/src/main/res/drawable-xhdpi/ic_settings.png
new file mode 100644
index 0000000000000000000000000000000000000000..d5959bd96d9b003ffd2113cdf9d2aefea82a6de0
Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/ic_settings.png differ
diff --git a/app/src/main/res/layout-sw600dp-port/a_provider_credentials.xml b/app/src/main/res/layout-sw600dp-port/a_provider_credentials.xml
index 0cbb08f6d14b60efb5be025fd5108a41c57b1d1d..1d689db6eb9399bc36bcad1bb3b32e0e5d3eaca0 100644
--- a/app/src/main/res/layout-sw600dp-port/a_provider_credentials.xml
+++ b/app/src/main/res/layout-sw600dp-port/a_provider_credentials.xml
@@ -58,7 +58,7 @@
         app:layout_constraintWidth_min="731dp"
         >
 
-        <include layout="@layout/loading_screen" />
+        <include layout="@layout/v_loading_screen" />
 
         <LinearLayout
             android:layout_width="match_parent"
@@ -67,7 +67,7 @@
             android:orientation="vertical">
 
             <include
-                layout="@layout/provider_header"
+                layout="@layout/v_provider_header"
                 android:layout_width="match_parent"
                 android:layout_height="wrap_content" />
 
@@ -83,7 +83,7 @@
                     android:layout_height="wrap_content"
                     android:orientation="vertical">
                     <include
-                        layout="@layout/provider_credentials"
+                        layout="@layout/v_provider_credentials"
                         android:layout_width="match_parent"
                         android:layout_height="wrap_content" />
 
diff --git a/app/src/main/res/layout-sw600dp-port/a_provider_detail.xml b/app/src/main/res/layout-sw600dp-port/a_provider_detail.xml
index bdafa45a245e314b73ce72bbe082b8494804df87..6d7c97ae08f0594964ff90d4d60091080d5bcc83 100644
--- a/app/src/main/res/layout-sw600dp-port/a_provider_detail.xml
+++ b/app/src/main/res/layout-sw600dp-port/a_provider_detail.xml
@@ -58,7 +58,7 @@
         app:layout_constraintTop_toTopOf="@+id/guideline_top"
         app:layout_constraintWidth_min="731dp">
 
-        <include layout="@layout/loading_screen" />
+        <include layout="@layout/v_loading_screen" />
 
         <LinearLayout
             android:id="@+id/content"
@@ -67,7 +67,7 @@
             android:layout_height="wrap_content">
 
             <include
-                layout="@layout/provider_header"
+                layout="@layout/v_provider_header"
                 android:layout_width="match_parent"
                 android:layout_height="wrap_content" />
 
diff --git a/app/src/main/res/layout-sw600dp-port/provider_list_activity.xml b/app/src/main/res/layout-sw600dp-port/a_provider_list.xml
similarity index 96%
rename from app/src/main/res/layout-sw600dp-port/provider_list_activity.xml
rename to app/src/main/res/layout-sw600dp-port/a_provider_list.xml
index f02398c5776cdc05c1b560e9407088f9df75e306..818ce8642d0c1919ba3bd7b23c223860df1cefe8 100644
--- a/app/src/main/res/layout-sw600dp-port/provider_list_activity.xml
+++ b/app/src/main/res/layout-sw600dp-port/a_provider_list.xml
@@ -58,7 +58,7 @@
         app:layout_constraintTop_toTopOf="@+id/guideline_top"
         app:layout_constraintWidth_min="731dp">
 
-        <include layout="@layout/loading_screen" />
+        <include layout="@layout/v_loading_screen" />
 
         <LinearLayout
             android:id="@+id/content"
@@ -66,7 +66,7 @@
             android:layout_width="match_parent"
             android:layout_height="wrap_content">
 
-            <include layout="@layout/provider_header"
+            <include layout="@layout/v_provider_header"
                 android:layout_width="match_parent"
                 android:layout_height="wrap_content" />
 
diff --git a/app/src/main/res/layout-sw600dp-port/f_log.xml b/app/src/main/res/layout-sw600dp-port/f_log.xml
index 78dc4c62d87c9dd54bd9108555ec1a45cb8a43e7..ebadeb740c5c8205053e297a947fef89d5c909d3 100644
--- a/app/src/main/res/layout-sw600dp-port/f_log.xml
+++ b/app/src/main/res/layout-sw600dp-port/f_log.xml
@@ -22,7 +22,7 @@
 
         <include layout="@layout/f_log_sliders"/>
 
-        <include layout="@layout/vpnstatus"/>
+        <include layout="@layout/v_vpn_status"/>
     </LinearLayout>
 
     <ListView
diff --git a/app/src/main/res/layout-sw600dp/f_log.xml b/app/src/main/res/layout-sw600dp/f_log.xml
index 34daf8bea56de496a0913b4a3b9d7ea3e15a9800..b014ee9d28e2be5f3a2429508eb4aaee21dde81e 100644
--- a/app/src/main/res/layout-sw600dp/f_log.xml
+++ b/app/src/main/res/layout-sw600dp/f_log.xml
@@ -22,7 +22,7 @@
 
         <include layout="@layout/f_log_sliders"/>
 
-        <include layout="@layout/vpnstatus"/>
+        <include layout="@layout/v_vpn_status"/>
     </LinearLayout>
 
     <ListView
diff --git a/app/src/main/res/layout-xlarge/a_provider_credentials.xml b/app/src/main/res/layout-xlarge/a_provider_credentials.xml
index 2184aeb8c3d1ba36832f8e9390400542ad769d97..7904508264cd2ab9cd96e25230ec9a577dd98c04 100644
--- a/app/src/main/res/layout-xlarge/a_provider_credentials.xml
+++ b/app/src/main/res/layout-xlarge/a_provider_credentials.xml
@@ -57,7 +57,7 @@
         app:layout_constraintTop_toTopOf="@+id/guideline_top"
         app:layout_constraintWidth_min="731dp">
 
-        <include layout="@layout/loading_screen" />
+        <include layout="@layout/v_loading_screen" />
 
         <LinearLayout
             android:layout_width="match_parent"
@@ -66,7 +66,7 @@
             android:orientation="vertical">
 
             <include
-                layout="@layout/provider_header"
+                layout="@layout/v_provider_header"
                 android:layout_width="match_parent"
                 android:layout_height="wrap_content" />
 
@@ -82,7 +82,7 @@
                     android:layout_height="wrap_content"
                     android:orientation="vertical">
                     <include
-                        layout="@layout/provider_credentials"
+                        layout="@layout/v_provider_credentials"
                         android:layout_width="match_parent"
                         android:layout_height="wrap_content" />
 
diff --git a/app/src/main/res/layout-xlarge/a_provider_detail.xml b/app/src/main/res/layout-xlarge/a_provider_detail.xml
index 18098079f7963d8aa1b2977d212fba913654c5e3..c1eeb0e0633274d9b2d046fc6c89c18f6314e586 100644
--- a/app/src/main/res/layout-xlarge/a_provider_detail.xml
+++ b/app/src/main/res/layout-xlarge/a_provider_detail.xml
@@ -58,7 +58,7 @@
         app:layout_constraintTop_toTopOf="@+id/guideline_top"
         app:layout_constraintWidth_min="731dp">
 
-        <include layout="@layout/loading_screen" />
+        <include layout="@layout/v_loading_screen" />
 
         <LinearLayout
             android:id="@+id/content"
@@ -67,7 +67,7 @@
             android:layout_height="wrap_content">
 
             <include
-                layout="@layout/provider_header"
+                layout="@layout/v_provider_header"
                 android:layout_width="match_parent"
                 android:layout_height="wrap_content" />
 
diff --git a/app/src/main/res/layout-xlarge/provider_list_activity.xml b/app/src/main/res/layout-xlarge/a_provider_list.xml
similarity index 96%
rename from app/src/main/res/layout-xlarge/provider_list_activity.xml
rename to app/src/main/res/layout-xlarge/a_provider_list.xml
index cdffc24e2b3730bf465c08cbae76f1d1b2f172eb..9150466a43e6a66d4f34dc8aa8498467df77c64f 100644
--- a/app/src/main/res/layout-xlarge/provider_list_activity.xml
+++ b/app/src/main/res/layout-xlarge/a_provider_list.xml
@@ -58,7 +58,7 @@
         app:layout_constraintTop_toTopOf="@+id/guideline_top"
         app:layout_constraintWidth_min="731dp">
 
-        <include layout="@layout/loading_screen" />
+        <include layout="@layout/v_loading_screen" />
 
         <LinearLayout
             android:id="@+id/content"
@@ -66,7 +66,7 @@
             android:layout_width="match_parent"
             android:layout_height="wrap_content">
 
-            <include layout="@layout/provider_header"
+            <include layout="@layout/v_provider_header"
                 android:layout_width="match_parent"
                 android:layout_height="wrap_content" />
 
diff --git a/app/src/main/res/layout-xlarge/about.xml b/app/src/main/res/layout-xlarge/f_about.xml
similarity index 100%
rename from app/src/main/res/layout-xlarge/about.xml
rename to app/src/main/res/layout-xlarge/f_about.xml
diff --git a/app/src/main/res/layout-xlarge/eip_service_fragment.xml b/app/src/main/res/layout-xlarge/f_eip.xml
similarity index 100%
rename from app/src/main/res/layout-xlarge/eip_service_fragment.xml
rename to app/src/main/res/layout-xlarge/f_eip.xml
diff --git a/app/src/main/res/layout-xlarge/session_dialog.xml b/app/src/main/res/layout-xlarge/session_dialog.xml
deleted file mode 100644
index 3a9eebb8fc5dbd4fdfc889dacc13089fb36c82f5..0000000000000000000000000000000000000000
--- a/app/src/main/res/layout-xlarge/session_dialog.xml
+++ /dev/null
@@ -1,39 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:tools="http://schemas.android.com/tools"
-    android:layout_width="wrap_content"
-    android:layout_height="wrap_content"
-    android:orientation="vertical"
-    tools:context=".LogInDialog" >
-
-    <TextView
-        android:id="@+id/user_message"
-        android:layout_width="match_parent"
-        android:layout_height="wrap_content"
-        android:gravity="center"
-        android:textAppearance="?android:attr/textAppearanceMedium" />
-
-    <EditText
-        android:id="@+id/username_entered"
-        android:layout_width="match_parent"
-        android:layout_height="wrap_content"
-        android:layout_marginBottom="4dp"
-        android:layout_marginLeft="4dp"
-        android:layout_marginRight="4dp"
-        android:layout_marginTop="16dp"
-        android:ems="10"
-        android:hint="@string/username_hint"
-        android:inputType="textUri" >
-
-        <requestFocus />
-    </EditText>
-
-    <EditText
-        android:id="@+id/password_entered"
-        android:layout_width="match_parent"
-        android:layout_height="wrap_content"
-        android:ems="10"
-        android:hint="@string/password_hint"
-        android:inputType="textPassword" />
-
-</LinearLayout>
\ No newline at end of file
diff --git a/app/src/main/res/layout-xlarge/loading_screen.xml b/app/src/main/res/layout-xlarge/v_loading_screen.xml
similarity index 100%
rename from app/src/main/res/layout-xlarge/loading_screen.xml
rename to app/src/main/res/layout-xlarge/v_loading_screen.xml
diff --git a/app/src/main/res/layout-xlarge/provider_header.xml b/app/src/main/res/layout-xlarge/v_provider_header.xml
similarity index 100%
rename from app/src/main/res/layout-xlarge/provider_header.xml
rename to app/src/main/res/layout-xlarge/v_provider_header.xml
diff --git a/app/src/main/res/layout-xlarge/provider_list_item.xml b/app/src/main/res/layout-xlarge/v_provider_list_item.xml
similarity index 100%
rename from app/src/main/res/layout-xlarge/provider_list_item.xml
rename to app/src/main/res/layout-xlarge/v_provider_list_item.xml
diff --git a/app/src/main/res/layout-xlarge/single_list_item.xml b/app/src/main/res/layout-xlarge/v_single_list_item.xml
similarity index 100%
rename from app/src/main/res/layout-xlarge/single_list_item.xml
rename to app/src/main/res/layout-xlarge/v_single_list_item.xml
diff --git a/app/src/main/res/layout-xlarge/vpnstatus.xml b/app/src/main/res/layout-xlarge/v_vpn_status.xml
similarity index 100%
rename from app/src/main/res/layout-xlarge/vpnstatus.xml
rename to app/src/main/res/layout-xlarge/v_vpn_status.xml
diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/a_main.xml
similarity index 97%
rename from app/src/main/res/layout/activity_main.xml
rename to app/src/main/res/layout/a_main.xml
index de06efc7b686afa34d6d52b905978da59daac1b6..bed05d18b70becb805e1d813cf7cc82aee92526d 100644
--- a/app/src/main/res/layout/activity_main.xml
+++ b/app/src/main/res/layout/a_main.xml
@@ -37,6 +37,6 @@
         android:layout_width="@dimen/navigation_drawer_width"
         android:layout_height="match_parent"
         android:layout_gravity="start"
-        tools:layout="@layout/drawer_main" />
+        tools:layout="@layout/f_drawer_main" />
 
 </android.support.v4.widget.DrawerLayout>
diff --git a/app/src/main/res/layout/a_provider_credentials.xml b/app/src/main/res/layout/a_provider_credentials.xml
index 6667d9058de56e1be2d1d3c525357bb2062b56d4..5fefb2a3dbc7e41918b4a4cd710a37353acc65e5 100644
--- a/app/src/main/res/layout/a_provider_credentials.xml
+++ b/app/src/main/res/layout/a_provider_credentials.xml
@@ -7,7 +7,7 @@
     android:padding="@dimen/stdpadding"
     style="@style/BitmaskActivity">
 
-    <include layout="@layout/loading_screen" />
+    <include layout="@layout/v_loading_screen" />
 
     <LinearLayout
         android:id="@+id/content"
@@ -17,7 +17,7 @@
         >
 
         <include
-            layout="@layout/provider_header"
+            layout="@layout/v_provider_header"
             android:layout_width="match_parent"
             android:layout_height="wrap_content" />
 
@@ -33,7 +33,7 @@
                 android:layout_height="wrap_content"
                 android:orientation="vertical">
                 <include
-                    layout="@layout/provider_credentials"
+                    layout="@layout/v_provider_credentials"
                     android:layout_width="match_parent"
                     android:layout_height="wrap_content" />
 
diff --git a/app/src/main/res/layout/a_provider_detail.xml b/app/src/main/res/layout/a_provider_detail.xml
index 018d4ee80ddfc2161deb77f662f58b5cbf2e8650..56b38ada16e136f8b3c21eece1ea009877002cfe 100644
--- a/app/src/main/res/layout/a_provider_detail.xml
+++ b/app/src/main/res/layout/a_provider_detail.xml
@@ -7,7 +7,7 @@
     android:orientation="vertical"
     style="@style/BitmaskActivity" >
 
-    <include layout="@layout/loading_screen" />
+    <include layout="@layout/v_loading_screen" />
 
     <LinearLayout
         android:id="@+id/content"
@@ -16,7 +16,7 @@
         android:layout_height="match_parent">
 
         <include
-            layout="@layout/provider_header"
+            layout="@layout/v_provider_header"
             android:layout_width="match_parent"
             android:layout_height="wrap_content" />
 
diff --git a/app/src/main/res/layout/provider_list_activity.xml b/app/src/main/res/layout/a_provider_list.xml
similarity index 89%
rename from app/src/main/res/layout/provider_list_activity.xml
rename to app/src/main/res/layout/a_provider_list.xml
index 6c5281b81553bcc647e2d405a50a86d40230b5cc..aa8cdfbb7944dd1a46e743c88f0f5ff600b76157 100644
--- a/app/src/main/res/layout/provider_list_activity.xml
+++ b/app/src/main/res/layout/a_provider_list.xml
@@ -7,7 +7,7 @@
     android:padding="@dimen/stdpadding"
     style="@style/BitmaskActivity" >
 
-    <include layout="@layout/loading_screen" />
+    <include layout="@layout/v_loading_screen" />
 
     <LinearLayout
         android:id="@+id/content"
@@ -15,7 +15,7 @@
         android:layout_height="match_parent"
         android:orientation="vertical">
 
-        <include layout="@layout/provider_header" />
+        <include layout="@layout/v_provider_header" />
 
         <ListView
             android:id="@+id/provider_list"
diff --git a/app/src/main/res/layout/d_checkbox_confirm.xml b/app/src/main/res/layout/d_checkbox_confirm.xml
new file mode 100644
index 0000000000000000000000000000000000000000..6dd22417f6c9605b1b44030f6e5ef54f8d7a7ee6
--- /dev/null
+++ b/app/src/main/res/layout/d_checkbox_confirm.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="utf-8"?>
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    android:layout_width="wrap_content"
+    android:layout_height="wrap_content"
+    android:orientation="vertical">
+
+    <se.leap.bitmaskclient.views.IconTextView
+        android:id="@+id/user_message"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:layout_margin="@dimen/activity_horizontal_margin"
+        android:layout_marginBottom="0dp"
+        android:autoLink="web"
+        />
+
+
+    <CheckBox
+        android:id="@+id/do_not_show_again"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:layout_margin="@dimen/stdpadding"
+        android:text="@string/do_not_show_again" />
+
+</LinearLayout>
\ No newline at end of file
diff --git a/app/src/main/res/layout/about.xml b/app/src/main/res/layout/f_about.xml
similarity index 100%
rename from app/src/main/res/layout/about.xml
rename to app/src/main/res/layout/f_about.xml
diff --git a/app/src/main/res/layout/drawer_main.xml b/app/src/main/res/layout/f_drawer_main.xml
similarity index 100%
rename from app/src/main/res/layout/drawer_main.xml
rename to app/src/main/res/layout/f_drawer_main.xml
diff --git a/app/src/main/res/layout/eip_service_fragment.xml b/app/src/main/res/layout/f_eip.xml
similarity index 100%
rename from app/src/main/res/layout/eip_service_fragment.xml
rename to app/src/main/res/layout/f_eip.xml
diff --git a/app/src/main/res/layout/fragment_main.xml b/app/src/main/res/layout/fragment_main.xml
deleted file mode 100644
index 31dbd11e81f0b55b7517ededa23048959405cfa1..0000000000000000000000000000000000000000
--- a/app/src/main/res/layout/fragment_main.xml
+++ /dev/null
@@ -1,16 +0,0 @@
-<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:tools="http://schemas.android.com/tools"
-    android:layout_width="match_parent"
-    android:layout_height="match_parent"
-    android:paddingBottom="@dimen/activity_vertical_margin"
-    android:paddingLeft="@dimen/activity_horizontal_margin"
-    android:paddingRight="@dimen/activity_horizontal_margin"
-    android:paddingTop="@dimen/activity_vertical_margin"
-    tools:context="se.leap.bitmaskclient.MainActivity$PlaceholderFragment">
-
-    <TextView
-        android:id="@+id/section_label"
-        android:layout_width="wrap_content"
-        android:layout_height="wrap_content" />
-
-</RelativeLayout>
diff --git a/app/src/main/res/layout/session_dialog.xml b/app/src/main/res/layout/session_dialog.xml
deleted file mode 100644
index 62215ae8a3a1dbca2cc18d372c4d4c507cbcb10f..0000000000000000000000000000000000000000
--- a/app/src/main/res/layout/session_dialog.xml
+++ /dev/null
@@ -1,42 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:tools="http://schemas.android.com/tools"
-    android:layout_width="wrap_content"
-    android:layout_height="wrap_content"
-    android:orientation="vertical"
-    tools:context=".SessionDialog" >
-
-    <TextView
-        android:id="@+id/user_message"
-        android:layout_width="match_parent"
-        android:layout_height="wrap_content"
-        android:gravity="center"
-        android:visibility="gone"
-        android:textAppearance="?android:attr/textAppearanceMedium" />
-
-    <EditText
-        android:id="@+id/username_entered"
-        android:layout_width="match_parent"
-        android:layout_height="wrap_content"
-        android:layout_marginBottom="4dp"
-        android:layout_marginLeft="4dp"
-        android:layout_marginRight="4dp"
-        android:layout_marginTop="16dp"
-        android:textSize="24sp"
-        android:ems="10"
-        android:hint="@string/username_hint"
-        android:inputType="textUri" >
-
-        <requestFocus />
-    </EditText>
-
-    <EditText
-        android:id="@+id/password_entered"
-        android:layout_width="match_parent"
-        android:layout_height="wrap_content"
-        android:textSize="24sp"
-        android:ems="10"
-        android:hint="@string/password_hint"
-        android:inputType="textPassword" />
-
-</LinearLayout>
\ No newline at end of file
diff --git a/app/src/main/res/layout/custom_notification_layout.xml b/app/src/main/res/layout/v_custom_notification.xml
similarity index 100%
rename from app/src/main/res/layout/custom_notification_layout.xml
rename to app/src/main/res/layout/v_custom_notification.xml
diff --git a/app/src/main/res/layout/loading_screen.xml b/app/src/main/res/layout/v_loading_screen.xml
similarity index 100%
rename from app/src/main/res/layout/loading_screen.xml
rename to app/src/main/res/layout/v_loading_screen.xml
diff --git a/app/src/main/res/layout/provider_credentials.xml b/app/src/main/res/layout/v_provider_credentials.xml
similarity index 100%
rename from app/src/main/res/layout/provider_credentials.xml
rename to app/src/main/res/layout/v_provider_credentials.xml
diff --git a/app/src/main/res/layout/provider_header.xml b/app/src/main/res/layout/v_provider_header.xml
similarity index 100%
rename from app/src/main/res/layout/provider_header.xml
rename to app/src/main/res/layout/v_provider_header.xml
diff --git a/app/src/main/res/layout/provider_list_item.xml b/app/src/main/res/layout/v_provider_list_item.xml
similarity index 100%
rename from app/src/main/res/layout/provider_list_item.xml
rename to app/src/main/res/layout/v_provider_list_item.xml
diff --git a/app/src/main/res/layout/single_list_item.xml b/app/src/main/res/layout/v_single_list_item.xml
similarity index 100%
rename from app/src/main/res/layout/single_list_item.xml
rename to app/src/main/res/layout/v_single_list_item.xml
diff --git a/app/src/main/res/layout/switch_list_item.xml b/app/src/main/res/layout/v_switch_list_item.xml
similarity index 100%
rename from app/src/main/res/layout/switch_list_item.xml
rename to app/src/main/res/layout/v_switch_list_item.xml
diff --git a/app/src/main/res/layout/vpnstatus.xml b/app/src/main/res/layout/v_vpn_status.xml
similarity index 100%
rename from app/src/main/res/layout/vpnstatus.xml
rename to app/src/main/res/layout/v_vpn_status.xml
diff --git a/app/src/main/res/menu/main.xml b/app/src/main/res/menu/main.xml
deleted file mode 100644
index 56f439591bfb49c6ccdadb002aaed6d8e587109c..0000000000000000000000000000000000000000
--- a/app/src/main/res/menu/main.xml
+++ /dev/null
@@ -1,13 +0,0 @@
-<menu xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:tools="http://schemas.android.com/tools"
-    tools:context="se.leap.bitmaskclient.MainActivity">
-    <item
-        android:id="@+id/action_example"
-        android:showAsAction="withText|ifRoom"
-        android:title="@string/action_example" />
-    <item
-        android:id="@+id/action_settings"
-        android:orderInCategory="100"
-        android:showAsAction="never"
-        android:title="@string/action_settings" />
-</menu>
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
index 71b6d4372c23490aeb4844d82ce14336078846d4..a308b5e73f58bd16ca247c5f49a9fa54e36a8b4f 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -110,4 +110,7 @@
   <string name="vpn_certificate_user_message">The VPN certificate is invalid. Please log in to download a new one.</string>
   <string name="save_battery">Save battery</string>
   <string name="save_battery_message">Background data connections will hibernate when your phone is inactive. This feature is still experimental.</string>
+  <string name="always_on_vpn">Always-on VPN</string>
+  <string name="do_not_show_again">Do not show again.</string>
+  <string name="always_on_vpn_user_message">To enable always-on VPN in Android VPN Settings click on the configure icon [img src] and turn the switch on."</string>
 </resources>
diff --git a/app/src/production/java/se/leap/bitmaskclient/NewProviderDialog.java b/app/src/production/java/se/leap/bitmaskclient/NewProviderDialog.java
index 025d5263e232cd334a795fcb5417a442735706f0..cce49d9be72b94f50f3fd880a49fadab2663d069 100644
--- a/app/src/production/java/se/leap/bitmaskclient/NewProviderDialog.java
+++ b/app/src/production/java/se/leap/bitmaskclient/NewProviderDialog.java
@@ -65,7 +65,7 @@ public class NewProviderDialog extends DialogFragment {
     public Dialog onCreateDialog(Bundle savedInstanceState) {
         AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
         LayoutInflater inflater = getActivity().getLayoutInflater();
-        View view = inflater.inflate(R.layout.new_provider_dialog, null);
+        View view = inflater.inflate(R.layout.d_new_provider, null);
         ButterKnife.inject(this, view);
         Bundle arguments = getArguments();
         if (arguments != null) {
diff --git a/app/src/production/res/layout-xlarge/new_provider_dialog.xml b/app/src/production/res/layout-xlarge/d_new_provider.xml
similarity index 100%
rename from app/src/production/res/layout-xlarge/new_provider_dialog.xml
rename to app/src/production/res/layout-xlarge/d_new_provider.xml
diff --git a/app/src/production/res/layout/new_provider_dialog.xml b/app/src/production/res/layout/d_new_provider.xml
similarity index 100%
rename from app/src/production/res/layout/new_provider_dialog.xml
rename to app/src/production/res/layout/d_new_provider.xml