diff --git a/res/menu/browser.xml b/res/menu/browser.xml
index 67915fe..af57357 100644
--- a/res/menu/browser.xml
+++ b/res/menu/browser.xml
@@ -102,15 +102,10 @@
             android:id="@+id/preferences_menu_id"
             android:title="@string/menu_preferences"
             android:alphabeticShortcut="p" />
-
-        <group
-            android:id="@+id/QRD_MENU"
-            android:visible="false">
-            <item
-                android:id="@+id/exit_menu_id"
-                android:title="@string/exit" />
-        </group>
-
+        <item
+            android:id="@+id/exit_menu_id"
+            android:visible="@bool/feature_exit_dialog"
+            android:title="@string/exit" />
         <item
             android:id="@+id/about_menu_id"
             android:title="@string/about" />
diff --git a/res/values/bools.xml b/res/values/bools.xml
index 1764ea0..fe9086e 100644
--- a/res/values/bools.xml
+++ b/res/values/bools.xml
@@ -1,5 +1,6 @@
 <?xml version="1.0" encoding="utf-8"?>
 <!--
+    Copyright (c) 2014, The Linux Foundation. All rights reserved.
     Copyright (C) 2011 The Android Open Source Project Licensed under the
     Apache License, Version 2.0 (the "License"); you may not use this file
     except in compliance with the License. You may obtain a copy of the
@@ -23,10 +24,28 @@
     <!-- Browser menu toggles -->
     <bool name="menu_show_navigation">true</bool>
     <bool name="menu_show_bookmarks">true</bool>
-    <!-- Carrier Specific Values -->
-    <bool name="wap2estore">false</bool>
-    <bool name="drm_uploads">false</bool>
-    <bool name="network_notifier">false</bool>
-    <bool name="def_disable_history">false</bool>
-    <bool name="def_enable_media_downloads">false</bool>
+
+
+    <!-- Switches for carrier specific features -->
+
+    <!-- Launch custom app when URL scheme is 'estore:' -->
+    <bool name="feature_wap2estore">false</bool>
+    <!-- Prevent uploading files with DRM filename extensions -->
+    <bool name="feature_drm_uploads">false</bool>
+    <!-- Prompt user to select WiFi access point or otherwise enable WLAN -->
+    <bool name="feature_network_notifier">false</bool>
+    <!-- Add 'Exit' menu item and show 'Minimize or quit' dialog -->
+    <bool name="feature_exit_dialog">false</bool>
+    <!-- Display page title instead of url in URL bar -->
+    <bool name="feature_title_in_URL_bar">false</bool>
+    <!-- Allow users to provide custom download path -->
+    <bool name="feature_custom_download_path">false</bool>
+    <!-- Add 'Allow media downloads' menu item -->
+    <bool name="feature_allow_media_downloads">false</bool>
+    <!-- Allow disabling saving history for non-incognito tabs -->
+    <bool name="feature_disable_history">false</bool>
+
+    <!-- Default values for carrier specific features -->
+    <bool name="def_allow_media_downloads">false</bool>
+
 </resources>
diff --git a/res/xml/general_preferences.xml b/res/xml/general_preferences.xml
index 7c21b3a..361afde 100644
--- a/res/xml/general_preferences.xml
+++ b/res/xml/general_preferences.xml
@@ -142,7 +142,8 @@
             android:title="@string/pref_accessibility_title" />
 
 
-        <PreferenceScreen android:title="@string/pref_content_title">
+        <PreferenceScreen android:title="@string/pref_content_title"
+            android:key="content_settings">
             <CheckBoxPreference
                 android:defaultValue="true"
                 android:key="block_popup_windows"
diff --git a/src/com/android/browser/BrowserConfigBase.java b/src/com/android/browser/BrowserConfigBase.java
index 9dd0bc0..a96e6ad 100644
--- a/src/com/android/browser/BrowserConfigBase.java
+++ b/src/com/android/browser/BrowserConfigBase.java
@@ -90,5 +90,39 @@
             return null;
         }
     }
