diff --git a/res/values/strings.xml b/res/values/strings.xml
index 18e2f61..233963c 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -4257,6 +4257,10 @@
     <string name="help_url_tether" translatable="false"></string>
     <!-- Help URL, Dreams [DO NOT TRANSLATE] -->
     <string name="help_url_dreams" translatable="false"></string>
+    <!-- Help URL, User settings [DO NOT TRANSLATE] -->
+    <string name="help_url_users" translatable="false"></string>
+    <!-- Help URL, Location access [DO NOT TRANSLATE] -->
+    <string name="help_url_location_access" translatable="false"></string>
 
     <!-- User account title [CHAR LIMIT=30] -->
     <string name="user_account_title">Account for content</string>
diff --git a/src/com/android/settings/AppWidgetPickActivity.java b/src/com/android/settings/AppWidgetPickActivity.java
index f573edf..f242dcf 100644
--- a/src/com/android/settings/AppWidgetPickActivity.java
+++ b/src/com/android/settings/AppWidgetPickActivity.java
@@ -24,6 +24,7 @@
 import android.graphics.drawable.Drawable;
 import android.os.Bundle;
 import android.os.Parcelable;
+import android.os.SystemProperties;
 import android.util.Log;
 
 import java.text.Collator;
@@ -54,7 +55,11 @@
      * activity is binding.
      */
     private int mAppWidgetId;
