diff --git a/AndroidManifest.xml b/AndroidManifest.xml
index f4b4bc6..143a394 100644
--- a/AndroidManifest.xml
+++ b/AndroidManifest.xml
@@ -1602,11 +1602,5 @@
             </intent-filter>
         </receiver>
 
-        <receiver android:name=".users.RestrictionsReceiver">
-            <intent-filter>
-                <action android:name="android.intent.action.GET_RESTRICTION_ENTRIES"/>
-            </intent-filter>
-        </receiver>
-
     </application>
 </manifest>
diff --git a/res/values/strings.xml b/res/values/strings.xml
index db07a3d..573f4a0 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -3524,6 +3524,12 @@
     <string name="trusted_credentials">Trusted credentials</string>
     <!-- Summary of preference to display trusted credentials (aka CA certificates) [CHAR LIMIT=NONE] -->
     <string name="trusted_credentials_summary">Display trusted CA certificates</string>
+    <!-- Title of preference of what type of credential storage this device has: hardware or software [CHAR LIMIT=30] -->
+    <string name="credential_storage_type">Storage type</string>
+    <!-- Summary text for preference showing what type of credential storage this device has when it is stored in a hardware-backed storage (as opposed to "software only") [CHAR LIMIT=NONE] -->
+    <string name="credential_storage_type_hardware">Hardware-backed</string>
+    <!-- Summary text for preference showing what type of credential storage this device has when it is stored in software only (as opposed to "hardware-backed") [CHAR LIMIT=NONE] -->
+    <string name="credential_storage_type_software">Software only</string>
 
     <!-- Message to draw an unlock pattern when installing credentials -->
     <string name="credentials_install_gesture_prompt">Draw your unlock pattern</string>
@@ -4416,6 +4422,27 @@
     <string name="user_restrictions_title">Allow apps and content</string>
     <!-- User limits screen, user name rename text [CHAR LIMIT=15] -->
     <string name="user_rename">RENAME</string>
+    <!-- Preference label for custom restrictions [CHAR LIMIT=35] -->
+    <string name="app_restrictions_custom_label">Set application limits</string>
+
+    <!-- Restrictions title for configuring wifi and mobile [CHAR LIMIT=35] -->
+    <string name="restriction_wifi_config_title">Wi\u2011Fi and Mobile</string>
+    <!-- Restrictions summary for configuring wifi and mobile [CHAR LIMIT=100] -->
+    <string name="restriction_wifi_config_summary">Allow modification of Wi\u2011Fi and Mobile settings</string>
+    <!-- Restrictions title for changing bluetooth configuration [CHAR LIMIT=35] -->
+    <string name="restriction_bluetooth_config_title">Bluetooth</string>
+    <!-- Restrictions summary for changing bluetooth configuration [CHAR LIMIT=100] -->
+    <string name="restriction_bluetooth_config_summary">Allow modification of Bluetooth pairings and settings</string>
+    <!-- Restrictions title for allowing NFC transfers [CHAR LIMIT=35] -->
+    <string name="restriction_nfc_enable_title">NFC</string>
+    <!-- Restrictions summary for allowing NFC transfers (tablet) [CHAR LIMIT=100] -->
+    <string name="restriction_nfc_enable_summary" product="tablet">Allow data exchange when the tablet touches another device</string>
+    <!-- Restrictions summary for allowing NFC transfers (phone) [CHAR LIMIT=100] -->
+    <string name="restriction_nfc_enable_summary" product="default">Allow data exchange when the phone touches another device</string>
+    <!-- Restrictions title for allowing location sharing [CHAR LIMIT=35] -->
+    <string name="restriction_location_enable_title">Location access</string>
+    <!-- Restrictions summary for allowing location sharing [CHAR LIMIT=100] -->
+    <string name="restriction_location_enable_summary" >Let apps use your location information</string>
 
     <!-- Wizard back button label [CHAR LIMIT=25] -->
     <string name="wizard_back">Back</string>
diff --git a/res/xml/security_settings_misc.xml b/res/xml/security_settings_misc.xml
index ee87e51..10fc98f 100644
--- a/res/xml/security_settings_misc.xml
+++ b/res/xml/security_settings_misc.xml
@@ -63,6 +63,11 @@
     <PreferenceCategory android:key="credentials_management"
             android:title="@string/credentials_title"
             android:persistent="false">
+        <Preference android:key="credential_storage_type"
+                android:title="@string/credential_storage_type"
+                style="?android:attr/preferenceInformationStyle"
+                android:persistent="false" />
+
         <Preference android:title="@string/trusted_credentials"
                 android:summary="@string/trusted_credentials_summary"
                 android:persistent="false"
