diff --git a/res/menu/manage_apps.xml b/res/menu/manage_apps.xml
index 577e981..225f974 100644
--- a/res/menu/manage_apps.xml
+++ b/res/menu/manage_apps.xml
@@ -18,6 +18,25 @@
     <item
         android:id="@+id/advanced"
         android:title="@string/advanced_apps"
-        android:icon="@drawable/ic_settings_24dp"
-        android:showAsAction="collapseActionView|ifRoom" />
+        android:showAsAction="never" />
+    <item
+        android:id="@+id/show_system"
+        android:title="@string/menu_show_system"
+        android:showAsAction="never" />
+    <item
+        android:id="@+id/hide_system"
+        android:title="@string/menu_hide_system"
+        android:showAsAction="never" />
+    <item
+        android:id="@+id/sort_order_alpha"
+        android:title="@string/sort_order_alpha"
+        android:showAsAction="never" />
+    <item
+        android:id="@+id/sort_order_size"
+        android:title="@string/sort_order_size"
+        android:showAsAction="never" />
+    <item
+        android:id="@+id/reset_app_preferences"
+        android:title="@string/reset_app_preferences"
+        android:showAsAction="never" />
 </menu>
diff --git a/res/values/strings.xml b/res/values/strings.xml
index a0b0653..f416d89 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -4234,8 +4234,10 @@
     <string name="menu_duration_12h">12 hours</string>
     <!-- [CHAR LIMIT=NONE] Menu for process stats to show 3 hours of data -->
     <string name="menu_duration_1d">1 day</string>
-    <!-- [CHAR LIMIT=NONE] Menu for process stats to control whether system processes are shown -->
+    <!-- [CHAR LIMIT=NONE] Menu for manage apps to control whether system processes are shown -->
     <string name="menu_show_system">Show system</string>
+    <!-- [CHAR LIMIT=NONE] Menu for manage apps to control whether system processes are hidden -->
+    <string name="menu_hide_system">Hide system</string>
     <!-- [CHAR LIMIT=NONE] Menu for process stats to control whether computation should be based
         on Uss (Unique Set Size) instead of Pss (Proportional Set Size) -->
     <string name="menu_use_uss">Use Uss</string>
@@ -6359,15 +6361,9 @@
     <!-- Label for showing apps with domain URLs (data URI with http or https) in list [CHAR LIMIT=30] -->
     <string name="filter_with_domain_urls_apps">With domain URLs</string>
 
-    <!-- Description for advanced menu option to reset app preferences [CHAR LIMIT=NONE] -->
-    <string name="reset_app_preferences_description">Reset preferences across all apps to defaults</string>
-
     <!-- Summary for a trust agent that was disabled by the device policy [LIMIT=NONE] -->
     <string name="trust_agent_disabled_device_admin">Disabled by administrator</string>
 
-    <!-- Description of settings item that leads to list of all apps [CHAR LIMIT=NONE] -->
-    <string name="all_apps_summary"><xliff:g id="count" example="10">%d</xliff:g> apps installed, including system and downloaded apps</string>
-
     <!-- Title for advanced application management settings [CHAR LIMIT=30] -->
     <string name="advanced_apps">Advanced</string>
 
diff --git a/res/xml/advanced_apps.xml b/res/xml/advanced_apps.xml
index 0307a60..28324ca 100644
--- a/res/xml/advanced_apps.xml
+++ b/res/xml/advanced_apps.xml
@@ -40,22 +40,6 @@
                 android:value="com.android.settings.Settings$DomainsURLsAppListActivity" />
     </PreferenceScreen>
 
-    <PreferenceScreen
-        android:key="all_apps"
-        android:fragment="com.android.settings.applications.ManageApplications"
-        android:title="@string/filter_all_apps"
-        settings:keywords="@string/keywords_all_apps">
-        <extra
-            android:name="classname"
-            android:value="com.android.settings.Settings$AllApplicationsActivity" />
-    </PreferenceScreen>
-
-    <Preference
-        android:key="reset_all"
-        android:title="@string/reset_app_preferences"
-        android:summary="@string/reset_app_preferences_description"
-        settings:keywords="@string/keywords_reset_apps" />
-
     <com.android.settings.applications.DefaultEmergencyPreference
         android:key="default_emergency_app"
         android:title="@string/default_emergency_app"
diff --git a/src/com/android/settings/applications/AdvancedAppSettings.java b/src/com/android/settings/applications/AdvancedAppSettings.java
index 2c6efa6..ee47c68 100644
--- a/src/com/android/settings/applications/AdvancedAppSettings.java
+++ b/src/com/android/settings/applications/AdvancedAppSettings.java
@@ -15,33 +15,13 @@
  */
 package com.android.settings.applications;
 