-    
+
+    // Enable testing launcher widgets in keyguard.  For testing purposes only.
+    private final boolean mIgnoreFilter = false || SystemProperties.getBoolean(
+            "ro.keyguard_ignore_filter", false);
+
     @Override
     public void onCreate(Bundle icicle) {
         mPackageManager = getPackageManager();
@@ -257,7 +262,7 @@
      */
     void putInstalledAppWidgets(List<PickAdapter.Item> items, int categoryFilter, int featuresFilter) {
         List<AppWidgetProviderInfo> installed = mAppWidgetManager.getInstalledProviders();
-        putAppWidgetItems(installed, null, items, categoryFilter, featuresFilter, false);
+        putAppWidgetItems(installed, null, items, categoryFilter, featuresFilter, mIgnoreFilter );
     }
 
     /**
diff --git a/src/com/android/settings/LocationSettings.java b/src/com/android/settings/LocationSettings.java
index 4153485..cfbbe26 100644
--- a/src/com/android/settings/LocationSettings.java
+++ b/src/com/android/settings/LocationSettings.java
@@ -185,6 +185,10 @@
         return true;
     }
 
+    @Override
+    public int getHelpResource() {
+        return R.string.help_url_location_access;
+    }
 }
 
 class WrappingSwitchPreference extends SwitchPreference {
diff --git a/src/com/android/settings/Utils.java b/src/com/android/settings/Utils.java
index 1d4a6da..1a5c82c 100644
--- a/src/com/android/settings/Utils.java
+++ b/src/com/android/settings/Utils.java
@@ -27,6 +27,8 @@
 import android.content.res.Resources;
 import android.content.res.Resources.NotFoundException;
 import android.database.Cursor;
+import android.graphics.Bitmap;
+import android.graphics.BitmapFactory;
 import android.graphics.drawable.Drawable;
 import android.net.ConnectivityManager;
 import android.net.LinkProperties;
@@ -473,24 +475,12 @@
         }
         int userId = user != null ? user.id : UserHandle.myUserId();
         UserManager um = (UserManager) context.getSystemService(Context.USER_SERVICE);
-        ParcelFileDescriptor fd = um.setUserIcon(userId);
-        FileOutputStream os = new ParcelFileDescriptor.AutoCloseOutputStream(fd);
-        byte[] buffer = new byte[4096];
-        int readSize;
+        Bitmap icon = BitmapFactory.decodeStream(avatarDataStream);
+        um.setUserIcon(userId, icon);
         try {
-            while ((readSize = avatarDataStream.read(buffer)) > 0) {
-                os.write(buffer, 0, readSize);
-            }
-            return true;
-        } catch (IOException ioe) {
-            Log.e("copyProfilePhoto", "Error copying profile photo " + ioe);
-        } finally {
-            try {
-                os.close();
-                avatarDataStream.close();
-            } catch (IOException ioe) { }
-        }
-        return false;
+            avatarDataStream.close();
+        } catch (IOException ioe) { }
+        return true;
     }
 
     public static String getMeProfileName(Context context) {
diff --git a/src/com/android/settings/users/UserSettings.java b/src/com/android/settings/users/UserSettings.java
index 3c7addc..079996e 100644
--- a/src/com/android/settings/users/UserSettings.java
+++ b/src/com/android/settings/users/UserSettings.java
@@ -30,6 +30,7 @@
 import android.graphics.Bitmap;
 import android.graphics.BitmapFactory;
 import android.graphics.Bitmap.CompressFormat;
+import android.graphics.drawable.BitmapDrawable;
 import android.graphics.drawable.Drawable;
 import android.net.Uri;
 import android.os.AsyncTask;
@@ -50,6 +51,7 @@
 import android.provider.ContactsContract.CommonDataKinds.Phone;
 import android.text.InputType;
 import android.util.Log;
+import android.util.SparseArray;
 import android.view.Menu;
 import android.view.MenuInflater;
 import android.view.MenuItem;
@@ -65,6 +67,7 @@
 import java.io.FileOutputStream;
 import java.io.IOException;
 import java.io.InputStream;
+import java.util.ArrayList;
 import java.util.List;
 
 public class UserSettings extends SettingsPreferenceFragment
@@ -111,6 +114,7 @@
 
     private final Object mUserLock = new Object();
     private UserManager mUserManager;
+    private SparseArray<Drawable> mUserIcons = new SparseArray<Drawable>();
 
     private Handler mHandler = new Handler() {
         @Override
@@ -127,9 +131,16 @@
     };
 
     private BroadcastReceiver mUserChangeReceiver = new BroadcastReceiver() {
-
         @Override
         public void onReceive(Context context, Intent intent) {
+            if (intent.getAction().equals(Intent.ACTION_USER_REMOVED)) {
+                mRemovingUserId = -1;
+            } else if (intent.getAction().equals(Intent.ACTION_USER_INFO_CHANGED)) {
+                int userHandle = intent.getIntExtra(Intent.EXTRA_USER_HANDLE, -1);
+                if (userHandle != -1) {
+                    mUserIcons.remove(userHandle);
+                }
+            }
             mHandler.sendEmptyMessage(MESSAGE_UPDATE_LIST);
         }
     };
@@ -151,8 +162,10 @@
                 InputType.TYPE_TEXT_VARIATION_NORMAL | InputType.TYPE_TEXT_FLAG_CAP_WORDS);
         loadProfile();
         setHasOptionsMenu(true);
-        getActivity().registerReceiver(mUserChangeReceiver,
-                new IntentFilter(Intent.ACTION_USER_REMOVED));
+        IntentFilter filter = new IntentFilter(Intent.ACTION_USER_REMOVED);
+        filter.addAction(Intent.ACTION_USER_INFO_CHANGED);
+        getActivity().registerReceiverAsUser(mUserChangeReceiver, UserHandle.ALL, filter, null,
+                mHandler);
     }
 
     @Override
@@ -181,6 +194,7 @@
             removeThisUser.setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM
                     | MenuItem.SHOW_AS_ACTION_WITH_TEXT);
         }
+        super.onCreateOptionsMenu(menu, inflater);
     }
 
     @Override
@@ -219,7 +233,13 @@
 
     private void finishLoadProfile(String profileName) {
         mMePreference.setTitle(profileName);
-        setPhotoId(mMePreference, mUserManager.getUserInfo(UserHandle.myUserId()));
+        int myUserId = UserHandle.myUserId();
+        Bitmap b = mUserManager.getUserIcon(myUserId);
+        if (b != null) {
+            Drawable d = new BitmapDrawable(b);
+            mMePreference.setIcon(d);
+            mUserIcons.put(myUserId, d);
+        }
     }
 
     private void onAddUserClicked() {
@@ -302,10 +322,8 @@
             new Thread() {
                 public void run() {
                     synchronized (mUserLock) {
-                        // TODO: Show some progress while removing the user
                         mUserManager.removeUser(mRemovingUserId);
                         mHandler.sendEmptyMessage(MESSAGE_UPDATE_LIST);
-                        mRemovingUserId = -1;
                     }
                 }
             }.start();
@@ -354,14 +372,18 @@
     }
 
     private void updateUserList() {
+        if (getActivity() == null) return;
         List<UserInfo> users = mUserManager.getUsers();
 
         mUserListCategory.removeAll();
         mUserListCategory.setOrderingAsAdded(false);
 
+        final ArrayList<Integer> missingIcons = new ArrayList<Integer>();
         for (UserInfo user : users) {
             Preference pref;
-            if (user.id == UserHandle.myUserId()) {
+            if (user.id == mRemovingUserId) {
+                continue;
+            } else if (user.id == UserHandle.myUserId()) {
                 pref = mMePreference;
                 mNicknamePreference.setText(user.name);
                 mNicknamePreference.setSummary(user.name);
@@ -377,7 +399,12 @@
                 pref.setTitle(user.name);
             }
             if (user.iconPath != null) {
-                setPhotoId(pref, user);
+                if (mUserIcons.get(user.id) == null) {
+                    missingIcons.add(user.id);
+                    pref.setIcon(R.drawable.ic_user);
+                } else {
+                    setPhotoId(pref, user);
+                }
             }
         }
         // Add a temporary entry for the user being created
@@ -391,8 +418,33 @@
             mUserListCategory.addPreference(pref);
         }
         getActivity().invalidateOptionsMenu();
+
+        // Load the icons
+        if (missingIcons.size() > 0) {
+            loadIconsAsync(missingIcons);
+        }
     }
 
+    private void loadIconsAsync(List<Integer> missingIcons) {
+        new AsyncTask<List<Integer>, Void, Void>() {
+            @Override
+            protected void onPostExecute(Void result) {
+                updateUserList();
+            }
+
+            @Override
+            protected Void doInBackground(List<Integer>... values) {
+                if (getActivity() == null) return null;
+                for (int userId : values[0]) {
+                    Bitmap bitmap = mUserManager.getUserIcon(userId);
+                    Drawable d = new BitmapDrawable(getResources(), bitmap);
+                    mUserIcons.append(userId, d);
+                }
+                return null;
+            }
+        }.execute(missingIcons);
+
+    }
     private void assignProfilePhoto(final UserInfo user) {
         if (!Utils.copyMeProfilePhoto(getActivity(), user)) {
             assignDefaultPhoto(user);
@@ -410,17 +462,13 @@
     private void assignDefaultPhoto(UserInfo user) {
         Bitmap bitmap = BitmapFactory.decodeResource(getResources(),
                 USER_DRAWABLES[user.id % USER_DRAWABLES.length]);
-        ParcelFileDescriptor fd = mUserManager.setUserIcon(user.id);
-        if (fd != null) {
-            bitmap.compress(CompressFormat.PNG, 100,
-                    new ParcelFileDescriptor.AutoCloseOutputStream(fd));
-        }
+        mUserManager.setUserIcon(user.id, bitmap);
     }
 
     private void setPhotoId(Preference pref, UserInfo user) {
-        Drawable icon = UserUtils.getUserIcon(mUserManager, user);
-        if (icon != null) {
-            pref.setIcon(icon);
+        Drawable d = mUserIcons.get(user.id); // UserUtils.getUserIcon(mUserManager, user);
+        if (d != null) {
+            pref.setIcon(d);
         }
     }
 
@@ -477,4 +525,8 @@
         return false;
     }
 
+    @Override
+    public int getHelpResource() {
+        return R.string.help_url_users;
+    }
 }
diff --git a/src/com/android/settings/users/UserUtils.java b/src/com/android/settings/users/UserUtils.java
index 19b9c84..433cbd3 100644
--- a/src/com/android/settings/users/UserUtils.java
+++ b/src/com/android/settings/users/UserUtils.java
@@ -17,6 +17,8 @@
 package com.android.settings.users;
 
 import android.content.pm.UserInfo;
+import android.graphics.Bitmap;
+import android.graphics.drawable.BitmapDrawable;
 import android.graphics.drawable.Drawable;
 import android.os.ParcelFileDescriptor;
 import android.os.UserManager;
@@ -25,10 +27,8 @@
 
     public static Drawable getUserIcon(UserManager um, UserInfo user) {
         if (user.iconPath == null) return null;
-        ParcelFileDescriptor fd = um.getUserIcon(user.id);
-        if (fd == null) return null;
-        Drawable d = Drawable.createFromStream(new ParcelFileDescriptor.AutoCloseInputStream(fd),
-                user.iconPath);
-        return d;
+        Bitmap icon = um.getUserIcon(user.id);
+        if (icon == null) return null;
+        return new BitmapDrawable(icon);
     }
 }