+
+    public static enum Feature {
+        WAP2ESTORE, /* Launch custom app when URL scheme is 'estore:' */
+        DRM_UPLOADS, /* Prevent uploading files with DRM filename extensions */
+        NETWORK_NOTIFIER, /* Prompt user to select WiFi access point or otherwise enable WLAN */
+        EXIT_DIALOG, /* Add 'Exit' menu item and show 'Minimize or quit' dialog */
+        TITLE_IN_URL_BAR, /* Display page title instead of url in URL bar */
+        CUSTOM_DOWNLOAD_PATH, /* Allow users to provide custom download path */
+        ALLOW_MEDIA_DOWNLOADS, /* Add 'Allow media downloads' menu item */
+        DISABLE_HISTORY /* Allow disabling saving history for non-incognito tabs */
+    }
+
+    public boolean hasFeature(Feature feature) {
+        switch (feature) {
+            case WAP2ESTORE:
+                return mContext.getResources().getBoolean(R.bool.feature_wap2estore);
+            case DRM_UPLOADS:
+                return mContext.getResources().getBoolean(R.bool.feature_drm_uploads);
+            case NETWORK_NOTIFIER:
+                return mContext.getResources().getBoolean(R.bool.feature_network_notifier);
+            case EXIT_DIALOG:
+                return mContext.getResources().getBoolean(R.bool.feature_exit_dialog);
+            case TITLE_IN_URL_BAR:
+                return mContext.getResources().getBoolean(R.bool.feature_title_in_URL_bar);
+            case CUSTOM_DOWNLOAD_PATH:
+                return mContext.getResources().getBoolean(R.bool.feature_custom_download_path);
+            case ALLOW_MEDIA_DOWNLOADS:
+                return mContext.getResources().getBoolean(R.bool.feature_allow_media_downloads);
+            case DISABLE_HISTORY:
+                return mContext.getResources().getBoolean(R.bool.feature_disable_history);
+            default:
+                return false;
+        }
+    }
 }
 