-import static android.net.NetworkPolicyManager.POLICY_NONE;
-import static android.net.NetworkPolicyManager.POLICY_REJECT_METERED_BACKGROUND;
-
 import android.app.Activity;
-import android.app.ActivityManager;
-import android.app.AlertDialog;
-import android.app.AppOpsManager;
-import android.app.INotificationManager;
 import android.content.Context;
-import android.content.DialogInterface;
 import android.content.pm.ApplicationInfo;
-import android.content.pm.IPackageManager;
-import android.content.pm.PackageManager;
-import android.net.NetworkPolicyManager;
-import android.os.AsyncTask;
 import android.os.Bundle;
-import android.os.Handler;
-import android.os.RemoteException;
-import android.os.ServiceManager;
-import android.os.UserHandle;
 import android.preference.Preference;
-import android.preference.Preference.OnPreferenceClickListener;
 import android.provider.SearchIndexableResource;
 import android.util.Log;
-import android.view.LayoutInflater;
-import android.view.View;
-import android.view.ViewGroup;
 
 import com.android.internal.logging.MetricsLogger;
 import com.android.settings.R;
@@ -56,35 +36,20 @@
 import java.util.ArrayList;
 import java.util.List;
 
-public class AdvancedAppSettings extends SettingsPreferenceFragment implements Callbacks,
-        DialogInterface.OnClickListener, DialogInterface.OnDismissListener, Callback, Indexable {
+public class AdvancedAppSettings extends SettingsPreferenceFragment implements Callbacks, Callback,
+        Indexable {
 
     static final String TAG = "AdvancedAppSettings";
     static final boolean DEBUG = Log.isLoggable(TAG, Log.DEBUG);
 
     private static final String KEY_APP_PERM = "manage_perms";
-    private static final String KEY_ALL_APPS = "all_apps";
     private static final String KEY_APP_DOMAIN_URLS = "domain_urls";
-    private static final String KEY_RESET_ALL = "reset_all";
     private static final String KEY_DEFAULT_EMERGENCY_APP = "default_emergency_app";
-    private static final String EXTRA_RESET_DIALOG = "resetDialog";
 
     private ApplicationsState mApplicationsState;
     private Session mSession;
     private Preference mAppPermsPreference;
     private Preference mAppDomainURLsPreference;
-    private Preference mAllAppsPreference;
-    private Preference mResetAllPreference;
-
-    AlertDialog mResetDialog;
-
-    private boolean mActivityResumed;
-    private PackageManager mPm;
-    private IPackageManager mIPm;
-    private INotificationManager mNm;
-    private NetworkPolicyManager mNpm;
-    private AppOpsManager mAom;
-    private Handler mHandler;
     private PermissionsInfo mPermissionsInfo;
 
     @Override
@@ -97,25 +62,8 @@
 
         mAppPermsPreference = findPreference(KEY_APP_PERM);
         mAppDomainURLsPreference = findPreference(KEY_APP_DOMAIN_URLS);
-        mAllAppsPreference = findPreference(KEY_ALL_APPS);
-        mResetAllPreference = findPreference(KEY_RESET_ALL);
-        mResetAllPreference.setOnPreferenceClickListener(new OnPreferenceClickListener() {
-            @Override
-            public boolean onPreferenceClick(Preference preference) {
-                buildResetDialog();
-                return true;
-            }
-        });
         updateUI();
 
-        mPm = getActivity().getPackageManager();
-        mIPm = IPackageManager.Stub.asInterface(ServiceManager.getService("package"));
-        mNm = INotificationManager.Stub.asInterface(
-                ServiceManager.getService(Context.NOTIFICATION_SERVICE));
-        mNpm = NetworkPolicyManager.from(getActivity());
-        mAom = (AppOpsManager)getActivity().getSystemService(Context.APP_OPS_SERVICE);
-        mHandler = new Handler(getActivity().getMainLooper());
-
         if (!DefaultEmergencyPreference.isAvailable(getActivity())) {
             removePreference(KEY_DEFAULT_EMERGENCY_APP);
         }
@@ -123,7 +71,6 @@
 
     private void updateUI() {
         ArrayList<AppEntry> allApps = mSession.getAllApps();
-        mAllAppsPreference.setSummary(getString(R.string.all_apps_summary, allApps.size()));
 
         int countAppWithDomainURLs = 0;
         for (AppEntry entry : allApps) {
@@ -137,25 +84,6 @@
     }
 
     @Override
-    public View onCreateView(LayoutInflater inflater, ViewGroup container,
-            Bundle savedInstanceState) {
-        if (savedInstanceState != null && savedInstanceState.getBoolean(EXTRA_RESET_DIALOG)) {
-            buildResetDialog();
-        }
-
-        return super.onCreateView(inflater, container, savedInstanceState);
-    }
-
-    @Override
-    public void onStop() {
-        super.onStop();
-        if (mResetDialog != null) {
-            mResetDialog.dismiss();
-            mResetDialog = null;
-        }
-    }
-
-    @Override
     protected int getMetricsCategory() {
         return MetricsLogger.APPLICATIONS_ADVANCED;
     }
@@ -163,98 +91,10 @@
     @Override
     public void onResume() {
         super.onResume();
-        mActivityResumed = true;
         mPermissionsInfo = new PermissionsInfo(getActivity(), this);
     }
 
     @Override
-    public void onPause() {
-        mActivityResumed = false;
-        super.onPause();
-    }
-
-    @Override
-    public void onSaveInstanceState(Bundle outState) {
-        super.onSaveInstanceState(outState);
-        if (mResetDialog != null) {
-            outState.putBoolean(EXTRA_RESET_DIALOG, true);
-        }
-    }
-
-    void buildResetDialog() {
-        if (mResetDialog == null) {
-            AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
-            builder.setTitle(R.string.reset_app_preferences_title);
-            builder.setMessage(R.string.reset_app_preferences_desc);
-            builder.setPositiveButton(R.string.reset_app_preferences_button, this);
-            builder.setNegativeButton(R.string.cancel, null);
-            mResetDialog = builder.show();
-            mResetDialog.setOnDismissListener(this);
-        }
-    }
-
-    @Override
-    public void onDismiss(DialogInterface dialog) {
-        if (mResetDialog == dialog) {
-            mResetDialog = null;
-        }
-    }
-
-    @Override
-    public void onClick(DialogInterface dialog, int which) {
-        if (mResetDialog == dialog) {
-            (new AsyncTask<Void, Void, Void>() {
-                @Override protected Void doInBackground(Void... params) {
-                    List<ApplicationInfo> apps = mPm.getInstalledApplications(
-                            PackageManager.GET_DISABLED_COMPONENTS);
-                    for (int i=0; i<apps.size(); i++) {
-                        ApplicationInfo app = apps.get(i);
-                        try {
-                            if (DEBUG) Log.v(TAG, "Enabling notifications: " + app.packageName);
-                            mNm.setNotificationsEnabledForPackage(app.packageName, app.uid, true);
-                        } catch (android.os.RemoteException ex) {
-                        }
-                        if (!app.enabled) {
-                            if (DEBUG) Log.v(TAG, "Enabling app: " + app.packageName);
-                            if (mPm.getApplicationEnabledSetting(app.packageName)
-                                    == PackageManager.COMPONENT_ENABLED_STATE_DISABLED_USER) {
-                                mPm.setApplicationEnabledSetting(app.packageName,
-                                        PackageManager.COMPONENT_ENABLED_STATE_DEFAULT,
-                                        PackageManager.DONT_KILL_APP);
-                            }
-                        }
-                    }
-                    try {
-                        mIPm.resetPreferredActivities(UserHandle.myUserId());
-                    } catch (RemoteException e) {
-                    }
-                    mAom.resetAllModes();
-                    final int[] restrictedUids = mNpm.getUidsWithPolicy(
-                            POLICY_REJECT_METERED_BACKGROUND);
-                    final int currentUserId = ActivityManager.getCurrentUser();
-                    for (int uid : restrictedUids) {
-                        // Only reset for current user
-                        if (UserHandle.getUserId(uid) == currentUserId) {
-                            if (DEBUG) Log.v(TAG, "Clearing data policy: " + uid);
-                            mNpm.setUidPolicy(uid, POLICY_NONE);
-                        }
-                    }
-                    mHandler.post(new Runnable() {
-                        @Override public void run() {
-                            if (DEBUG) Log.v(TAG, "Done clearing");
-                            if (getActivity() != null && mActivityResumed) {
-                                if (DEBUG) Log.v(TAG, "Updating UI!");
-
-                            }
-                        }
-                    });
-                    return null;
-                }
-            }).execute();
-        }
-    }
-
-    @Override
     public void onRunningStateChanged(boolean running) {
         // No-op.
     }
diff --git a/src/com/android/settings/applications/ApplicationsState.java b/src/com/android/settings/applications/ApplicationsState.java
index 71d0790..162ca77 100644
--- a/src/com/android/settings/applications/ApplicationsState.java
+++ b/src/com/android/settings/applications/ApplicationsState.java
@@ -349,6 +349,27 @@
         }
     };
 
+    public static class CompoundFilter implements AppFilter {
+        private final AppFilter mFirstFilter;
+        private final AppFilter mSecondFilter;
+
+        public CompoundFilter(AppFilter first, AppFilter second) {
+            mFirstFilter = first;
+            mSecondFilter = second;
+        }
+
+        @Override
+        public void init() {
+            mFirstFilter.init();
+            mSecondFilter.init();
+        }
+
+        @Override
+        public boolean filterApp(AppEntry info) {
+            return mFirstFilter.filterApp(info) && mSecondFilter.filterApp(info);
+        }
+    }
+
     final Context mContext;
     final PackageManager mPm;
     final IPackageManager mIpm;
diff --git a/src/com/android/settings/applications/ManageApplications.java b/src/com/android/settings/applications/ManageApplications.java
index 4acbedb..825a215 100644
--- a/src/com/android/settings/applications/ManageApplications.java
+++ b/src/com/android/settings/applications/ManageApplications.java
@@ -58,14 +58,15 @@
 import com.android.settings.InstrumentedFragment;
 import com.android.settings.R;
 import com.android.settings.Settings.AllApplicationsActivity;
+import com.android.settings.Settings.DomainsURLsAppListActivity;
 import com.android.settings.Settings.NotificationAppListActivity;
 import com.android.settings.SettingsActivity;
 import com.android.settings.Utils;
 import com.android.settings.applications.ApplicationsState.AppEntry;
 import com.android.settings.applications.ApplicationsState.AppFilter;
+import com.android.settings.applications.ApplicationsState.CompoundFilter;
 import com.android.settings.notification.NotificationBackend;
 import com.android.settings.notification.NotificationBackend.AppRow;
-import com.android.settings.Settings.DomainsURLsAppListActivity;
 
 import java.util.ArrayList;
 import java.util.Collections;
@@ -141,19 +142,23 @@
     // Filter options used for displayed list of applications
     // The order which they appear is the order they will show when spinner is present.
     public static final int FILTER_APPS_DOWNLOADED_AND_LAUNCHER = 0;
-    public static final int FILTER_APPS_ALL                     = 1;
-    public static final int FILTER_APPS_ENABLED                 = 2;
-    public static final int FILTER_APPS_DISABLED                = 3;
-    public static final int FILTER_APPS_BLOCKED                 = 4;
-    public static final int FILTER_APPS_PRIORITY                = 5;
-    public static final int FILTER_APPS_SENSITIVE               = 6;
-    public static final int FILTER_APPS_PERSONAL                = 7;
-    public static final int FILTER_APPS_WORK                    = 8;
-    public static final int FILTER_APPS_WITH_DOMAIN_URLS        = 9;
+    public static final int FILTER_APPS_DL_ENABLED              = 1;
+    public static final int FILTER_APPS_DL_DISABLED             = 2;
+    public static final int FILTER_APPS_ALL                     = 3;
+    public static final int FILTER_APPS_ENABLED                 = 4;
+    public static final int FILTER_APPS_DISABLED                = 5;
+    public static final int FILTER_APPS_BLOCKED                 = 6;
+    public static final int FILTER_APPS_PRIORITY                = 7;
+    public static final int FILTER_APPS_SENSITIVE               = 8;
+    public static final int FILTER_APPS_PERSONAL                = 9;
+    public static final int FILTER_APPS_WORK                    = 10;
+    public static final int FILTER_APPS_WITH_DOMAIN_URLS        = 11;
 
     // This is the string labels for the filter modes above, the order must be kept in sync.
     public static final int[] FILTER_LABELS = new int[] {
-        R.string.filter_all_apps,      // Downloaded and launcher, spinner not shown in this case
+        R.string.filter_all_apps,      // Downloaded and launcher
+        R.string.filter_enabled_apps,  // Downloaded and launcher, Enabled
+        R.string.filter_apps_disabled, // Downloaded and launcher, Disabled
         R.string.filter_all_apps,      // All apps
         R.string.filter_enabled_apps,  // Enabled
         R.string.filter_apps_disabled, // Disabled
@@ -168,6 +173,12 @@
     // be kept in sync.
     public static final AppFilter[] FILTERS = new AppFilter[] {
         ApplicationsState.FILTER_DOWNLOADED_AND_LAUNCHER, // Downloaded and launcher
+        new CompoundFilter(                               // Downloaded and launcher, Enabled
+                ApplicationsState.FILTER_DOWNLOADED_AND_LAUNCHER,
+                ApplicationsState.FILTER_ALL_ENABLED),
+        new CompoundFilter(                               // Downloaded and launcher, Disabled
+                ApplicationsState.FILTER_DOWNLOADED_AND_LAUNCHER,
+                ApplicationsState.FILTER_DISABLED),
         ApplicationsState.FILTER_EVERYTHING,  // All apps
         ApplicationsState.FILTER_ALL_ENABLED, // Enabled
         ApplicationsState.FILTER_DISABLED,    // Disabled
@@ -179,14 +190,12 @@
         ApplicationsState.FILTER_WITH_DOMAIN_URLS,   // Apps with Domain URLs
     };
 
-    // sort order that can be changed through the menu can be sorted alphabetically
-    // or size(descending)
-    private static final int MENU_OPTIONS_BASE = 0;
-    public static final int SORT_ORDER_ALPHA = MENU_OPTIONS_BASE + 1;
-    public static final int SORT_ORDER_SIZE = MENU_OPTIONS_BASE + 2;
-    public static final int RESET_APP_PREFERENCES = MENU_OPTIONS_BASE + 3;
     // sort order
-    private int mSortOrder = SORT_ORDER_ALPHA;
+    private int mSortOrder = R.id.sort_order_alpha;
+
+    // whether showing system apps.
+    private boolean mShowSystem;
+    private boolean mHasDisabledApps;
 
     private ApplicationsState mApplicationsState;
 
@@ -214,9 +223,8 @@
     private Menu mOptionsMenu;
 
     public static final int LIST_TYPE_MAIN = 0;
-    public static final int LIST_TYPE_ALL = 1;
-    public static final int LIST_TYPE_NOTIFICATION = 2;
-    public static final int LIST_TYPE_DOMAINS_URLS = 3;
+    public static final int LIST_TYPE_NOTIFICATION = 1;
+    public static final int LIST_TYPE_DOMAINS_URLS = 2;
 
     private View mRootView;
 
@@ -224,6 +232,7 @@
     private Spinner mFilterSpinner;
     private FilterSpinnerAdapter mFilterAdapter;
     private NotificationBackend mNotifBackend;
+    private ResetAppsHelper mResetAppsHelper;
 
     @Override
     public void onCreate(Bundle savedInstanceState) {
@@ -238,7 +247,7 @@
             className = intent.getComponent().getClassName();
         }
         if (className.equals(AllApplicationsActivity.class.getName())) {
-            mListType = LIST_TYPE_ALL;
+            mShowSystem = true;
         } else if (className.equals(NotificationAppListActivity.class.getName())) {
             mListType = LIST_TYPE_NOTIFICATION;
             mNotifBackend = new NotificationBackend();
@@ -254,6 +263,8 @@
         }
 
         mInvalidSizeStr = getActivity().getText(R.string.invalid_size_value);
+
+        mResetAppsHelper = new ResetAppsHelper(getActivity());
     }
 
 
@@ -263,8 +274,6 @@
         // initialize the inflater
         mInflater = inflater;
 
-        createHeader();
-
         mRootView = inflater.inflate(R.layout.manage_applications_apps, null);
         mLoadingContainer = mRootView.findViewById(R.id.loading_container);
         mLoadingContainer.setVisibility(View.VISIBLE);
@@ -294,6 +303,10 @@
             ((PreferenceFrameLayout.LayoutParams) mRootView.getLayoutParams()).removeBorders = true;
         }
 