diff --git a/src/com/android/settings/SecuritySettings.java b/src/com/android/settings/SecuritySettings.java
index 00a0e09..971a196 100644
--- a/src/com/android/settings/SecuritySettings.java
+++ b/src/com/android/settings/SecuritySettings.java
@@ -73,6 +73,7 @@
     // Misc Settings
     private static final String KEY_SIM_LOCK = "sim_lock";
     private static final String KEY_SHOW_PASSWORD = "show_password";
+    private static final String KEY_CREDENTIAL_STORAGE_TYPE = "credential_storage_type";
     private static final String KEY_RESET_CREDENTIALS = "reset_credentials";
     private static final String KEY_TOGGLE_INSTALL_APPLICATIONS = "toggle_install_applications";
     private static final String KEY_TOGGLE_VERIFY_APPLICATIONS = "toggle_verify_applications";
@@ -91,6 +92,7 @@
 
     private CheckBoxPreference mShowPassword;
 
+    private KeyStore mKeyStore;
     private Preference mResetCredentials;
 
     private CheckBoxPreference mToggleAppInstallation;
@@ -231,6 +233,14 @@
 
         // Credential storage, only for primary user
         if (mIsPrimary) {
+            mKeyStore = KeyStore.getInstance();
+            Preference credentialStorageType = root.findPreference(KEY_CREDENTIAL_STORAGE_TYPE);
+
+            final int storageSummaryRes =
+                    mKeyStore.isHardwareBacked() ? R.string.credential_storage_type_hardware
+                            : R.string.credential_storage_type_software;
+            credentialStorageType.setSummary(storageSummaryRes);
+
             mResetCredentials = root.findPreference(KEY_RESET_CREDENTIALS);
         } else {
             removePreference(KEY_CREDENTIALS_MANAGER);
@@ -427,8 +437,7 @@
         }
 
         if (mResetCredentials != null) {
-            KeyStore keyStore = KeyStore.getInstance();
-            mResetCredentials.setEnabled(!keyStore.isUnlocked());
+            mResetCredentials.setEnabled(!mKeyStore.isUnlocked());
         }
     }
 
diff --git a/src/com/android/settings/Settings.java b/src/com/android/settings/Settings.java
index 64a7d7f..e29874b 100644
--- a/src/com/android/settings/Settings.java
+++ b/src/com/android/settings/Settings.java
@@ -57,7 +57,6 @@
 import com.android.settings.accounts.ManageAccountsSettings;
 import com.android.settings.bluetooth.BluetoothEnabler;
 import com.android.settings.bluetooth.BluetoothSettings;
-import com.android.settings.users.RestrictionsReceiver;
 import com.android.settings.wfd.WifiDisplaySettings;
 import com.android.settings.wifi.WifiEnabler;
 import com.android.settings.wifi.WifiSettings;
@@ -457,15 +456,6 @@
                 if (!showDev) {
                     target.remove(i);
                 }