diff --git a/src/com/android/browser/BrowserSettings.java b/src/com/android/browser/BrowserSettings.java
index 7e07721..4d7bc55 100644
--- a/src/com/android/browser/BrowserSettings.java
+++ b/src/com/android/browser/BrowserSettings.java
@@ -734,18 +734,23 @@
     }
 
     public boolean allowMediaDownloads() {
-        boolean enableMediaDownloads = mController.getContext().getResources().getBoolean(
-                                       R.bool.def_enable_media_downloads);
-        boolean shouldAllowMediaDownloads = mPrefs.getBoolean(
-                                        PREF_ALLOW_MEDIA_DOWNLOADS, enableMediaDownloads);
+        // Return false if preference is not exposed to user
+        if (!BrowserConfig.getInstance(mContext)
+                .hasFeature(BrowserConfig.Feature.ALLOW_MEDIA_DOWNLOADS))
+            return false;
 
-        if(!mPrefs.contains(PREF_ALLOW_MEDIA_DOWNLOADS)){
+        // Otherwise, look at default value
+        boolean defaultAllowMediaDownloadsValue = mController.getContext()
+                .getResources().getBoolean(R.bool.def_allow_media_downloads);
+
+        // If preference is not saved, save default value
+        if (!mPrefs.contains(PREF_ALLOW_MEDIA_DOWNLOADS)){
             Editor edit = mPrefs.edit();
-            edit.putBoolean(PREF_ALLOW_MEDIA_DOWNLOADS, shouldAllowMediaDownloads);
+            edit.putBoolean(PREF_ALLOW_MEDIA_DOWNLOADS, defaultAllowMediaDownloadsValue);
             edit.apply();
         }
 
-        return shouldAllowMediaDownloads;
+        return mPrefs.getBoolean(PREF_ALLOW_MEDIA_DOWNLOADS, defaultAllowMediaDownloadsValue);
     }
 
     // TODO: Cache
diff --git a/src/com/android/browser/Controller.java b/src/com/android/browser/Controller.java
index c149a0b..181b148 100644
--- a/src/com/android/browser/Controller.java
+++ b/src/com/android/browser/Controller.java
@@ -919,8 +919,8 @@
         CookieSyncManager.getInstance().resetSync();
         WifiManager wifiMgr = (WifiManager) this.getContext()
                 .getSystemService(Context.WIFI_SERVICE);
-        boolean networkNotifier =
-            mActivity.getApplicationContext().getResources().getBoolean(R.bool.network_notifier);
+        boolean networkNotifier = BrowserConfig.getInstance(getContext())
+                .hasFeature(BrowserConfig.Feature.NETWORK_NOTIFIER);
         if (networkNotifier && mNetworkShouldNotify && wifiMgr.isWifiEnabled()){
             handleNetworkNotify(view);
         } else {
@@ -1111,12 +1111,12 @@
 
     @Override
     public void doUpdateVisitedHistory(Tab tab, boolean isReload) {
-        boolean disableHistoryWrites =
-                mActivity.getResources().getBoolean(R.bool.def_disable_history);
+        // Don't save anything in private browsing mode or when disabling history
+        // for regular tabs is enabled
+        if (tab.isPrivateBrowsingEnabled() || BrowserConfig.getInstance(getContext())
+                        .hasFeature(BrowserConfig.Feature.DISABLE_HISTORY))
+            return;
 
-        // Don't save anything in private browsing mode or when explicitly set
-        // not to write history via an overlay
-        if (tab.isPrivateBrowsingEnabled() || disableHistoryWrites) return;
         String url = tab.getOriginalUrl();
 
         if (TextUtils.isEmpty(url)
@@ -2018,7 +2018,9 @@
                              "android.os.SystemProperties","get", type, params);
                 if (ret != null && ret.equals("enable"))
                     break;
-                showExitDialog(mActivity);
+                if (BrowserConfig.getInstance(getContext())
+                        .hasFeature(BrowserConfig.Feature.EXIT_DIALOG))
+                    showExitDialog(mActivity);
                 return true;
             case R.id.homepage_menu_id:
                 Tab current = mTabControl.getCurrentTab();
@@ -3138,14 +3140,18 @@
     void goBackOnePageOrQuit() {
         Tab current = mTabControl.getCurrentTab();
         if (current == null) {
-            /*
-             * Instead of finishing the activity, simply push this to the back
-             * of the stack and let ActivityManager to choose the foreground
-             * activity. As BrowserActivity is singleTask, it will be always the
-             * root of the task. So we can use either true or false for
-             * moveTaskToBack().
-             */
-            showExitDialog(mActivity);
+            if (BrowserConfig.getInstance(getContext()).hasFeature(BrowserConfig.Feature.EXIT_DIALOG)) {
+                showExitDialog(mActivity);
+            } else {
+                /*
+                 * Instead of finishing the activity, simply push this to the back
+                 * of the stack and let ActivityManager to choose the foreground
+                 * activity. As BrowserActivity is singleTask, it will be always the
+                 * root of the task. So we can use either true or false for
+                 * moveTaskToBack().
+                 */
+                mActivity.moveTaskToBack(true);
+            }
             return;
         }
         if (current.canGoBack()) {
@@ -3158,7 +3164,13 @@
                 switchToTab(parent);
                 // Now we close the other tab
                 closeTab(current);
+            } else if (BrowserConfig.getInstance(getContext())
+                    .hasFeature(BrowserConfig.Feature.EXIT_DIALOG)) {
+                showExitDialog(mActivity);
             } else {
+                if ((current.getAppId() != null) || current.closeOnBack()) {
+                    closeCurrentTab(true);
+                }
                 /*
                  * Instead of finishing the activity, simply push this to the back
                  * of the stack and let ActivityManager to choose the foreground
@@ -3166,7 +3178,7 @@
                  * root of the task. So we can use either true or false for
                  * moveTaskToBack().
                  */
-                showExitDialog(mActivity);
+                mActivity.moveTaskToBack(true);
             }
         }
     }
diff --git a/src/com/android/browser/NavigationBarBase.java b/src/com/android/browser/NavigationBarBase.java
index 01435b6..819608d 100644
--- a/src/com/android/browser/NavigationBarBase.java
+++ b/src/com/android/browser/NavigationBarBase.java
@@ -210,7 +210,8 @@
         stopEditingUrl();
         if (UrlInputView.TYPED.equals(source)) {
             String url = null;
-            boolean wap2estore = getContext().getResources().getBoolean(R.bool.wap2estore);
+            boolean wap2estore = BrowserConfig.getInstance(getContext())
+                    .hasFeature(BrowserConfig.Feature.WAP2ESTORE);
             if ((wap2estore && isEstoreTypeUrl(text)) || isRtspTypeUrl(text)
                 || isMakeCallTypeUrl(text)) {
                 url = text;
diff --git a/src/com/android/browser/NavigationBarPhone.java b/src/com/android/browser/NavigationBarPhone.java
index e73f218..b07f035 100644
--- a/src/com/android/browser/NavigationBarPhone.java
+++ b/src/com/android/browser/NavigationBarPhone.java
@@ -145,7 +145,9 @@
         if (!isEditingUrl()) {
            // add for carrier requirement - show title from native instead of url
             Tab currentTab = mUiController.getTabControl().getCurrentTab();
-            if (currentTab != null && currentTab.getTitle() != null) {
+            if (BrowserConfig.getInstance(getContext())
+                    .hasFeature(BrowserConfig.Feature.TITLE_IN_URL_BAR) &&
+                    currentTab != null && currentTab.getTitle() != null) {
                 mUrlInput.setText(currentTab.getTitle(), false);
             } else if (title == null) {
                 mUrlInput.setText(R.string.new_tab);
diff --git a/src/com/android/browser/UploadHandler.java b/src/com/android/browser/UploadHandler.java
index e0d1527..2041ecf 100644
--- a/src/com/android/browser/UploadHandler.java
+++ b/src/com/android/browser/UploadHandler.java
@@ -124,9 +124,11 @@
             filePath = "file://"+filePath;
         }
 
-        // Add for carrier feature - prevent uploading DRM type files.
-        boolean drmUploadEnabled = mController.getContext().getResources().getBoolean(
-                                       R.bool.drm_uploads);
+        // Add for carrier feature - prevent uploading DRM type files based on file extension. This
+        // is not a secure implementation since malicious users can trivially modify the filename.
+        // DRM files can be securely detected by inspecting their integrity protected content.
+        boolean drmUploadEnabled = BrowserConfig.getInstance(mController.getContext())
+                .hasFeature(BrowserConfig.Feature.DRM_UPLOADS);
         boolean isDRMFileType = false;
         if (drmUploadEnabled && filePath != null
                 && (filePath.endsWith(".fl") || filePath.endsWith(".dm")
diff --git a/src/com/android/browser/UrlHandler.java b/src/com/android/browser/UrlHandler.java
index c841d46..8ecffe4 100755
--- a/src/com/android/browser/UrlHandler.java
+++ b/src/com/android/browser/UrlHandler.java
@@ -108,8 +108,8 @@
         }
 
         // add for carrier feature - wap2estore
-        boolean wap2estore =
-                mActivity.getApplicationContext().getResources().getBoolean(R.bool.wap2estore);
+        boolean wap2estore = BrowserConfig.getInstance(mController.getContext())
+                .hasFeature(BrowserConfig.Feature.WAP2ESTORE);
         if (wap2estore && isEstoreTypeUrl(url) && handleEstoreTypeUrl(url)) {
             return true;
         }
diff --git a/src/com/android/browser/preferences/AdvancedPreferencesFragment.java b/src/com/android/browser/preferences/AdvancedPreferencesFragment.java
index 9ffa09b..e6f2f1c 100644
--- a/src/com/android/browser/preferences/AdvancedPreferencesFragment.java
+++ b/src/com/android/browser/preferences/AdvancedPreferencesFragment.java
@@ -34,6 +34,7 @@
 import android.widget.Toast;
 
 import com.android.browser.BrowserActivity;
+import com.android.browser.BrowserConfig;
 import com.android.browser.BrowserSettings;
 import com.android.browser.DownloadHandler;
 import com.android.browser.PreferenceKeys;
@@ -77,21 +78,30 @@
         e = mFragment.findPreference("accessibility_menu");
         e.setOnPreferenceClickListener(this);
 
+        // Below are preferences for carrier specific features
+        PreferenceScreen contentSettingsPrefScreen =
+                (PreferenceScreen) mFragment.findPreference("content_settings");
+        if (!BrowserConfig.getInstance(mFragment.getActivity().getApplicationContext())
+                .hasFeature(BrowserConfig.Feature.ALLOW_MEDIA_DOWNLOADS))
+            contentSettingsPrefScreen.removePreference(contentSettingsPrefScreen
+                    .findPreference(PreferenceKeys.PREF_ALLOW_MEDIA_DOWNLOADS));
 
-        onInitdownloadSettingsPreference();
-    }
+        if (!BrowserConfig.getInstance(mFragment.getActivity().getApplicationContext())
+                .hasFeature(BrowserConfig.Feature.CUSTOM_DOWNLOAD_PATH)) {
+            contentSettingsPrefScreen.removePreference(contentSettingsPrefScreen
+                    .findPreference(PreferenceKeys.PREF_DOWNLOAD_PATH));
+        } else {
+            PreferenceScreen downloadPathPreset =
+                    (PreferenceScreen) mFragment.findPreference(PreferenceKeys.PREF_DOWNLOAD_PATH);
+            downloadPathPreset.setOnPreferenceClickListener(onClickDownloadPathSettings());
 
-    private void onInitdownloadSettingsPreference() {
-        PreferenceScreen downloadPathPreset =
-                (PreferenceScreen) mFragment.findPreference(PreferenceKeys.PREF_DOWNLOAD_PATH);
-        downloadPathPreset.setOnPreferenceClickListener(onClickDownloadPathSettings());
-
-        String downloadPath = downloadPathPreset.getSharedPreferences().
-                getString(PreferenceKeys.PREF_DOWNLOAD_PATH,
-                        BrowserSettings.getInstance().getDownloadPath());
-        String downloadPathForUser = DownloadHandler.getDownloadPathForUser(mFragment.getActivity(),
-                downloadPath);
-        downloadPathPreset.setSummary(downloadPathForUser);
+            String downloadPath = downloadPathPreset.getSharedPreferences().
+                    getString(PreferenceKeys.PREF_DOWNLOAD_PATH,
+                            BrowserSettings.getInstance().getDownloadPath());
+            String downloadPathForUser = DownloadHandler.getDownloadPathForUser(mFragment.getActivity(),
+                    downloadPath);
+            downloadPathPreset.setSummary(downloadPathForUser);
+        }
     }
 
     private Preference.OnPreferenceClickListener onClickDownloadPathSettings() {