+        createHeader();
+
+        mResetAppsHelper.onRestoreInstanceState(savedInstanceState);
+
         return mRootView;
     }
 
@@ -316,23 +329,23 @@
                 mFilterAdapter.enableFilter(FILTER_APPS_WORK);
             }
         }
+        updateMainFilters();
         if (mListType == LIST_TYPE_NOTIFICATION) {
             mFilterAdapter.enableFilter(FILTER_APPS_BLOCKED);
             mFilterAdapter.enableFilter(FILTER_APPS_PRIORITY);
             mFilterAdapter.enableFilter(FILTER_APPS_SENSITIVE);
-        } else if (mListType == LIST_TYPE_DOMAINS_URLS) {
-            mFilterAdapter.disableFilter(FILTER_APPS_ALL);
-            mFilterAdapter.enableFilter(FILTER_APPS_WITH_DOMAIN_URLS);
         }
     }
 
     private int getDefaultFilter() {
-        if (mListType == LIST_TYPE_MAIN) {
-            return FILTER_APPS_DOWNLOADED_AND_LAUNCHER;
-        } else if (mListType == LIST_TYPE_DOMAINS_URLS) {
-            return FILTER_APPS_WITH_DOMAIN_URLS;
+        switch (mListType) {
+            case LIST_TYPE_MAIN:
+                return mShowSystem ? FILTER_APPS_ALL : FILTER_APPS_DOWNLOADED_AND_LAUNCHER;
+            case LIST_TYPE_DOMAINS_URLS:
+                return FILTER_APPS_WITH_DOMAIN_URLS;
+            default:
+                return FILTER_APPS_ALL;
         }
-        return FILTER_APPS_ALL;
     }
 
     @Override
@@ -340,8 +353,6 @@
         switch (mListType) {
             case LIST_TYPE_MAIN:
                 return MetricsLogger.MANAGE_APPLICATIONS;
-            case LIST_TYPE_ALL:
-                return MetricsLogger.MANAGE_APPLICATIONS_ALL;
             case LIST_TYPE_NOTIFICATION:
                 return MetricsLogger.MANAGE_APPLICATIONS_NOTIFICATIONS;
             case LIST_TYPE_DOMAINS_URLS:
@@ -365,6 +376,7 @@
     @Override
     public void onSaveInstanceState(Bundle outState) {
         super.onSaveInstanceState(outState);
+        mResetAppsHelper.onSaveInstanceState(outState);
         outState.putInt(EXTRA_SORT_ORDER, mSortOrder);
     }
 
@@ -377,6 +389,12 @@
     }
 
     @Override
+    public void onStop() {
+        super.onStop();
+        mResetAppsHelper.stop();
+    }
+
+    @Override
     public void onDestroyView() {
         super.onDestroyView();
 
@@ -428,19 +446,11 @@
 
     @Override
     public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
-        if (mListType == LIST_TYPE_DOMAINS_URLS) {
-            // No option menu
+        if (mListType != LIST_TYPE_MAIN) {
             return;
         }
         mOptionsMenu = menu;
-        if (mListType == LIST_TYPE_MAIN) {
-            // Only show advanced options when in the main app list (from dashboard).
-            inflater.inflate(R.menu.manage_apps, menu);
-        }
-        menu.add(0, SORT_ORDER_ALPHA, 1, R.string.sort_order_alpha)
-                .setShowAsAction(MenuItem.SHOW_AS_ACTION_NEVER);
-        menu.add(0, SORT_ORDER_SIZE, 2, R.string.sort_order_size)
-                .setShowAsAction(MenuItem.SHOW_AS_ACTION_NEVER);
+        inflater.inflate(R.menu.manage_apps, menu);
         updateOptionsMenu();
     }
 
@@ -460,11 +470,19 @@
         }
         if (mListType != LIST_TYPE_MAIN) {
             // Allow sorting except on main apps list.
-            mOptionsMenu.findItem(SORT_ORDER_ALPHA).setVisible(mSortOrder != SORT_ORDER_ALPHA);
-            mOptionsMenu.findItem(SORT_ORDER_SIZE).setVisible(mSortOrder != SORT_ORDER_SIZE);
+            mOptionsMenu.findItem(R.id.sort_order_alpha).setVisible(
+                    mSortOrder != R.id.sort_order_alpha);
+            mOptionsMenu.findItem(R.id.sort_order_size).setVisible(
+                    mSortOrder != R.id.sort_order_size);
+
+            mOptionsMenu.findItem(R.id.show_system).setVisible(false);
+            mOptionsMenu.findItem(R.id.hide_system).setVisible(false);
         } else {
-            mOptionsMenu.findItem(SORT_ORDER_ALPHA).setVisible(false);
-            mOptionsMenu.findItem(SORT_ORDER_SIZE).setVisible(false);
+            mOptionsMenu.findItem(R.id.sort_order_alpha).setVisible(false);
+            mOptionsMenu.findItem(R.id.sort_order_size).setVisible(false);
+
+            mOptionsMenu.findItem(R.id.show_system).setVisible(!mShowSystem);
+            mOptionsMenu.findItem(R.id.hide_system).setVisible(mShowSystem);
         }
     }
 