-            } else if (id == R.id.application_settings) {
-                if (mAppRestrictions != null) {
-                    for (RestrictionEntry entry : mAppRestrictions) {
-                        if (entry.key.equals(RestrictionsReceiver.KEY_ENABLE_APPS)
-                                && !entry.getBooleanValue()) {
-                            target.remove(i);
-                        }
-                    }
-                }
             } else if (id == R.id.account_add) {
                 if (um.hasUserRestriction(UserManager.DISALLOW_MODIFY_ACCOUNTS)) {
                     target.remove(i);
diff --git a/src/com/android/settings/users/AppRestrictionsFragment.java b/src/com/android/settings/users/AppRestrictionsFragment.java
index b610025..6154bdf 100644
--- a/src/com/android/settings/users/AppRestrictionsFragment.java
+++ b/src/com/android/settings/users/AppRestrictionsFragment.java
@@ -16,10 +16,12 @@
 
 package com.android.settings.users;
 
+import android.appwidget.AppWidgetManager;
 import android.content.BroadcastReceiver;
 import android.content.Context;
 import android.content.Intent;
 import android.content.RestrictionEntry;
+import android.content.pm.ApplicationInfo;
 import android.content.pm.PackageInfo;
 import android.content.pm.PackageManager;
 import android.content.pm.PackageManager.NameNotFoundException;
@@ -31,6 +33,7 @@
 import android.graphics.drawable.ColorDrawable;
 import android.graphics.drawable.Drawable;
 import android.os.Bundle;
+import android.os.Parcelable;
 import android.os.UserHandle;
 import android.os.UserManager;
 import android.preference.CheckBoxPreference;
@@ -85,11 +88,14 @@
     private static final int MAX_APP_RESTRICTIONS = 100;
 
     private static final String DELIMITER = ";";
-    private List<ResolveInfo> mApps;
     HashMap<String,Boolean> mSelectedPackages = new HashMap<String,Boolean>();
     private boolean mFirstTime = true;
     private boolean mNewUser;
 
+    private int mCustomRequestCode;
+    private HashMap<Integer, AppRestrictionsPreference> mCustomRequestMap =
+            new HashMap<Integer,AppRestrictionsPreference>();
+
     public static class Activity extends PreferenceActivity {
         @Override
         public Intent getIntent() {
@@ -133,7 +139,7 @@
         RestrictionEntry getRestriction(String key) {
             if (restrictions == null) return null;
             for (RestrictionEntry entry : restrictions) {
-                if (entry.key.equals(key)) {
+                if (entry.getKey().equals(key)) {
                     return entry;
                 }
             }
@@ -207,33 +213,70 @@
         mUserPreference.setText(info.name);
     }
 
+    private void addSystemApps(List<ApplicationInfo> visibleApps, Intent intent) {
+        final PackageManager pm = getActivity().getPackageManager();
+        List<ResolveInfo> launchableApps = pm.queryIntentActivities(intent, 0);
+        for (ResolveInfo app : launchableApps) {
+            if (app.activityInfo != null && app.activityInfo.applicationInfo != null) {
+                int flags = app.activityInfo.applicationInfo.flags;
+                if ((flags & ApplicationInfo.FLAG_SYSTEM) != 0
+                        || (flags & ApplicationInfo.FLAG_UPDATED_SYSTEM_APP) != 0) {
+                    // System app
+                    visibleApps.add(app.activityInfo.applicationInfo);
+                }
+            }
+        }
+    }
+
     private void populateApps() {
         mAppList.setOrderingAsAdded(false);
-
+        List<ApplicationInfo> visibleApps = new ArrayList<ApplicationInfo>();
         // TODO: Do this asynchronously since it can be a long operation
         final Context context = getActivity();
         PackageManager pm = context.getPackageManager();
+
+        // Add launchers
         Intent launcherIntent = new Intent(Intent.ACTION_MAIN);
         launcherIntent.addCategory(Intent.CATEGORY_LAUNCHER);
-        mApps = pm.queryIntentActivities(launcherIntent, 0);
-        Collections.sort(mApps, new AppLabelComparator(pm));
+        addSystemApps(visibleApps, launcherIntent);
 
+        // Add widgets
+        Intent widgetIntent = new Intent(AppWidgetManager.ACTION_APPWIDGET_UPDATE);
+        addSystemApps(visibleApps, widgetIntent);
+
+        List<ApplicationInfo> installedApps = pm.getInstalledApplications(0);
+        for (ApplicationInfo app : installedApps) {
+            if ((app.flags & ApplicationInfo.FLAG_SYSTEM) == 0
+                    && (app.flags & ApplicationInfo.FLAG_UPDATED_SYSTEM_APP) == 0) {
+                // Downloaded app
+                visibleApps.add(app);
+            }
+        }
+        Collections.sort(visibleApps, new AppLabelComparator(pm));
+
+        for (int i = visibleApps.size() - 1; i > 1; i--) {
+            ApplicationInfo appInfo = visibleApps.get(i);
+            if (appInfo.packageName.equals(visibleApps.get(i-1).packageName)) {
+                visibleApps.remove(i);
+            }
+        }
         Intent restrictionsIntent = new Intent(Intent.ACTION_GET_RESTRICTION_ENTRIES);
         final List<ResolveInfo> receivers = pm.queryBroadcastReceivers(restrictionsIntent, 0);
         final List<ResolveInfo> existingApps = pm.queryIntentActivitiesAsUser(launcherIntent,
                 0, mUser.getIdentifier());
         int i = 0;
-        if (receivers != null && receivers.size() > 0) {
-            for (ResolveInfo app : mApps) {
-                if (app.activityInfo == null || app.activityInfo.packageName == null) continue;
-                String packageName = app.activityInfo.packageName;
+        if (visibleApps.size() > 0) {
+            for (ApplicationInfo app : visibleApps) {
+                if (app.packageName == null) continue;
+                String packageName = app.packageName;
                 Drawable icon = app.loadIcon(pm);
                 CharSequence label = app.loadLabel(pm);
                 AppRestrictionsPreference p = new AppRestrictionsPreference(context, this);
                 p.setIcon(icon);
                 p.setTitle(label);
                 p.setKey(PKG_PREFIX + packageName);
-                p.setSettingsEnabled(hasPackage(receivers, packageName));
+                p.setSettingsEnabled(hasPackage(receivers, packageName)
+                        || packageName.equals(getActivity().getPackageName()));
                 p.setPersistent(false);
                 p.setOnPreferenceChangeListener(this);
                 p.setOnPreferenceClickListener(this);
@@ -261,7 +304,7 @@
         }
     }
 
-    private class AppLabelComparator implements Comparator<ResolveInfo> {
+    private class AppLabelComparator implements Comparator<ApplicationInfo> {
 
         PackageManager pm;
 
@@ -269,13 +312,13 @@
             this.pm = pm;
         }
 
-        private CharSequence getLabel(ResolveInfo info) {
+        private CharSequence getLabel(ApplicationInfo info) {
             // TODO: Optimize this with a cache
-            return info.activityInfo.loadLabel(pm);
+            return info.loadLabel(pm);
         }
 
         @Override
-        public int compare(ResolveInfo lhs, ResolveInfo rhs) {
+        public int compare(ApplicationInfo lhs, ApplicationInfo rhs) {
             String lhsLabel = getLabel(lhs).toString();
             String rhsLabel = getLabel(rhs).toString();
             return lhsLabel.compareTo(rhsLabel);
@@ -296,7 +339,7 @@
         if (v.getTag() instanceof AppRestrictionsPreference) {
             AppRestrictionsPreference pref = (AppRestrictionsPreference) v.getTag();
             if (v.getId() == R.id.app_restrictions_settings) {
-                handleSettingsClick(pref);
+                toggleAppPanel(pref);
             } else if (!pref.isRequired()) {
                 pref.setChecked(!pref.isChecked());
                 mSelectedPackages.put(pref.getKey().substring(PKG_PREFIX.length()),
@@ -317,21 +360,18 @@
             ArrayList<RestrictionEntry> restrictions = appPref.getRestrictions();
             if (restrictions != null) {
                 for (RestrictionEntry entry : restrictions) {
-                    if (entry.key.equals(restrictionKey)) {
-                        switch (entry.type) {
+                    if (entry.getKey().equals(restrictionKey)) {
+                        switch (entry.getType()) {
                         case RestrictionEntry.TYPE_BOOLEAN:
-                            entry.setValue((Boolean) newValue);
+                            entry.setSelectedState((Boolean) newValue);
                             break;
                         case RestrictionEntry.TYPE_CHOICE:
                         case RestrictionEntry.TYPE_CHOICE_LEVEL:
                             ListPreference listPref = (ListPreference) preference;
-                            entry.setValue((String) newValue);
-                            for (int i = 0; i < listPref.getEntryValues().length; i++) {
-                                if (entry.values[i].equals(newValue)) {
-                                    listPref.setSummary(entry.choices[i]);
-                                    break;
-                                }
-                            }
+                            entry.setSelectedString((String) newValue);
+                            String readable = findInArray(entry.getChoiceEntries(),
+                                    entry.getChoiceValues(), (String) newValue);
+                            listPref.setSummary(readable);
                             break;
                         case RestrictionEntry.TYPE_MULTI_SELECT:
                             MultiSelectListPreference msListPref =
@@ -339,13 +379,17 @@
                             Set<String> set = (Set<String>) newValue;
                             String [] selectedValues = new String[set.size()];
                             set.toArray(selectedValues);
-                            entry.setMultipleValues(selectedValues);
+                            entry.setAllSelectedStrings(selectedValues);
                             break;
                         default:
                             continue;
                         }
-                        mUserManager.setApplicationRestrictions(packageName, restrictions,
-                                mUser);
+                        if (packageName.equals(getActivity().getPackageName())) {
+                            RestrictionUtils.setRestrictions(getActivity(), restrictions, mUser);
+                        } else {
+                            mUserManager.setApplicationRestrictions(packageName, restrictions,
+                                    mUser);
+                        }
                         break;
                     }
                 }
@@ -360,7 +404,7 @@
         return true;
     }
 
-    private void handleSettingsClick(AppRestrictionsPreference preference) {
+    private void toggleAppPanel(AppRestrictionsPreference preference) {
         if (preference.getKey().startsWith(PKG_PREFIX)) {
             if (preference.panelOpen) {
                 for (Preference p : preference.childPreferences) {
@@ -369,14 +413,22 @@
                 preference.childPreferences.clear();
             } else {
                 String packageName = preference.getKey().substring(PKG_PREFIX.length());
-                List<RestrictionEntry> oldEntries =
-                        mUserManager.getApplicationRestrictions(packageName, mUser);
-                Intent intent = new Intent(Intent.ACTION_GET_RESTRICTION_ENTRIES);
-                intent.putParcelableArrayListExtra(Intent.EXTRA_RESTRICTIONS,
-                        new ArrayList<RestrictionEntry>(oldEntries));
-                getActivity().sendOrderedBroadcast(intent, null,
-                        new RestrictionsResultReceiver(packageName, preference),
-                        null, Activity.RESULT_OK, null, null);
+                if (packageName.equals(getActivity().getPackageName())) {
+                    // Settings, fake it by using user restrictions
+                    ArrayList<RestrictionEntry> restrictions = RestrictionUtils.getRestrictions(
+                            getActivity(), mUser);
+                    onRestrictionsReceived(preference, packageName, restrictions);
+                } else {
+                    List<RestrictionEntry> oldEntries =
+                            mUserManager.getApplicationRestrictions(packageName, mUser);
+                    Intent intent = new Intent(Intent.ACTION_GET_RESTRICTION_ENTRIES);
+                    intent.setPackage(packageName);
+                    intent.putParcelableArrayListExtra(Intent.EXTRA_RESTRICTIONS,
+                            new ArrayList<RestrictionEntry>(oldEntries));
+                    getActivity().sendOrderedBroadcast(intent, null,
+                            new RestrictionsResultReceiver(packageName, preference),
+                            null, Activity.RESULT_OK, null, null);
+                }
             }
             preference.panelOpen = !preference.panelOpen;
         }
@@ -384,6 +436,7 @@
 
     class RestrictionsResultReceiver extends BroadcastReceiver {
 
+        private static final String CUSTOM_RESTRICTIONS_INTENT = Intent.EXTRA_RESTRICTIONS_INTENT;
         String packageName;
         AppRestrictionsPreference preference;
 
@@ -395,64 +448,144 @@
 
         @Override
         public void onReceive(Context context, Intent intent) {
-            ArrayList<RestrictionEntry> restrictions = getResultExtras(true).getParcelableArrayList(
+            Bundle results = getResultExtras(true);
+            final ArrayList<RestrictionEntry> restrictions = results.getParcelableArrayList(
                     Intent.EXTRA_RESTRICTIONS);
-            if (restrictions != null) {
-                int count = 1;
-                for (RestrictionEntry entry : restrictions) {
-                    Preference p = null;
-                    switch (entry.type) {
-                    case RestrictionEntry.TYPE_BOOLEAN:
-                        p = new CheckBoxPreference(context);
-                        p.setTitle(entry.title);
-                        p.setSummary(entry.description);
-                        ((CheckBoxPreference)p).setChecked(entry.getBooleanValue());
-                        break;
-                    case RestrictionEntry.TYPE_CHOICE:
-                    case RestrictionEntry.TYPE_CHOICE_LEVEL:
-                        p = new ListPreference(context);
-                        p.setTitle(entry.title);
-                        String value = entry.getStringValue();
-                        if (value == null) {
-                            value = entry.description;
-                        }
-                        p.setSummary(value);
-                        ((ListPreference)p).setEntryValues(entry.values);
-                        ((ListPreference)p).setEntries(entry.choices);
-                        ((ListPreference)p).setValue(entry.getStringValue());
-                        break;
-                    case RestrictionEntry.TYPE_MULTI_SELECT:
-                        p = new MultiSelectListPreference(context);
-                        p.setTitle(entry.title);
-                        ((MultiSelectListPreference)p).setEntryValues(entry.values);
-                        ((MultiSelectListPreference)p).setEntries(entry.choices);
-                        HashSet<String> set = new HashSet<String>();
-                        for (String s : entry.getMultipleValues()) {
-                            set.add(s);
-                        }
-                        ((MultiSelectListPreference)p).setValues(set);
-                        break;
-                    case RestrictionEntry.TYPE_NULL:
-                    default:
+            Intent restrictionsIntent = (Intent) results.getParcelable(CUSTOM_RESTRICTIONS_INTENT);
+            if (restrictions != null && restrictionsIntent == null) {
+                onRestrictionsReceived(preference, packageName, restrictions);
+                mUserManager.setApplicationRestrictions(packageName, restrictions, mUser);
+            } else if (restrictionsIntent != null) {
+                final Intent customIntent = restrictionsIntent;
+                customIntent.putParcelableArrayListExtra(Intent.EXTRA_RESTRICTIONS, restrictions);
+                Preference p = new Preference(context);
+                p.setTitle(R.string.app_restrictions_custom_label);
+                p.setOnPreferenceClickListener(new OnPreferenceClickListener() {
+                    @Override
+                    public boolean onPreferenceClick(Preference preference) {
+                        int requestCode = generateCustomActivityRequestCode(
+                                RestrictionsResultReceiver.this.preference);
+                        AppRestrictionsFragment.this.startActivityForResult(
+                                customIntent, requestCode);
+                        return false;
                     }
-                    if (p != null) {
-                        p.setPersistent(false);
-                        p.setOrder(preference.getOrder() + count);
-                        // Store the restrictions key string as a key for the preference
-                        p.setKey(preference.getKey().substring(PKG_PREFIX.length()) + DELIMITER
-                                + entry.key);
-                        mAppList.addPreference(p);
-                        p.setOnPreferenceChangeListener(AppRestrictionsFragment.this);
-                        preference.childPreferences.add(p);
-                        count++;
-                    }
-                }
+                });
+                p.setPersistent(false);
+                p.setOrder(preference.getOrder() + 1);
+                preference.childPreferences.add(p);
+                mAppList.addPreference(p);
                 preference.setRestrictions(restrictions);
             }
-            mUserManager.setApplicationRestrictions(packageName, restrictions, mUser);
         }
     }
 
+    private void onRestrictionsReceived(AppRestrictionsPreference preference, String packageName,
+            ArrayList<RestrictionEntry> restrictions) {
+        // Non-custom-activity case - expand the restrictions in-place
+        final Context context = preference.getContext();
+        int count = 1;
+        for (RestrictionEntry entry : restrictions) {
+            Preference p = null;
+            switch (entry.getType()) {
+            case RestrictionEntry.TYPE_BOOLEAN:
+                p = new CheckBoxPreference(context);
+                p.setTitle(entry.getTitle());
+                p.setSummary(entry.getDescription());
+                ((CheckBoxPreference)p).setChecked(entry.getSelectedState());
+                break;
+            case RestrictionEntry.TYPE_CHOICE:
+            case RestrictionEntry.TYPE_CHOICE_LEVEL:
+                p = new ListPreference(context);
+                p.setTitle(entry.getTitle());
+                String value = entry.getSelectedString();
+                if (value == null) {
+                    value = entry.getDescription();
+                }
+                p.setSummary(findInArray(entry.getChoiceEntries(), entry.getChoiceValues(),
+                        value));
+                ((ListPreference)p).setEntryValues(entry.getChoiceValues());
+                ((ListPreference)p).setEntries(entry.getChoiceEntries());
+                ((ListPreference)p).setValue(value);
+                break;
+            case RestrictionEntry.TYPE_MULTI_SELECT:
+                p = new MultiSelectListPreference(context);
+                p.setTitle(entry.getTitle());
+                ((MultiSelectListPreference)p).setEntryValues(entry.getChoiceValues());
+                ((MultiSelectListPreference)p).setEntries(entry.getChoiceEntries());
+                HashSet<String> set = new HashSet<String>();
+                for (String s : entry.getAllSelectedStrings()) {
+                    set.add(s);
+                }
+                ((MultiSelectListPreference)p).setValues(set);
+                break;
+            case RestrictionEntry.TYPE_NULL:
+            default:
+            }
+            if (p != null) {
+                p.setPersistent(false);
+                p.setOrder(preference.getOrder() + count);
+                // Store the restrictions key string as a key for the preference
+                p.setKey(preference.getKey().substring(PKG_PREFIX.length()) + DELIMITER
+                        + entry.getKey());
+                mAppList.addPreference(p);
+                p.setOnPreferenceChangeListener(AppRestrictionsFragment.this);
+                preference.childPreferences.add(p);
+                count++;
+            }
+        }
+        preference.setRestrictions(restrictions);
+    }
+
+    /**
+     * Generates a request code that is stored in a map to retrieve the associated
+     * AppRestrictionsPreference.
+     * @param preference
+     * @return
+     */
+    private int generateCustomActivityRequestCode(AppRestrictionsPreference preference) {
+        mCustomRequestCode++;
+        mCustomRequestMap.put(mCustomRequestCode, preference);
+        return mCustomRequestCode;
+    }
+
+    @Override
+    public void onActivityResult(int requestCode, int resultCode, Intent data) {
+        super.onActivityResult(requestCode, resultCode, data);
+
+        Log.i(TAG, "Got activity resultCode=" + resultCode + ", requestCode="
+                + requestCode + ", data=" + data);
+
+        AppRestrictionsPreference pref = mCustomRequestMap.get(requestCode);
+        if (pref == null) {
+            Log.w(TAG, "Unknown requestCode " + requestCode);
+            return;
+        }
+
+        if (resultCode == Activity.RESULT_OK) {
+            ArrayList<RestrictionEntry> list =
+                    data.getParcelableArrayListExtra(Intent.EXTRA_RESTRICTIONS);
+            if (list != null) {
+                // If there's a valid result, persist it to the user manager.
+                String packageName = pref.getKey().substring(PKG_PREFIX.length());
+                pref.setRestrictions(list);
+                mUserManager.setApplicationRestrictions(packageName, list, mUser);
+            }
+            toggleAppPanel(pref);
+        }
+        // Remove request from the map
+        mCustomRequestMap.remove(requestCode);
+    }
+
+    private String findInArray(String[] choiceEntries, String[] choiceValues,
+            String selectedString) {
+        for (int i = 0; i < choiceValues.length; i++) {
+            if (choiceValues[i].equals(selectedString)) {
+                return choiceEntries[i];
+            }
+        }
+        return selectedString;
+    }
+
     @Override
     public boolean onPreferenceClick(Preference preference) {
         if (preference.getKey().startsWith(PKG_PREFIX)) {
diff --git a/src/com/android/settings/users/RestrictionUtils.java b/src/com/android/settings/users/RestrictionUtils.java
new file mode 100644
index 0000000..8b675a5
--- /dev/null
+++ b/src/com/android/settings/users/RestrictionUtils.java
@@ -0,0 +1,93 @@
+/*
+ * Copyright (C) 2013 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.users;
+
+import android.content.Context;
+import android.content.RestrictionEntry;
+import android.content.res.Resources;
+import android.os.Bundle;
+import android.os.UserHandle;
+import android.os.UserManager;
+import android.provider.Settings.Secure;
+
+import com.android.settings.R;
+
+import java.util.ArrayList;
+
+public class RestrictionUtils {
+
+    public static final String [] sRestrictionKeys = {
+        UserManager.DISALLOW_CONFIG_WIFI,
+        UserManager.DISALLOW_CONFIG_BLUETOOTH,
+        UserManager.DISALLOW_SHARE_LOCATION,
+        UserManager.DISALLOW_INSTALL_UNKNOWN_SOURCES
+    };
+
+    public static final int [] sRestrictionTitles = {
+        R.string.restriction_wifi_config_title,
+        R.string.restriction_bluetooth_config_title,
+        R.string.restriction_location_enable_title,
+        R.string.install_applications
+    };
+
+    public static final int [] sRestrictionDescriptions = {
+        R.string.restriction_wifi_config_summary,
+        R.string.restriction_bluetooth_config_summary,
+        R.string.restriction_location_enable_summary,
+        R.string.install_unknown_applications
+    };
+
+    /**
+     * Returns the current user restrictions in the form of application
+     * restriction entries.
+     * @return list of RestrictionEntry objects with user-visible text.
+     */
+    public static ArrayList<RestrictionEntry> getRestrictions(Context context, UserHandle user) {
+        Resources res = context.getResources();
+        ArrayList<RestrictionEntry> entries = new ArrayList<RestrictionEntry>();
+        UserManager um = UserManager.get(context);
+        Bundle userRestrictions = um.getUserRestrictions(user);
+
+        for (int i = 0; i < sRestrictionKeys.length; i++) {
+            RestrictionEntry entry = new RestrictionEntry(
+                    sRestrictionKeys[i],
+                    !userRestrictions.getBoolean(sRestrictionKeys[i], false));
+            entry.setTitle(res.getString(sRestrictionTitles[i]));
+            entry.setDescription(res.getString(sRestrictionDescriptions[i]));
+            entry.setType(RestrictionEntry.TYPE_BOOLEAN);
+            entries.add(entry);
+        }
+
+        return entries;
+    }
+
+    public static void setRestrictions(Context context, ArrayList<RestrictionEntry> entries,
+            UserHandle user) {
+        UserManager um = UserManager.get(context);
+        Bundle userRestrictions = um.getUserRestrictions(user);
+
+        for (RestrictionEntry entry : entries) {
+            userRestrictions.putBoolean(entry.getKey(), !entry.getSelectedState());
+            if (entry.getKey().equals(UserManager.DISALLOW_SHARE_LOCATION)
+                    && !entry.getSelectedState()) {
+                Secure.putStringForUser(context.getContentResolver(),
+                        Secure.LOCATION_PROVIDERS_ALLOWED, "", user.getIdentifier());
+            }
+        }
+        um.setUserRestrictions(userRestrictions, user);
+    }
+}
diff --git a/src/com/android/settings/users/RestrictionsReceiver.java b/src/com/android/settings/users/RestrictionsReceiver.java
deleted file mode 100644
index 0eeb7cd..0000000
--- a/src/com/android/settings/users/RestrictionsReceiver.java
+++ /dev/null
@@ -1,128 +0,0 @@
-/*
- * Copyright (C) 2013 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.users;
-
-import android.content.BroadcastReceiver;
-import android.content.Context;
-import android.content.Intent;
-import android.content.RestrictionEntry;
-import android.os.Bundle;
-import android.util.Log;
-
-import com.android.settings.R;
-
-import java.util.ArrayList;
-import java.util.List;
-
-/** Test class, to demonstrate the features. TODO: Remove or modify with real restrictions */
-public class RestrictionsReceiver extends BroadcastReceiver {
-
-    private static final String TAG = RestrictionsReceiver.class.getSimpleName();
-
-    public static final String KEY_VERSION = "version";
-    public static final String KEY_ENABLE_APPS = "enable_apps";
-    public static final String KEY_SECTIONS_TO_SHOW = "enable_sections";
-    public static final String KEY_CONTENT_RATING = "content_rating";
-
-    private static final int[] SECTION_IDS = {
-        R.id.wifi_settings,
-        R.id.bluetooth_settings,
-        R.id.data_usage_settings,
-        R.id.app_settings,
-        R.id.date_time_settings,
-        R.id.about_settings
-    };
-
-    private static final int[] SECTION_TITLE_IDS = {
-        R.string.wifi_settings,
-        R.string.bluetooth_settings,
-        R.string.data_usage_summary_title,
-        R.string.manageapplications_settings_title,
-        R.string.date_and_time,
-        R.string.about_settings
-    };
-
-    @Override
-    public void onReceive(final Context context, Intent intent) {
-        final PendingResult result = goAsync();
-        final ArrayList<RestrictionEntry> oldRestrictions =
-                intent.getParcelableArrayListExtra(Intent.EXTRA_RESTRICTIONS);
-        Log.i(TAG, "oldRestrictions = " + oldRestrictions);
-        new Thread() {
-            public void run() {
-                createRestrictions(context, result, oldRestrictions);
-            }
-        }.start();
-    }
-
-    private void createRestrictions(Context context,
-            PendingResult result, List<RestrictionEntry> old) {
-        ArrayList<RestrictionEntry> newRestrictions = new ArrayList<RestrictionEntry>();
-        boolean oldEnableApps = false;
-        String oldContentRating = "";
-        String[] oldEnabledSections = new String[0];
-        if (old != null) {
-            for (RestrictionEntry r : old) {
-                if (r.key.equals(KEY_ENABLE_APPS)) {
-                    oldEnableApps = r.getBooleanValue();
-                } else if (r.key.equals(KEY_CONTENT_RATING)) {
-                    oldContentRating = r.getStringValue();
-                } else if (r.key.equals(KEY_SECTIONS_TO_SHOW)) {
-                    oldEnabledSections = r.getMultipleValues();
-                }
-            }
-        }
-
-        RestrictionEntry r0 = new RestrictionEntry(KEY_VERSION, "1");
-        newRestrictions.add(r0);
-
-        RestrictionEntry r1 = new RestrictionEntry(KEY_ENABLE_APPS,
-                Boolean.toString(oldEnableApps));
-        r1.title = "Enable apps";
-        r1.description = "Show the Apps section in Settings";
-        r1.type = RestrictionEntry.TYPE_BOOLEAN;
-        newRestrictions.add(r1);
-
-        RestrictionEntry r2 = new RestrictionEntry(KEY_CONTENT_RATING, oldContentRating);
-        r2.title = "Test: Content rating";
-        r2.description = "Limit content to chosen rating and lower";
-        r2.type = RestrictionEntry.TYPE_CHOICE_LEVEL;
-        r2.values = new String[] { "G", "PG", "PG13", "R", "NR" };
-        r2.choices = new String[] { "G", "PG", "PG-13", "Restricted", "Not Rated" };
-        newRestrictions.add(r2);
-
-        String [] values = new String[SECTION_IDS.length];
-        String [] choices = new String[SECTION_IDS.length];
-        int i = 0;
-        for (int sectionId : SECTION_IDS) {
-            values[i] = Integer.toString(sectionId);
-            choices[i] = context.getString(SECTION_TITLE_IDS[i]);
-            i++;
-        }
-        RestrictionEntry r3 = new RestrictionEntry(KEY_SECTIONS_TO_SHOW, oldEnabledSections);
-        r3.type = RestrictionEntry.TYPE_MULTI_SELECT;
-        r3.choices = choices;
-        r3.values = values;
-        r3.title = "Test: Sections to show";
-        newRestrictions.add(r3);
-
-        Bundle extras = new Bundle();
-        extras.putParcelableArrayList(Intent.EXTRA_RESTRICTIONS, newRestrictions);
-        result.setResult(0, null, extras);
-        result.finish();
-    }
-}
diff --git a/src/com/android/settings/users/UserSettings.java b/src/com/android/settings/users/UserSettings.java
index 872d144..5830184 100644
--- a/src/com/android/settings/users/UserSettings.java
+++ b/src/com/android/settings/users/UserSettings.java
@@ -501,6 +501,12 @@
         boolean moreUsers = mUserManager.getMaxSupportedUsers() > users.size();
         mAddRestrictedUser.setEnabled(moreUsers);
         mAddTrustedUser.setEnabled(moreUsers);
+        // Remove the limited users category if there aren't other limited users.
+        if (!mIsOwner) {
+            if (mLimitedUserListCategory.getPreferenceCount() == 0) {
+                removePreference(KEY_LIMITED_USER_LIST);
+            }
+        }
     }
 
     private void loadIconsAsync(List<Integer> missingIcons) {
