diff --git a/src/com/android/settings/MasterClear.java b/src/com/android/settings/MasterClear.java
index 18b51d9..9604a3c 100644
--- a/src/com/android/settings/MasterClear.java
+++ b/src/com/android/settings/MasterClear.java
@@ -77,9 +77,8 @@
      */
     private boolean runKeyguardConfirmation(int request) {
         Resources res = getActivity().getResources();
-        return new ChooseLockSettingsHelper(getActivity(), this)
-                .launchConfirmationActivity(request, null,
-                        res.getText(R.string.master_clear_gesture_explanation));
+        return new ChooseLockSettingsHelper(getActivity(), this).launchConfirmationActivity(request,
+                null, res.getText(R.string.master_clear_gesture_explanation));
     }
 
     @Override
@@ -100,11 +99,10 @@
     }
 
     private void showFinalConfirmation() {
-        Preference preference = new Preference(getActivity());
-        preference.setFragment(MasterClearConfirm.class.getName());
-        preference.setTitle(R.string.master_clear_confirm_title);
-        preference.getExtras().putBoolean(ERASE_EXTERNAL_EXTRA, mExternalStorage.isChecked());
-        ((SettingsActivity) getActivity()).onPreferenceStartFragment(null, preference);
+        Bundle args = new Bundle();
+        args.putBoolean(ERASE_EXTERNAL_EXTRA, mExternalStorage.isChecked());
+        ((SettingsActivity) getActivity()).startPreferencePanel(MasterClearConfirm.class.getName(),
+                args, R.string.master_clear_confirm_title, null, null, 0);
     }
 
     /**
diff --git a/src/com/android/settings/PrivacySettings.java b/src/com/android/settings/PrivacySettings.java
index 8df78c5..2c03352 100644
--- a/src/com/android/settings/PrivacySettings.java
+++ b/src/com/android/settings/PrivacySettings.java
@@ -43,7 +43,10 @@
 import com.android.settings.search.Indexable.SearchIndexProvider;
 
 import java.util.ArrayList;
+import java.util.Collection;
+import java.util.HashSet;
 import java.util.List;
+import java.util.Set;
 
 /**
  * Gesture lock pattern settings.
@@ -53,12 +56,11 @@
 
     // Vendor specific
     private static final String GSETTINGS_PROVIDER = "com.google.settings";
-    private static final String BACKUP_CATEGORY = "backup_category";
     private static final String BACKUP_DATA = "backup_data";
     private static final String AUTO_RESTORE = "auto_restore";
     private static final String CONFIGURE_ACCOUNT = "configure_account";
     private static final String BACKUP_INACTIVE = "backup_inactive";
-    private static final String PERSONAL_DATA_CATEGORY = "personal_data_category";
+    private static final String FACTORY_RESET = "factory_reset";
     private static final String TAG = "PrivacySettings";
     private IBackupManager mBackupManager;
     private SwitchPreference mBackup;
@@ -92,7 +94,8 @@
 
         mConfigure = (PreferenceScreen) screen.findPreference(CONFIGURE_ACCOUNT);
 
-        ArrayList<String> keysToRemove = getNonVisibleKeys(getActivity());
+        Set<String> keysToRemove = new HashSet<>();
+        getNonVisibleKeys(getActivity(), keysToRemove);
         final int screenPreferenceCount = screen.getPreferenceCount();
         for (int i = screenPreferenceCount - 1; i >= 0; --i) {
             Preference preference = screen.getPreference(i);
@@ -100,16 +103,7 @@
                 screen.removePreference(preference);
             }
         }
-        PreferenceCategory backupCategory = (PreferenceCategory) findPreference(BACKUP_CATEGORY);
-        if (backupCategory != null) {
-            final int backupCategoryPreferenceCount = backupCategory.getPreferenceCount();
-            for (int i = backupCategoryPreferenceCount - 1; i >= 0; --i) {
-                Preference preference = backupCategory.getPreference(i);
-                if (keysToRemove.contains(preference.getKey())) {
-                    backupCategory.removePreference(preference);
-                }
-            }
-        }
+
         updateToggles();
     }
 
@@ -300,12 +294,13 @@
 
         @Override
         public List<String> getNonIndexableKeys(Context context) {
-            return getNonVisibleKeys(context);
+            final List<String> nonVisibleKeys = new ArrayList<>();
+            getNonVisibleKeys(context, nonVisibleKeys);
+            return nonVisibleKeys;
         }
     }
 
-    private static ArrayList<String> getNonVisibleKeys(Context context) {
-        final ArrayList<String> nonVisibleKeys = new ArrayList<String>();
+    private static void getNonVisibleKeys(Context context, Collection<String> nonVisibleKeys) {
         final IBackupManager backupManager = IBackupManager.Stub.asInterface(
                 ServiceManager.getService(Context.BACKUP_SERVICE));
         boolean isServiceActive = false;
@@ -315,22 +310,19 @@
             Log.w(TAG, "Failed querying backup manager service activity status. " +
                     "Assuming it is inactive.");
         }
-        if (isServiceActive) {
+        boolean vendorSpecific = context.getPackageManager().
+                resolveContentProvider(GSETTINGS_PROVIDER, 0) == null;
+        if (vendorSpecific || isServiceActive) {
             nonVisibleKeys.add(BACKUP_INACTIVE);
-        } else {
+        }
+        if (vendorSpecific || !isServiceActive) {
+            nonVisibleKeys.add(BACKUP_DATA);
             nonVisibleKeys.add(AUTO_RESTORE);
             nonVisibleKeys.add(CONFIGURE_ACCOUNT);
-            nonVisibleKeys.add(BACKUP_DATA);
         }
         if (UserManager.get(context).hasUserRestriction(
                 UserManager.DISALLOW_FACTORY_RESET)) {
-            nonVisibleKeys.add(PERSONAL_DATA_CATEGORY);
+            nonVisibleKeys.add(FACTORY_RESET);
         }
-        // Vendor specific
-        if (context.getPackageManager().
-                resolveContentProvider(GSETTINGS_PROVIDER, 0) == null) {
-            nonVisibleKeys.add(BACKUP_CATEGORY);
-        }
-        return nonVisibleKeys;
     }
 }
diff --git a/src/com/android/settings/ResetNetwork.java b/src/com/android/settings/ResetNetwork.java
new file mode 100644
index 0000000..7767604
--- /dev/null
+++ b/src/com/android/settings/ResetNetwork.java
@@ -0,0 +1,198 @@
+/*
+ * Copyright (C) 2015 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 License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.settings;
+
+import android.app.Activity;
+import android.app.Fragment;
+import android.content.Context;
+import android.content.Intent;
+import android.content.pm.PackageManager;
+import android.content.res.Resources;
+import android.graphics.drawable.Drawable;
+import android.os.Bundle;
+import android.os.Environment;
+import android.os.SystemProperties;
+import android.os.UserManager;
+import android.preference.Preference;
+import android.preference.PreferenceActivity;
+import android.telephony.SubscriptionInfo;
+import android.telephony.SubscriptionManager;
+import android.text.TextUtils;
+import android.util.Log;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.ArrayAdapter;
+import android.widget.Button;
+import android.widget.CheckBox;
+import android.widget.LinearLayout;
+import android.widget.Spinner;
+import android.widget.TextView;
+
+import com.android.internal.telephony.PhoneConstants;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * Confirm and execute a reset of the device's network settings to a clean "just out of the box"
+ * state.  Multiple confirmations are required: first, a general "are you sure you want to do this?"
+ * prompt, followed by a keyguard pattern trace if the user has defined one, followed by a final
+ * strongly-worded "THIS WILL RESET EVERYTHING" prompt.  If at any time the phone is allowed to go
+ * to sleep, is locked, et cetera, then the confirmation sequence is abandoned.
+ *
+ * This is the initial screen.
+ */
+public class ResetNetwork extends Fragment {
+    private static final String TAG = "ResetNetwork";
+
+    // Arbitrary to avoid conficts
+    private static final int KEYGUARD_REQUEST = 55;
+
+    private List<SubscriptionInfo> mSubscriptions;
+
+    private View mContentView;
+    private Spinner mSubscriptionSpinner;
+    private Button mInitiateButton;
+
+    /**
+     * Keyguard validation is run using the standard {@link ConfirmLockPattern}
+     * component as a subactivity
+     * @param request the request code to be returned once confirmation finishes
+     * @return true if confirmation launched
+     */
+    private boolean runKeyguardConfirmation(int request) {
+        Resources res = getActivity().getResources();
+        return new ChooseLockSettingsHelper(getActivity(), this).launchConfirmationActivity(request,
+                null, res.getText(R.string.reset_network_gesture_explanation));
+    }
+
+    @Override
+    public void onActivityResult(int requestCode, int resultCode, Intent data) {
+        super.onActivityResult(requestCode, resultCode, data);
+
+        if (requestCode != KEYGUARD_REQUEST) {
+            return;
+        }
+
+        // If the user entered a valid keyguard trace, present the final
+        // confirmation prompt; otherwise, go back to the initial state.
+        if (resultCode == Activity.RESULT_OK) {
+            showFinalConfirmation();
+        } else {
+            establishInitialState();
+        }
+    }
+
+    private void showFinalConfirmation() {
+        Bundle args = new Bundle();
+        if (mSubscriptions.size() > 0) {
+            int selectedIndex = mSubscriptionSpinner.getSelectedItemPosition();
+            SubscriptionInfo subscription = mSubscriptions.get(selectedIndex);
+            args.putInt(PhoneConstants.SUBSCRIPTION_KEY, subscription.getSubscriptionId());
+        }
+        ((SettingsActivity) getActivity()).startPreferencePanel(ResetNetworkConfirm.class.getName(),
+                args, R.string.reset_network_confirm_title, null, null, 0);
+    }
+
+    /**
+     * If the user clicks to begin the reset sequence, we next require a
+     * keyguard confirmation if the user has currently enabled one.  If there
+     * is no keyguard available, we simply go to the final confirmation prompt.
+     */
+    private final Button.OnClickListener mInitiateListener = new Button.OnClickListener() {
+
+        @Override
+        public void onClick(View v) {
+            if (!runKeyguardConfirmation(KEYGUARD_REQUEST)) {
+                showFinalConfirmation();
+            }
+        }
+    };
+
+    /**
+     * In its initial state, the activity presents a button for the user to
+     * click in order to initiate a confirmation sequence.  This method is
+     * called from various other points in the code to reset the activity to
+     * this base state.
+     *
+     * <p>Reinflating views from resources is expensive and prevents us from
+     * caching widget pointers, so we use a single-inflate pattern:  we lazy-
+     * inflate each view, caching all of the widget pointers we'll need at the
+     * time, then simply reuse the inflated views directly whenever we need
+     * to change contents.
+     */
+    private void establishInitialState() {
+        mSubscriptionSpinner = (Spinner) mContentView.findViewById(R.id.reset_network_subscription);
+
+        mSubscriptions = SubscriptionManager.from(getActivity()).getActiveSubscriptionInfoList();
+        if (mSubscriptions.size() > 0) {
+            // Get the default subscription in the order of data, voice, sms, first up.
+            int defaultSubscription = SubscriptionManager.getDefaultDataSubId();
+            if (!SubscriptionManager.isUsableSubIdValue(defaultSubscription)) {
+                defaultSubscription = SubscriptionManager.getDefaultVoiceSubId();
+            }
+            if (!SubscriptionManager.isUsableSubIdValue(defaultSubscription)) {
+                defaultSubscription = SubscriptionManager.getDefaultSmsSubId();
+            }
+            if (!SubscriptionManager.isUsableSubIdValue(defaultSubscription)) {
+                defaultSubscription = SubscriptionManager.getDefaultSubId();
+            }
+
+            int selectedIndex = 0;
+            int size = mSubscriptions.size();
+            List<String> subscriptionNames = new ArrayList<>();
+            for (SubscriptionInfo record : mSubscriptions) {
+                if (record.getSubscriptionId() == defaultSubscription) {
+                    // Set the first selected value to the default
+                    selectedIndex = subscriptionNames.size();
+                }
+                String name = record.getDisplayName().toString();
+                if (TextUtils.isEmpty(name)) {
+                    name = record.getNumber();
+                }
+                if (TextUtils.isEmpty(name)) {
+                    name = record.getCarrierName().toString();
+                }
+                if (TextUtils.isEmpty(name)) {
+                    name = String.format("MCC:%s MNC:%s Slot:%s Id:%s", record.getMcc(),
+                            record.getMnc(), record.getSimSlotIndex(), record.getSubscriptionId());
+                }
+                subscriptionNames.add(name);
+            }
+            ArrayAdapter<String> adapter = new ArrayAdapter<String>(getActivity(),
+                    android.R.layout.simple_spinner_item, subscriptionNames);
+            adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
+            mSubscriptionSpinner.setAdapter(adapter);
+            mSubscriptionSpinner.setSelection(selectedIndex);
+            mSubscriptionSpinner.setVisibility(View.VISIBLE);
+        } else {
+            mSubscriptionSpinner.setVisibility(View.INVISIBLE);
+        }
+        mInitiateButton = (Button) mContentView.findViewById(R.id.initiate_reset_network);
+        mInitiateButton.setOnClickListener(mInitiateListener);
+    }
+
+    @Override
+    public View onCreateView(LayoutInflater inflater, ViewGroup container,
+            Bundle savedInstanceState) {
+        mContentView = inflater.inflate(R.layout.reset_network, null);
+
+        establishInitialState();
+        return mContentView;
+    }
+}
diff --git a/src/com/android/settings/ResetNetworkConfirm.java b/src/com/android/settings/ResetNetworkConfirm.java
new file mode 100644
index 0000000..28fd92d
--- /dev/null
+++ b/src/com/android/settings/ResetNetworkConfirm.java
@@ -0,0 +1,200 @@
+/*
+ * Copyright (C) 2015 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 License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.settings;
+
+import android.app.Fragment;
+import android.content.Context;
+import android.net.IConnectivityManager;
+import android.net.NetworkPolicy;
+import android.net.NetworkPolicyManager;
+import android.net.NetworkTemplate;
+import android.net.wifi.WifiConfiguration;
+import android.net.wifi.WifiManager;
+import android.os.Bundle;
+import android.os.RemoteException;
+import android.os.ServiceManager;
+import android.telephony.SubscriptionInfo;
+import android.telephony.SubscriptionManager;
+import android.telephony.TelephonyManager;
+import android.text.TextUtils;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.ArrayAdapter;
+import android.widget.Button;
+import android.widget.Spinner;
+import android.widget.Toast;
+
+import com.android.internal.net.VpnConfig;
+import com.android.internal.telephony.Phone;
+import com.android.internal.telephony.PhoneConstants;
+import com.android.internal.telephony.PhoneFactory;
+import com.android.settings.net.NetworkPolicyEditor;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * Confirm and execute a reset of the network settings to a clean "just out of the box"
+ * state.  Multiple confirmations are required: first, a general "are you sure
+ * you want to do this?" prompt, followed by a keyguard pattern trace if the user
+ * has defined one, followed by a final strongly-worded "THIS WILL RESET EVERYTHING"
+ * prompt.  If at any time the phone is allowed to go to sleep, is
+ * locked, et cetera, then the confirmation sequence is abandoned.
+ *
+ * This is the confirmation screen.
+ */
+public class ResetNetworkConfirm extends Fragment {
+
+    private View mContentView;
+    private int mSubId = SubscriptionManager.INVALID_SUBSCRIPTION_ID;
+
+    /**
+     * The user has gone through the multiple confirmation, so now we go ahead
+     * and reset the network settings to its factory-default state.
+     */
+    private Button.OnClickListener mFinalClickListener = new Button.OnClickListener() {
+
+        @Override
+        public void onClick(View v) {
+            if (Utils.isMonkeyRunning()) {
+                return;
+            }
+            // TODO maybe show a progress dialog if this ends up taking a while
+
+            IConnectivityManager connectivityService = IConnectivityManager.Stub.asInterface(
+                    ServiceManager.getService(Context.CONNECTIVITY_SERVICE));
+            WifiManager wifiManager = (WifiManager)
+                    getActivity().getSystemService(Context.WIFI_SERVICE);
+            TelephonyManager telephonyManager = (TelephonyManager)
+                    getActivity().getSystemService(Context.TELEPHONY_SERVICE);
+            NetworkPolicyManager policyManager = NetworkPolicyManager.from(getActivity());
+            NetworkPolicyEditor policyEditor = new NetworkPolicyEditor(policyManager);
+            policyEditor.read();
+
+            // Turn airplane mode off
+            try {
+                connectivityService.setAirplaneMode(false);
+            } catch (RemoteException e) {
+                // Well, we tried
+            }
+
+            // Turn wifi on
+            wifiManager.setWifiEnabled(true);
+
+            // Delete all Wifi SSIDs
+            List<WifiConfiguration> networks = wifiManager.getConfiguredNetworks();
+            if (networks != null) {
+                for (WifiConfiguration config : networks) {
+                    wifiManager.removeNetwork(config.networkId);
+                }
+            }
+
+            // Turn mobile hotspot off
+            wifiManager.setWifiApEnabled(null, false);
+
+            // Un-tether
+            try {
+                for (String tether : connectivityService.getTetheredIfaces()) {
+                    connectivityService.untether(tether);
+                }
+            } catch (RemoteException e) {
+                // Well, we tried
+            }
+
+            // Turn VPN off
+            try {
+                VpnConfig vpnConfig = connectivityService.getVpnConfig();
+                if (vpnConfig != null) {
+                    if (vpnConfig.legacy) {
+                        connectivityService.prepareVpn(VpnConfig.LEGACY_VPN, VpnConfig.LEGACY_VPN);
+                    } else {
+                        // Prevent this app from initiating VPN connections in the future without
+                        // user intervention.
+                        connectivityService.setVpnPackageAuthorization(false);
+                        connectivityService.prepareVpn(vpnConfig.user, VpnConfig.LEGACY_VPN);
+                    }
+                }
+            } catch (RemoteException e) {
+                // Well, we tried
+            }
+
+            if (SubscriptionManager.isUsableSubIdValue(mSubId)) {
+                int phoneId = SubscriptionManager.getPhoneId(mSubId);
+                Phone phone = PhoneFactory.getPhone(phoneId);
+
+                // Turn mobile data on
+                phone.setDataEnabled(true);
+
+                // Set mobile network selection mode to automatic
+                phone.setNetworkSelectionModeAutomatic(null);
+
+                // Set preferred mobile network type to manufacturer's recommended
+                // int networkType = ; // TODO get manufacturer's default
+                // phone.setPreferredNetworkType(networkType, null);
+
+                // Turn roaming to manufacturer's default
+                // boolean enabled = ; // TODO get manufacturer's default
+                // phone.setDataRoamingEnabled(enabled);
+
+                String subscriberId = telephonyManager.getSubscriberId(mSubId);
+                NetworkTemplate template = NetworkTemplate.buildTemplateMobileAll(subscriberId);
+                // Turn mobile data limit off
+                policyEditor.setPolicyLimitBytes(template, NetworkPolicy.LIMIT_DISABLED);
+            }
+
+            // Turn restrict background data off
+            policyManager.setRestrictBackground(false);
+
+            // Remove app's "restrict background data" flag
+            for (int uid : policyManager.getUidsWithPolicy(
+                    NetworkPolicyManager.POLICY_REJECT_METERED_BACKGROUND)) {
+                policyManager.setUidPolicy(uid, NetworkPolicyManager.POLICY_NONE);
+            }
+
+            Toast.makeText(getActivity(), R.string.reset_network_complete_toast, Toast.LENGTH_SHORT)
+                    .show();
+        }
+    };
+
+    /**
+     * Configure the UI for the final confirmation interaction
+     */
+    private void establishFinalConfirmationState() {
+        mContentView.findViewById(R.id.execute_reset_network)
+                .setOnClickListener(mFinalClickListener);
+    }
+
+    @Override
+    public View onCreateView(LayoutInflater inflater, ViewGroup container,
+            Bundle savedInstanceState) {
+        mContentView = inflater.inflate(R.layout.reset_network_confirm, null);
+        establishFinalConfirmationState();
+        return mContentView;
+    }
+
+    @Override
+    public void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+
+        Bundle args = getArguments();
+        if (args != null) {
+            mSubId = args.getInt(PhoneConstants.SUBSCRIPTION_KEY,
+                    SubscriptionManager.INVALID_SUBSCRIPTION_ID);
+        }
+    }
+}