@@ -472,13 +490,21 @@
     public boolean onOptionsItemSelected(MenuItem item) {
         int menuId = item.getItemId();
         switch(item.getItemId()) {
-            case SORT_ORDER_ALPHA:
-            case SORT_ORDER_SIZE:
+            case R.id.sort_order_alpha:
+            case R.id.sort_order_size:
                 mSortOrder = menuId;
                 if (mApplications != null) {
                     mApplications.rebuild(mSortOrder);
                 }
                 break;
+            case R.id.show_system:
+            case R.id.hide_system:
+                mShowSystem = !mShowSystem;
+                updateMainFilters();
+                break;
+            case R.id.reset_app_preferences:
+                mResetAppsHelper.buildResetDialog();
+                return true;
             case R.id.advanced:
                 ((SettingsActivity) getActivity()).startPreferencePanel(
                         AdvancedAppSettings.class.getName(), null, R.string.advanced_apps,
@@ -492,6 +518,18 @@
         return true;
     }
 
+    private void updateMainFilters() {
+        if (mListType != LIST_TYPE_MAIN) {
+            return;
+        }
+        mFilterAdapter.setFilterEnabled(FILTER_APPS_ALL, mShowSystem);
+        mFilterAdapter.setFilterEnabled(FILTER_APPS_ENABLED, mShowSystem && mHasDisabledApps);
+        mFilterAdapter.setFilterEnabled(FILTER_APPS_DISABLED, mShowSystem && mHasDisabledApps);
+        mFilterAdapter.setFilterEnabled(FILTER_APPS_DOWNLOADED_AND_LAUNCHER, !mShowSystem);
+        mFilterAdapter.setFilterEnabled(FILTER_APPS_DL_ENABLED, !mShowSystem && mHasDisabledApps);
+        mFilterAdapter.setFilterEnabled(FILTER_APPS_DL_DISABLED, !mShowSystem && mHasDisabledApps);
+    }
+
     @Override
     public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
         if (mApplications != null && mApplications.getCount() > position) {
@@ -506,7 +544,9 @@
 
     @Override
     public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
-        mApplications.setFilter(mFilterAdapter.getFilter(position));
+        mFilter = mFilterAdapter.getFilter(position);
+        mApplications.setFilter(mFilter);
+        if (DEBUG) Log.d(TAG, "Selecting filter " + mFilter);
     }
 
     @Override
@@ -522,17 +562,11 @@
     }
 
     public void setHasDisabled(boolean hasDisabledApps) {
-        if (mListType == LIST_TYPE_MAIN) {
-            // No filtering on main app list.
-            return;
-        }
-        if (hasDisabledApps) {
-            mFilterAdapter.enableFilter(FILTER_APPS_ENABLED);
-            mFilterAdapter.enableFilter(FILTER_APPS_DISABLED);
-        } else {
-            mFilterAdapter.disableFilter(FILTER_APPS_ENABLED);
-            mFilterAdapter.disableFilter(FILTER_APPS_DISABLED);
-        }
+        mHasDisabledApps = hasDisabledApps;
+        mFilterAdapter.setFilterEnabled(
+                mShowSystem ? FILTER_APPS_ENABLED : FILTER_APPS_DL_ENABLED, hasDisabledApps);
+        mFilterAdapter.setFilterEnabled(
+                mShowSystem ? FILTER_APPS_DISABLED : FILTER_APPS_DL_DISABLED, hasDisabledApps);
     }
 
     static class FilterSpinnerAdapter extends ArrayAdapter<CharSequence> {
@@ -553,23 +587,45 @@
             return mFilterOptions.get(position);
         }
 
+        public void setFilterEnabled(int filter, boolean enabled) {
+            if (enabled) {
+                enableFilter(filter);
+            } else {
+                disableFilter(filter);
+            }
+        }
+
         public void enableFilter(int filter) {
             if (mFilterOptions.contains(filter)) return;
+            if (DEBUG) Log.d(TAG, "Enabling filter " + filter);
             mFilterOptions.add(filter);
             Collections.sort(mFilterOptions);
             mManageApplications.mSpinnerHeader.setVisibility(
                     mFilterOptions.size() > 1 ? View.VISIBLE : View.GONE);
             notifyDataSetChanged();
+            if (mFilterOptions.size() == 1) {
+                if (DEBUG) Log.d(TAG, "Auto selecting filter " + filter);
+                mManageApplications.mFilterSpinner.setSelection(0);
+                mManageApplications.onItemSelected(null, null, 0, 0);
+            }
         }
 
         public void disableFilter(int filter) {
             if (!mFilterOptions.remove((Integer) filter)) {
                 return;
             }
+            if (DEBUG) Log.d(TAG, "Disabling filter " + filter);
             Collections.sort(mFilterOptions);
             mManageApplications.mSpinnerHeader.setVisibility(
                     mFilterOptions.size() > 1 ? View.VISIBLE : View.GONE);
             notifyDataSetChanged();
+            if (mManageApplications.mFilter == filter) {
+                if (mFilterOptions.size() > 0) {
+                    if (DEBUG) Log.d(TAG, "Auto selecting filter " + mFilterOptions.get(0));
+                    mManageApplications.mFilterSpinner.setSelection(0);
+                    mManageApplications.onItemSelected(null, null, 0, 0);
+                }
+            }
         }
 
         @Override
@@ -716,7 +772,7 @@
             }
             filterObj = FILTERS[mFilterMode];
             switch (mLastSortMode) {
-                case SORT_ORDER_SIZE:
+                case R.id.sort_order_size:
                     switch (mWhichSize) {
                         case SIZE_INTERNAL:
                             comparatorObj = ApplicationsState.INTERNAL_SIZE_COMPARATOR;
@@ -845,7 +901,7 @@
                         }
                     }
                     if (holder.entry.info.packageName.equals(mManageApplications.mCurrentPkgName)
-                            && mLastSortMode == SORT_ORDER_SIZE) {
+                            && mLastSortMode == R.id.sort_order_size) {
                         // We got the size information for the last app the
                         // user viewed, and are sorting by size...  they may
                         // have cleared data, so we immediately want to resort
@@ -866,7 +922,7 @@
 
         @Override
         public void onAllSizesComputed() {
-            if (mLastSortMode == SORT_ORDER_SIZE) {
+            if (mLastSortMode == R.id.sort_order_size) {
                 rebuild(false);
             }
         }
diff --git a/src/com/android/settings/applications/ResetAppsHelper.java b/src/com/android/settings/applications/ResetAppsHelper.java
new file mode 100644
index 0000000..cc83157
--- /dev/null
+++ b/src/com/android/settings/applications/ResetAppsHelper.java
@@ -0,0 +1,145 @@
+/*
+ * 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.applications;
+
+import static android.net.NetworkPolicyManager.POLICY_NONE;
+import static android.net.NetworkPolicyManager.POLICY_REJECT_METERED_BACKGROUND;
+
+import android.app.ActivityManager;
+import android.app.AlertDialog;
+import android.app.AppOpsManager;
+import android.app.INotificationManager;
+import android.content.Context;
+import android.content.DialogInterface;
+import android.content.pm.ApplicationInfo;
+import android.content.pm.IPackageManager;
+import android.content.pm.PackageManager;
+import android.net.NetworkPolicyManager;
+import android.os.AsyncTask;
+import android.os.Bundle;
+import android.os.RemoteException;
+import android.os.ServiceManager;
+import android.os.UserHandle;
+
+import com.android.settings.R;
+
+import java.util.List;
+
+public class ResetAppsHelper implements DialogInterface.OnClickListener,
+        DialogInterface.OnDismissListener {
+
+    private static final String EXTRA_RESET_DIALOG = "resetDialog";
+
+    private final PackageManager mPm;
+    private final IPackageManager mIPm;
+    private final INotificationManager mNm;
+    private final NetworkPolicyManager mNpm;
+    private final AppOpsManager mAom;
+    private final Context mContext;
+
+    private AlertDialog mResetDialog;
+
+    public ResetAppsHelper(Context context) {
+        mContext = context;
+        mPm = context.getPackageManager();
+        mIPm = IPackageManager.Stub.asInterface(ServiceManager.getService("package"));
+        mNm = INotificationManager.Stub.asInterface(
+                ServiceManager.getService(Context.NOTIFICATION_SERVICE));
+        mNpm = NetworkPolicyManager.from(context);
+        mAom = (AppOpsManager) context.getSystemService(Context.APP_OPS_SERVICE);
+    }
+
+    public void onRestoreInstanceState(Bundle savedInstanceState) {
+        if (savedInstanceState != null && savedInstanceState.getBoolean(EXTRA_RESET_DIALOG)) {
+            buildResetDialog();
+        }
+    }
+
+    public void onSaveInstanceState(Bundle outState) {
+        if (mResetDialog != null) {
+            outState.putBoolean(EXTRA_RESET_DIALOG, true);
+        }
+    }
+
+    public void stop() {
+        if (mResetDialog != null) {
+            mResetDialog.dismiss();
+            mResetDialog = null;
+        }
+    }
+
+    void buildResetDialog() {
+        if (mResetDialog == null) {
+            mResetDialog = new AlertDialog.Builder(mContext)
+                    .setTitle(R.string.reset_app_preferences_title)
+                    .setMessage(R.string.reset_app_preferences_desc)
+                    .setPositiveButton(R.string.reset_app_preferences_button, this)
+                    .setNegativeButton(R.string.cancel, null)
+                    .setOnDismissListener(this)
+                    .show();
+        }
+    }
+
+    @Override
+    public void onDismiss(DialogInterface dialog) {
+        if (mResetDialog == dialog) {
+            mResetDialog = null;
+        }
+    }
+
+    @Override
+    public void onClick(DialogInterface dialog, int which) {
+        if (mResetDialog != dialog) {
+            return;
+        }
+        AsyncTask.execute(new Runnable() {
+            @Override
+            public void run() {
+                List<ApplicationInfo> apps = mPm.getInstalledApplications(
+                        PackageManager.GET_DISABLED_COMPONENTS);
+                for (int i = 0; i < apps.size(); i++) {
+                    ApplicationInfo app = apps.get(i);
+                    try {
+                        mNm.setNotificationsEnabledForPackage(app.packageName, app.uid, true);
+                    } catch (android.os.RemoteException ex) {
+                    }
+                    if (!app.enabled) {
+                        if (mPm.getApplicationEnabledSetting(app.packageName)
+                                == PackageManager.COMPONENT_ENABLED_STATE_DISABLED_USER) {
+                            mPm.setApplicationEnabledSetting(app.packageName,
+                                    PackageManager.COMPONENT_ENABLED_STATE_DEFAULT,
+                                    PackageManager.DONT_KILL_APP);
+                        }
+                    }
+                }
+                try {
+                    mIPm.resetPreferredActivities(UserHandle.myUserId());
+                } catch (RemoteException e) {
+                }
+                mAom.resetAllModes();
+                final int[] restrictedUids = mNpm.getUidsWithPolicy(
+                        POLICY_REJECT_METERED_BACKGROUND);
+                final int currentUserId = ActivityManager.getCurrentUser();
+                for (int uid : restrictedUids) {
+                    // Only reset for current user
+                    if (UserHandle.getUserId(uid) == currentUserId) {
+                        mNpm.setUidPolicy(uid, POLICY_NONE);
+                    }
+                }
+            }
+        });
+    }
+}
