diff --git a/src/com/android/settings/SettingsPreferenceFragment.java b/src/com/android/settings/SettingsPreferenceFragment.java
index a5f021f..c0440c8 100644
--- a/src/com/android/settings/SettingsPreferenceFragment.java
+++ b/src/com/android/settings/SettingsPreferenceFragment.java
@@ -182,6 +182,10 @@
         }
     }
 
+    public void onDialogShowing() {
+        // override in subclass to attach a dismiss listener, for instance
+    }
+
     public static class SettingsDialogFragment extends DialogFragment {
         private static final String KEY_DIALOG_ID = "key_dialog_id";
         private static final String KEY_PARENT_FRAGMENT_ID = "key_parent_fragment_id";
@@ -216,6 +220,15 @@
         }
 
         @Override
+        public void onStart() {
+            super.onStart();
+
+            if (mParentFragment != null && mParentFragment instanceof SettingsPreferenceFragment) {
+                ((SettingsPreferenceFragment) mParentFragment).onDialogShowing();
+            }
+        }
+
+        @Override
         public Dialog onCreateDialog(Bundle savedInstanceState) {
             if (savedInstanceState != null) {
                 mDialogId = savedInstanceState.getInt(KEY_DIALOG_ID, 0);
diff --git a/src/com/android/settings/SoundSettings.java b/src/com/android/settings/SoundSettings.java
index 814ea46..83e4fa3 100644
--- a/src/com/android/settings/SoundSettings.java
+++ b/src/com/android/settings/SoundSettings.java
@@ -170,8 +170,11 @@
 
         Vibrator vibrator = (Vibrator) getSystemService(Context.VIBRATOR_SERVICE);
         if (vibrator == null || !vibrator.hasVibrator()) {
-            getPreferenceScreen().removePreference(mVibrateWhenRinging);
-            getPreferenceScreen().removePreference(mHapticFeedback);
+            removePreference(KEY_VIBRATE);
+            removePreference(KEY_HAPTIC_FEEDBACK);
+        }
+        if (!Utils.isVoiceCapable(getActivity())) {
+            removePreference(KEY_VIBRATE);
         }
 
         if (TelephonyManager.PHONE_TYPE_CDMA == activePhoneType) {
diff --git a/src/com/android/settings/users/UserSettings.java b/src/com/android/settings/users/UserSettings.java
index 33b4195..bcc70bd 100644
--- a/src/com/android/settings/users/UserSettings.java
+++ b/src/com/android/settings/users/UserSettings.java
@@ -56,6 +56,7 @@
 import com.android.settings.SelectableEditTextPreference;
 import com.android.settings.SettingsPreferenceFragment;
 import com.android.settings.Utils;
+import com.android.settings.SettingsPreferenceFragment.SettingsDialogFragment;
 
 import java.util.ArrayList;
 import java.util.List;
@@ -66,6 +67,11 @@
 
     private static final String TAG = "UserSettings";
 
+    /** UserId of the user being removed */
+    private static final String SAVE_REMOVING_USER = "removing_user";
+    /** UserId of the user that was just added */
+    private static final String SAVE_ADDING_USER = "adding_user";
+
     private static final String KEY_USER_NICKNAME = "user_nickname";
     private static final String KEY_USER_LIST = "user_list";
     private static final String KEY_USER_ME = "user_me";
@@ -140,6 +146,15 @@
     public void onCreate(Bundle icicle) {
         super.onCreate(icicle);
 
+        if (icicle != null) {
+            if (icicle.containsKey(SAVE_ADDING_USER)) {
+                mAddedUserId = icicle.getInt(SAVE_ADDING_USER);
+            }
+            if (icicle.containsKey(SAVE_REMOVING_USER)) {
+                mRemovingUserId = icicle.getInt(SAVE_REMOVING_USER);
+            }
+        }
+
         mUserManager = (UserManager) getActivity().getSystemService(Context.USER_SERVICE);
         addPreferencesFromResource(R.xml.user_settings);
         mUserListCategory = (PreferenceGroup) findPreference(KEY_USER_LIST);
@@ -180,6 +195,14 @@
     }
 
     @Override
+    public void onSaveInstanceState(Bundle outState) {
+        super.onSaveInstanceState(outState);
+
+        outState.putInt(SAVE_ADDING_USER, mAddedUserId);
+        outState.putInt(SAVE_REMOVING_USER, mRemovingUserId);
+    }
+
+    @Override
     public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
         if (mIsOwner) {
             if (UserManager.getMaxSupportedUsers() > mUserManager.getUsers(false).size()) {
@@ -245,7 +268,6 @@
         synchronized (mUserLock) {
             if (mRemovingUserId == -1 && !mAddingUser) {
                 showDialog(DIALOG_ADD_USER);
-                setOnDismissListener(this);
             }
         }
     }
@@ -255,7 +277,6 @@
             if (mRemovingUserId == -1 && !mAddingUser) {
                 mRemovingUserId = userId;
                 showDialog(DIALOG_CONFIRM_REMOVE);
-                setOnDismissListener(this);
             }
         }
     }
@@ -266,10 +287,17 @@
     }
 
     @Override
+    public void onDialogShowing() {
+        super.onDialogShowing();
+
+        setOnDismissListener(this);
+    }
+
+    @Override
     public Dialog onCreateDialog(int dialogId) {
         switch (dialogId) {
-            case DIALOG_CONFIRM_REMOVE:
-                return new AlertDialog.Builder(getActivity())
+            case DIALOG_CONFIRM_REMOVE: {
+                Dialog dlg = new AlertDialog.Builder(getActivity())
                     .setTitle(UserHandle.myUserId() == mRemovingUserId
                             ? R.string.user_confirm_remove_self_title
                             : R.string.user_confirm_remove_title)
@@ -284,12 +312,14 @@
                     })
                     .setNegativeButton(android.R.string.cancel, null)
                     .create();
+                return dlg;
+            }
             case DIALOG_USER_CANNOT_MANAGE:
                 return new AlertDialog.Builder(getActivity())
                     .setMessage(R.string.user_cannot_manage_message)
                     .setPositiveButton(android.R.string.ok, null)
                     .create();
-            case DIALOG_ADD_USER:
+            case DIALOG_ADD_USER: {
                 final SharedPreferences preferences = getActivity().getPreferences(
                         Context.MODE_PRIVATE);
                 final boolean longMessageDisplayed = preferences.getBoolean(
@@ -297,7 +327,7 @@
                 final int messageResId = longMessageDisplayed
                         ? R.string.user_add_user_message_short
                         : R.string.user_add_user_message_long;
-                return new AlertDialog.Builder(getActivity())
+                Dialog dlg = new AlertDialog.Builder(getActivity())
                 .setTitle(R.string.user_add_user_title)
                 .setMessage(messageResId)
                 .setPositiveButton(android.R.string.ok,
@@ -312,8 +342,10 @@
                 })
                 .setNegativeButton(android.R.string.cancel, null)
                 .create();
-            case DIALOG_SETUP_USER:
-                return new AlertDialog.Builder(getActivity())
+                return dlg;
+            }
+            case DIALOG_SETUP_USER: {
+                Dialog dlg = new AlertDialog.Builder(getActivity())
                 .setTitle(R.string.user_setup_dialog_title)
                 .setMessage(R.string.user_setup_dialog_message)
                 .setPositiveButton(R.string.user_setup_button_setup_now,
@@ -324,7 +356,8 @@
                 })
                 .setNegativeButton(R.string.user_setup_button_setup_later, null)
                 .create();
-
+                return dlg;
+            }
             default:
                 return null;
         }
@@ -396,9 +429,7 @@
         final ArrayList<Integer> missingIcons = new ArrayList<Integer>();
         for (UserInfo user : users) {
             Preference pref;
-            if (user.id == mRemovingUserId) {
-                continue;
-            } else if (user.id == UserHandle.myUserId()) {
+            if (user.id == UserHandle.myUserId()) {
                 pref = mMePreference;
                 mNicknamePreference.setText(user.name);
                 mNicknamePreference.setSummary(user.name);
@@ -544,6 +575,7 @@
         synchronized (mUserLock) {
             mAddingUser = false;
             mRemovingUserId = -1;
+            updateUserList();
         }
     }
 
