diff --git a/res/layout/user_dictionary_add_word.xml b/res/layout/user_dictionary_add_word.xml
index 7df97b7..4089299 100644
--- a/res/layout/user_dictionary_add_word.xml
+++ b/res/layout/user_dictionary_add_word.xml
@@ -37,62 +37,18 @@
           android:background="@android:color/holo_blue_light" />
   </LinearLayout>
 
-  <GridLayout android:id="@+id/user_dictionary_add_word_grid"
-              android:layout_width="match_parent"
-              android:layout_height="wrap_content"
-              android:layout_marginLeft="8dip"
-              android:layout_marginRight="8dip"
-              android:columnCount="2">
-    <TextView android:id="@+id/user_dictionary_add_word_label"
-              style="?android:attr/textAppearanceSmall"
-              android:layout_width="wrap_content"
-              android:layout_height="wrap_content"
-              android:layout_gravity="left|center_vertical"
-              android:text="@string/user_dict_settings_add_word_option_name"
-              android:visibility="gone" />
-    <EditText android:id="@+id/user_dictionary_add_word_text"
-              android:maxLength="@integer/maximum_user_dictionary_word_length"
-              android:layout_width="wrap_content"
-              android:layout_gravity="fill_horizontal|center_vertical"
-              android:layout_marginLeft="8dip"
-              android:layout_marginBottom="8dip"
-              android:layout_marginTop="8dip"
-              android:inputType="textNoSuggestions"
-              android:imeOptions="flagNoFullscreen">
-      <requestFocus />
-    </EditText>
-    <TextView android:id="@+id/user_dictionary_add_shortcut_label"
-              style="?android:attr/textAppearanceSmall"
-              android:layout_width="wrap_content"
-              android:layout_height="wrap_content"
-              android:layout_gravity="left|center_vertical"
-              android:text="@string/user_dict_settings_add_shortcut_option_name"
-              android:visibility="gone" />
-    <EditText android:id="@+id/user_dictionary_settings_add_dialog_shortcut"
-              android:maxLength="@integer/maximum_user_dictionary_word_length"
-              android:layout_width="wrap_content"
-              android:layout_gravity="fill_horizontal|center_vertical"
-              android:layout_marginLeft="8dip"
-              android:layout_marginBottom="8dip"
-              android:layout_marginTop="8dip"
-              android:inputType="textNoSuggestions"
-              android:imeOptions="flagNoFullscreen"
-              android:visibility="gone" />
-    <TextView android:id="@+id/user_dictionary_add_locale_label"
-              style="?android:attr/textAppearanceSmall"
-              android:layout_width="wrap_content"
-              android:layout_height="wrap_content"
-              android:layout_gravity="left|center_vertical"
-              android:text="@string/user_dict_settings_add_locale_option_name"
-              android:visibility="gone" />
-    <Spinner  android:id="@+id/user_dictionary_settings_add_dialog_locale"
-              android:layout_marginLeft="8dip"
-              android:layout_marginBottom="8dip"
-              android:layout_marginTop="8dip"
-              android:layout_width="wrap_content"
-              android:layout_gravity="fill_horizontal|center_vertical"
-              android:visibility="gone" />
-    </GridLayout>
+  <EditText android:id="@+id/user_dictionary_add_word_text"
+            android:maxLength="@integer/maximum_user_dictionary_word_length"
+            android:layout_height="match_parent"
+            android:layout_width="match_parent"
+            android:layout_gravity="fill_horizontal|center_vertical"
+            android:layout_marginLeft="8dip"
+            android:layout_marginBottom="8dip"
+            android:layout_marginTop="8dip"
+            android:inputType="textNoSuggestions"
+            android:imeOptions="flagNoFullscreen">
+    <requestFocus />
+  </EditText>
 
   <LinearLayout android:layout_width="match_parent"
                 android:layout_height="wrap_content"
@@ -114,27 +70,6 @@
               android:text="@string/cancel"
               android:layout_height="wrap_content"
               android:onClick="onClickCancel" />
-      <Button android:id="@+id/user_dictionary_settings_add_dialog_more_options"
-              android:layout_width="0dip"
-              android:layout_gravity="center_horizontal"
-              android:layout_weight="1"
-              android:maxLines="2"
-              style="?android:attr/buttonBarButtonStyle"
-              android:textSize="14sp"
-              android:text="@string/user_dict_settings_add_dialog_more_options"
-              android:layout_height="wrap_content"
-              android:onClick="onClickMoreOptions" />
-      <Button android:id="@+id/user_dictionary_settings_add_dialog_less_options"
-              android:layout_width="0dip"
-              android:layout_gravity="center_horizontal"
-              android:layout_weight="1"
-              android:maxLines="2"
-              style="?android:attr/buttonBarButtonStyle"
-              android:textSize="14sp"
-              android:text="@string/user_dict_settings_add_dialog_less_options"
-              android:layout_height="wrap_content"
-              android:visibility="gone"
-              android:onClick="onClickLessOptions" />
       <Button android:layout_width="0dip"
               android:layout_gravity="right"
               android:layout_weight="1"
diff --git a/res/layout/user_dictionary_add_word_fullscreen.xml b/res/layout/user_dictionary_add_word_fullscreen.xml
index 9e2617b..c0f3f53 100644
--- a/res/layout/user_dictionary_add_word_fullscreen.xml
+++ b/res/layout/user_dictionary_add_word_fullscreen.xml
@@ -49,7 +49,7 @@
               android:layout_height="wrap_content"
               android:layout_gravity="left|center_vertical"
               android:text="@string/user_dict_settings_add_shortcut_option_name" />
-    <EditText android:id="@+id/user_dictionary_settings_add_dialog_shortcut"
+    <EditText android:id="@+id/user_dictionary_add_shortcut"
               android:maxLength="@integer/maximum_user_dictionary_word_length"
               android:layout_width="wrap_content"
               android:layout_gravity="fill_horizontal|center_vertical"
@@ -64,7 +64,7 @@
               android:layout_height="wrap_content"
               android:layout_gravity="left|center_vertical"
               android:text="@string/user_dict_settings_add_locale_option_name" />
-    <Spinner  android:id="@+id/user_dictionary_settings_add_dialog_locale"
+    <Spinner  android:id="@+id/user_dictionary_add_locale"
               android:layout_marginLeft="8dip"
               android:layout_marginBottom="8dip"
               android:layout_marginTop="8dip"
diff --git a/res/layout/user_dictionary_item.xml b/res/layout/user_dictionary_item.xml
index aaf3cbd..749986e 100644
--- a/res/layout/user_dictionary_item.xml
+++ b/res/layout/user_dictionary_item.xml
@@ -15,36 +15,38 @@
 -->
 
 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
-        android:layout_width="match_parent"
-        android:layout_height="wrap_content"
-        android:orientation="horizontal">
+    android:layout_width="match_parent"
+    android:layout_height="wrap_content"
+    android:minHeight="?android:attr/listPreferredItemHeight"
+    android:gravity="center_vertical"
+    android:paddingRight="?android:attr/scrollbarSize"
+    android:background="?android:attr/selectableItemBackground" >
 
-    <TextView
-            android:id="@android:id/text1"
-            android:layout_width="wrap_content"
-            android:layout_height="wrap_content"
-            android:layout_weight="1"
-            android:textAppearance="?android:attr/textAppearanceMedium"
-            android:gravity="center_vertical"
-            android:paddingLeft="16dip"
-            android:minHeight="?android:attr/listPreferredItemHeight"/>
+  <RelativeLayout android:layout_width="wrap_content"
+                  android:layout_height="wrap_content"
+                  android:layout_marginLeft="15dip"
+                  android:layout_marginRight="6dip"
+                  android:layout_marginTop="6dip"
+                  android:layout_marginBottom="6dip"
+                  android:layout_weight="1">
 
-    <ImageView
-            android:id="@+id/divider"
-            android:layout_width="wrap_content"
-            android:layout_height="match_parent"
-            android:layout_gravity="center"
-            android:layout_marginLeft="8dip"
-            android:src="@drawable/nav_divider"
-        />
+    <TextView android:id="@+android:id/text1"
+              android:layout_width="wrap_content"
+              android:layout_height="wrap_content"
+              android:singleLine="true"
+              android:textAppearance="?android:attr/textAppearanceMedium"
+              android:ellipsize="marquee"
+              android:fadingEdge="horizontal" />
 
-    <ImageView
-            android:id="@+id/delete_button"
-            android:layout_width="wrap_content"
-            android:layout_height="wrap_content"
-            android:layout_gravity="center"
-            android:padding="8dip"
-            android:src="@drawable/ic_item_delete"
-            android:background="?android:attr/selectableItemBackground"
-        />
+    <TextView android:id="@+android:id/text2"
+              android:layout_width="wrap_content"
+              android:layout_height="wrap_content"
+              android:layout_below="@android:id/text1"
+              android:layout_alignLeft="@android:id/text1"
+              android:textAppearance="?android:attr/textAppearanceSmall"
+              android:textColor="?android:attr/textColorSecondary"
+              android:maxLines="1" />
+
+  </RelativeLayout>
+
 </LinearLayout>
diff --git a/res/values/strings.xml b/res/values/strings.xml
index 92a3a9d..1380386 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -1591,6 +1591,9 @@
     <string name="volume_notification_description">Notifications</string>
     <!-- Volume description for alarm volume -->
     <string name="volume_alarm_description">Alarms</string>
+    <!-- Sound settings screen, setting option name checkbox. About vibration setting
+         during incoming calls. [CHAR LIMIT=30] -->
+    <string name="vibrate_when_ringing_title">Vibrate when ringing</string>
 
     <!-- Dock settings title, top level -->
     <string name="dock_settings">Dock</string>
@@ -2768,12 +2771,6 @@
     <string name="enable_adb">USB debugging</string>
     <!-- Setting checkbox summary for Whether to enable USB debugging support on the phone -->
     <string name="enable_adb_summary">Debug mode when USB is connected</string>
-    <!-- Development settings: title for the field that shows the "App ID" development identifier
-         for this device. [CHAR LIMIT=40] -->
-    <string name="verifier_device_identifier">Development device ID</string>
-    <!-- Development settings: a string to show when the "App ID" development identifier for this
-         device cannot be read from internal settings. [CHAR LIMIT=60] -->
-    <string name="verifier_device_identifier_not_available">Device information not available</string>
     <!-- Setting Checkbox title whether to keep the screen on when plugged in to a power source -->
     <string name="keep_screen_on">Stay awake</string>
     <!-- setting Checkbox summary whether to keep the screen on when plugged in  -->
@@ -3576,8 +3573,14 @@
     <string name="wait_for_debugger_summary">Debugged application waits for debugger to
             attach before executing</string>
 
-    <!-- Preference category for user interface debugging development settings. [CHAR LIMIT=25] -->
-    <string name="debug_ui_category">User interface</string>
+    <!-- Preference category for input debugging development settings. [CHAR LIMIT=25] -->
+    <string name="debug_input_category">Input</string>
+
+    <!-- Preference category for drawing debugging development settings. [CHAR LIMIT=25] -->
+    <string name="debug_drawing_category">Drawing</string>
+
+    <!-- Preference category for monitoring debugging development settings. [CHAR LIMIT=25] -->
+    <string name="debug_monitoring_category">Monitoring</string>
 
     <!-- UI debug setting: always enable strict mode? [CHAR LIMIT=25] -->
     <string name="strict_mode">Strict mode enabled</string>
@@ -3595,20 +3598,32 @@
     <!-- UI debug setting: show touches location summary [CHAR LIMIT=50] -->
     <string name="show_touches_summary">Show visual feedback for touches</string>
 
-    <!-- UI debug setting: show where screen updates happen? [CHAR LIMIT=25] -->
-    <string name="show_screen_updates">Show screen updates</string>
-    <!-- UI debug setting: show screen updates summary [CHAR LIMIT=50] -->
-    <string name="show_screen_updates_summary">Flash areas of screen when they update</string>
+    <!-- UI debug setting: show where surface updates happen? [CHAR LIMIT=25] -->
+    <string name="show_screen_updates">Show surface updates</string>
+    <!-- UI debug setting: show surface updates summary [CHAR LIMIT=50] -->
+    <string name="show_screen_updates_summary">Flash entire window surfaces when they update</string>
 
-    <!-- UI debug setting: show where screen updates happen with GPU rendering? [CHAR LIMIT=25] -->
-    <string name="show_hw_screen_updates">Show GPU screen updates</string>
+    <!-- UI debug setting: show where window updates happen with GPU rendering? [CHAR LIMIT=25] -->
+    <string name="show_hw_screen_updates">Show GPU view updates</string>
     <!-- UI debug setting: show GPU rendering screen updates summary [CHAR LIMIT=50] -->
-    <string name="show_hw_screen_updates_summary">Flash areas of screen when they update with the GPU</string>
+    <string name="show_hw_screen_updates_summary">Flash views inside windows when drawn with the GPU</string>
 
     <!-- UI debug setting: disable use of overlays? [CHAR LIMIT=25] -->
-    <string name="disable_overlays">Disable overlays</string>
+    <string name="disable_overlays">Disable HW overlays</string>
     <!-- UI debug setting: disable use of overlays summary [CHAR LIMIT=50] -->
-    <string name="disable_overlays_summary">Don\'t use overlays for screen compositing</string>
+    <string name="disable_overlays_summary">Always use GPU for screen compositing</string>
+
+    <!-- UI debug setting: enable low-level traces? [CHAR LIMIT=25] -->
+    <string name="enable_traces_title">Enable traces</string>
+    <!-- UI debug setting: title for dialog to enable low-level traces [CHAR LIMIT=25] -->
+    <string name="enable_traces_dialog_title">Select enabled traces</string>
+
+    <!-- UI debug setting: enable low-level traces, none enabled summary [CHAR LIMIT=NONE] -->
+    <string name="enable_traces_summary_none">No traces currently enabled</string>
+    <!-- UI debug setting: enable low-level traces, some number enabled summary [CHAR LIMIT=NONE] -->
+    <string name="enable_traces_summary_num"><xliff:g id="num">%1$d</xliff:g> traces currently enabled</string>
+    <!-- UI debug setting: enable low-level traces, all enabled summary [CHAR LIMIT=NONE] -->
+    <string name="enable_traces_summary_all">All traces currently enabled</string>
 
     <!-- UI debug setting: show layout bounds information [CHAR LIMIT=25] -->
     <string name="debug_layout">Show layout bounds</string>
@@ -3623,7 +3638,7 @@
     <!-- UI debug setting: force hardware acceleration to render apps [CHAR LIMIT=25] -->
     <string name="force_hw_ui">Force GPU rendering</string>
     <!-- UI debug setting: force hardware acceleration summary [CHAR LIMIT=50] -->
-    <string name="force_hw_ui_summary">Use 2D hardware acceleration in applications</string>
+    <string name="force_hw_ui_summary">Force use of GPU for 2d drawing</string>
 
     <!-- UI debug setting: profile time taken by hardware acceleration to render apps [CHAR LIMIT=25] -->
     <string name="track_frame_time">Profile GPU rendering</string>
diff --git a/res/xml/development_prefs.xml b/res/xml/development_prefs.xml
index ab8aad3..9788864 100644
--- a/res/xml/development_prefs.xml
+++ b/res/xml/development_prefs.xml
@@ -16,14 +16,6 @@
 
 <PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"
         android:title="@string/development_settings_title">
-
-    <Preference
-        android:key="verifier_device_identifier"
-        style="?android:attr/preferenceInformationStyle"
-        android:title="@string/verifier_device_identifier"
-        android:summary="@string/verifier_device_identifier_not_available"
-        android:persistent="false" />
-
     <PreferenceScreen
             android:key="local_backup_password"
             android:title="@string/local_backup_password_title"
@@ -70,18 +62,8 @@
 
     </PreferenceCategory>
 
-    <PreferenceCategory android:key="debug_ui_category"
-            android:title="@string/debug_ui_category">
-
-        <CheckBoxPreference
-            android:key="strict_mode"
-            android:title="@string/strict_mode"
-            android:summary="@string/strict_mode_summary"/>
-
-        <CheckBoxPreference
-            android:key="pointer_location"
-            android:title="@string/pointer_location"
-            android:summary="@string/pointer_location_summary"/>
+    <PreferenceCategory android:key="debug_input_category"
+            android:title="@string/debug_input_category">
 
         <CheckBoxPreference
             android:key="show_touches"
@@ -89,39 +71,29 @@
             android:summary="@string/show_touches_summary"/>
 
         <CheckBoxPreference
+            android:key="pointer_location"
+            android:title="@string/pointer_location"
+            android:summary="@string/pointer_location_summary"/>
+
+    </PreferenceCategory>
+
+    <PreferenceCategory android:key="debug_drawing_category"
+            android:title="@string/debug_drawing_category">
+
+        <CheckBoxPreference
             android:key="debug_layout"
             android:title="@string/debug_layout"
             android:summary="@string/debug_layout_summary"/>
 
         <CheckBoxPreference
-            android:key="show_screen_updates"
-            android:title="@string/show_screen_updates"
-            android:summary="@string/show_screen_updates_summary"/>
-
-        <CheckBoxPreference
-            android:key="disable_overlays"
-            android:title="@string/disable_overlays"
-            android:summary="@string/disable_overlays_summary"/>
-
-        <CheckBoxPreference
-            android:key="show_cpu_usage"
-            android:title="@string/show_cpu_usage"
-            android:summary="@string/show_cpu_usage_summary"/>
-
-        <CheckBoxPreference
-            android:key="force_hw_ui"
-            android:title="@string/force_hw_ui"
-            android:summary="@string/force_hw_ui_summary"/>
-
-        <CheckBoxPreference
             android:key="show_hw_screen_udpates"
             android:title="@string/show_hw_screen_updates"
             android:summary="@string/show_hw_screen_updates_summary"/>
 
         <CheckBoxPreference
-            android:key="track_frame_time"
-            android:title="@string/track_frame_time"
-            android:summary="@string/track_frame_time_summary"/>
+            android:key="show_screen_updates"
+            android:title="@string/show_screen_updates"
+            android:summary="@string/show_screen_updates_summary"/>
 
         <ListPreference
             android:key="window_animation_scale"
@@ -144,6 +116,41 @@
             android:entries="@array/animator_duration_scale_entries"
             android:entryValues="@array/animator_duration_scale_values" />
 
+        <CheckBoxPreference
+            android:key="disable_overlays"
+            android:title="@string/disable_overlays"
+            android:summary="@string/disable_overlays_summary"/>
+
+        <CheckBoxPreference
+            android:key="force_hw_ui"
+            android:title="@string/force_hw_ui"
+            android:summary="@string/force_hw_ui_summary"/>
+
+    </PreferenceCategory>
+
+    <PreferenceCategory android:key="debug_monitoring_category"
+            android:title="@string/debug_monitoring_category">
+
+        <CheckBoxPreference
+            android:key="strict_mode"
+            android:title="@string/strict_mode"
+            android:summary="@string/strict_mode_summary"/>
+
+        <CheckBoxPreference
+            android:key="show_cpu_usage"
+            android:title="@string/show_cpu_usage"
+            android:summary="@string/show_cpu_usage_summary"/>
+
+        <CheckBoxPreference
+            android:key="track_frame_time"
+            android:title="@string/track_frame_time"
+            android:summary="@string/track_frame_time_summary"/>
+
+        <MultiCheckPreference
+            android:key="enable_traces"
+            android:title="@string/enable_traces_title"
+            android:dialogTitle="@string/enable_traces_dialog_title" />
+
     </PreferenceCategory>
 
     <PreferenceCategory android:key="debug_applications_category"
diff --git a/res/xml/sound_settings.xml b/res/xml/sound_settings.xml
index d7c692f..e9c9a61 100644
--- a/res/xml/sound_settings.xml
+++ b/res/xml/sound_settings.xml
@@ -58,6 +58,11 @@
             android:persistent="false"
             android:ringtoneType="notification" />
 
+    <CheckBoxPreference
+         android:key="vibrate_when_ringing"
+         android:title="@string/vibrate_when_ringing_title"
+         android:persistent="false" />
+
     <PreferenceCategory
             android:title="@string/sound_category_feedback_title"/>
 
diff --git a/src/com/android/settings/CryptKeeper.java b/src/com/android/settings/CryptKeeper.java
index 10c067d..1cb12f3 100644
--- a/src/com/android/settings/CryptKeeper.java
+++ b/src/com/android/settings/CryptKeeper.java
@@ -35,11 +35,16 @@
 import android.os.storage.IMountService;
 import android.provider.Settings;
 import android.telephony.TelephonyManager;
+import android.text.Editable;
 import android.text.TextUtils;
+import android.text.TextWatcher;
 import android.util.Log;
 import android.view.KeyEvent;
+import android.view.MotionEvent;
 import android.view.View;
 import android.view.View.OnClickListener;
+import android.view.View.OnKeyListener;
+import android.view.View.OnTouchListener;
 import android.view.inputmethod.EditorInfo;
 import android.view.inputmethod.InputMethodInfo;
 import android.view.inputmethod.InputMethodManager;
@@ -67,7 +72,8 @@
  *     -n com.android.settings/.CryptKeeper
  * </pre>
  */
-public class CryptKeeper extends Activity implements TextView.OnEditorActionListener {
+public class CryptKeeper extends Activity implements TextView.OnEditorActionListener,
+        OnKeyListener, OnTouchListener, TextWatcher {
     private static final String TAG = "CryptKeeper";
 
     private static final String DECRYPT_STATE = "trigger_restart_framework";
@@ -103,6 +109,8 @@
     private int mCooldown;
     PowerManager.WakeLock mWakeLock;
     private EditText mPasswordEntry;
+    /** Number of calls to {@link #notifyUser()} to ignore before notifying. */
+    private int mNotificationCountdown = 0;
 
     /**
      * Used to propagate state through configuration changes (e.g. screen rotation)
@@ -236,8 +244,11 @@
      * Notify the user that we are awaiting input. Currently this sends an audio alert.
      */
     private void notifyUser() {
-        Log.d(TAG, "Notifying user that we are waiting for input...");
-        if (mAudioManager != null) {
+        if (mNotificationCountdown > 0) {
+            Log.d(TAG, "Counting down to notify user..." + mNotificationCountdown);
+            --mNotificationCountdown;
+        } else if (mAudioManager != null) {
+            Log.d(TAG, "Notifying user that we are waiting for input...");
             try {
                 // Play the standard keypress sound at full volume. This should be available on
                 // every device. We cannot play a ringtone here because media services aren't
@@ -478,6 +489,10 @@
         mPasswordEntry = (EditText) findViewById(R.id.passwordEntry);
         mPasswordEntry.setOnEditorActionListener(this);
         mPasswordEntry.requestFocus();
+        // Become quiet when the user interacts with the Edit text screen.
+        mPasswordEntry.setOnKeyListener(this);
+        mPasswordEntry.setOnTouchListener(this);
+        mPasswordEntry.addTextChangedListener(this);
 
         // Disable the Emergency call button if the device has no voice telephone capability
         final TelephonyManager tm = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);
@@ -522,9 +537,9 @@
         }, 0);
 
         updateEmergencyCallButtonState();
-        // Notify the user in 30 seconds that we are waiting for him to enter the password.
+        // Notify the user in 120 seconds that we are waiting for him to enter the password.
         mHandler.removeMessages(MESSAGE_NOTIFY);
-        mHandler.sendEmptyMessageDelayed(MESSAGE_NOTIFY, 30 * 1000);
+        mHandler.sendEmptyMessageDelayed(MESSAGE_NOTIFY, 120 * 1000);
     }
 
     /**
@@ -706,4 +721,39 @@
                         | Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS);
         startActivity(intent);
     }
+
+    /**
+     * Listen to key events so we can disable sounds when we get a keyinput in EditText.
+     */
+    private void delayAudioNotification() {
+        Log.d(TAG, "User entering password: delay audio notification");
+        mNotificationCountdown = 20;
+    }
+
+    @Override
+    public boolean onKey(View v, int keyCode, KeyEvent event) {
+        delayAudioNotification();
+        return false;
+    }
+
+    @Override
+    public boolean onTouch(View v, MotionEvent event) {
+        delayAudioNotification();
+        return false;
+    }
+
+    @Override
+    public void beforeTextChanged(CharSequence s, int start, int count, int after) {
+        return;
+    }
+
+    @Override
+    public void onTextChanged(CharSequence s, int start, int before, int count) {
+        delayAudioNotification();
+    }
+
+    @Override
+    public void afterTextChanged(Editable s) {
+        return;
+    }
 }
diff --git a/src/com/android/settings/DevelopmentSettings.java b/src/com/android/settings/DevelopmentSettings.java
index d32cbc7..fc5a0b6 100644
--- a/src/com/android/settings/DevelopmentSettings.java
+++ b/src/com/android/settings/DevelopmentSettings.java
@@ -30,7 +30,6 @@
 import android.content.Intent;
 import android.content.pm.ApplicationInfo;
 import android.content.pm.PackageManager;
-import android.content.pm.VerifierDeviceIdentity;
 import android.os.BatteryManager;
 import android.os.Build;
 import android.os.Bundle;
@@ -40,8 +39,10 @@
 import android.os.ServiceManager;
 import android.os.StrictMode;
 import android.os.SystemProperties;
+import android.os.Trace;
 import android.preference.CheckBoxPreference;
 import android.preference.ListPreference;
+import android.preference.MultiCheckPreference;
 import android.preference.Preference;
 import android.preference.PreferenceFragment;
 import android.preference.PreferenceScreen;
@@ -63,8 +64,6 @@
                 OnPreferenceChangeListener, CompoundButton.OnCheckedChangeListener {
 
     private static final String ENABLE_ADB = "enable_adb";
-
-    private static final String VERIFIER_DEVICE_IDENTIFIER = "verifier_device_identifier";
     private static final String KEEP_SCREEN_ON = "keep_screen_on";
     private static final String ALLOW_MOCK_LOCATION = "allow_mock_location";
     private static final String HDCP_CHECKING_KEY = "hdcp_checking";
@@ -88,6 +87,8 @@
     private static final String TRANSITION_ANIMATION_SCALE_KEY = "transition_animation_scale";
     private static final String ANIMATOR_DURATION_SCALE_KEY = "animator_duration_scale";
 
+    private static final String ENABLE_TRACES_KEY = "enable_traces";
+
     private static final String IMMEDIATELY_DESTROY_ACTIVITIES_KEY
             = "immediately_destroy_activities";
     private static final String APP_PROCESS_LIMIT_KEY = "app_process_limit";
@@ -101,6 +102,7 @@
 
     private Switch mEnabledSwitch;
     private boolean mLastEnabledState;
+    private boolean mHaveDebugSettings;
 
     private CheckBoxPreference mEnableAdb;
     private CheckBoxPreference mKeepScreenOn;
@@ -124,6 +126,7 @@
     private ListPreference mWindowAnimationScale;
     private ListPreference mTransitionAnimationScale;
     private ListPreference mAnimatorDurationScale;
+    private MultiCheckPreference mEnableTracesPref;
 
     private CheckBoxPreference mImmediatelyDestroyActivities;
     private ListPreference mAppProcessLimit;
@@ -177,6 +180,15 @@
         mAnimatorDurationScale = (ListPreference) findPreference(ANIMATOR_DURATION_SCALE_KEY);
         mAllPrefs.add(mAnimatorDurationScale);
         mAnimatorDurationScale.setOnPreferenceChangeListener(this);
+        mEnableTracesPref = (MultiCheckPreference)findPreference(ENABLE_TRACES_KEY);
+        String[] traceValues = new String[Trace.TRACE_TAGS.length];
+        for (int i=Trace.TRACE_FLAGS_START_BIT; i<traceValues.length; i++) {
+            traceValues[i] = Integer.toString(1<<i);
+        }
+        mEnableTracesPref.setEntries(Trace.TRACE_TAGS);
+        mEnableTracesPref.setEntryValues(traceValues);
+        mAllPrefs.add(mEnableTracesPref);
+        mEnableTracesPref.setOnPreferenceChangeListener(this);
 
         mImmediatelyDestroyActivities = (CheckBoxPreference) findPreference(
                 IMMEDIATELY_DESTROY_ACTIVITIES_KEY);
@@ -191,13 +203,6 @@
         mAllPrefs.add(mShowAllANRs);
         mResetCbPrefs.add(mShowAllANRs);
 
-        final Preference verifierDeviceIdentifier = findPreference(VERIFIER_DEVICE_IDENTIFIER);
-        final PackageManager pm = getActivity().getPackageManager();
-        final VerifierDeviceIdentity verifierIndentity = pm.getVerifierDeviceIdentity();
-        if (verifierIndentity != null) {
-            verifierDeviceIdentifier.setSummary(verifierIndentity.toString());
-        }
-
         Preference hdcpChecking = findPreference(HDCP_CHECKING_KEY);
         if (hdcpChecking != null) {
             mAllPrefs.add(hdcpChecking);
@@ -275,15 +280,32 @@
                 Settings.Secure.DEVELOPMENT_SETTINGS_ENABLED, 0) != 0;
         mEnabledSwitch.setChecked(mLastEnabledState);
         setPrefsEnabledState(mLastEnabledState);
+
+        if (mHaveDebugSettings && !mLastEnabledState) {
+            // Overall debugging is disabled, but there are some debug
+            // settings that are enabled.  This is an invalid state.  Switch
+            // to debug settings being enabled, so the user knows there is
+            // stuff enabled and can turn it all off if they want.
+            Settings.Secure.putInt(getActivity().getContentResolver(),
+                    Settings.Secure.DEVELOPMENT_SETTINGS_ENABLED, 1);
+            mLastEnabledState = true;
+            setPrefsEnabledState(mLastEnabledState);
+        }
+    }
+
+    void updateCheckBox(CheckBoxPreference checkBox, boolean value) {
+        checkBox.setChecked(value);
+        mHaveDebugSettings |= value;
     }
 
     private void updateAllOptions() {
         final ContentResolver cr = getActivity().getContentResolver();
-        mEnableAdb.setChecked(Settings.Secure.getInt(cr,
+        mHaveDebugSettings = false;
+        updateCheckBox(mEnableAdb, Settings.Secure.getInt(cr,
                 Settings.Secure.ADB_ENABLED, 0) != 0);
-        mKeepScreenOn.setChecked(Settings.System.getInt(cr,
+        updateCheckBox(mKeepScreenOn, Settings.System.getInt(cr,
                 Settings.System.STAY_ON_WHILE_PLUGGED_IN, 0) != 0);
-        mAllowMockLocation.setChecked(Settings.Secure.getInt(cr,
+        updateCheckBox(mAllowMockLocation, Settings.Secure.getInt(cr,
                 Settings.Secure.ALLOW_MOCK_LOCATION, 0) != 0);
         updateHdcpValues();
         updatePasswordSummary();
@@ -298,6 +320,7 @@
         updateShowHwScreenUpdatesOptions();
         updateDebugLayoutOptions();
         updateAnimationScaleOptions();
+        updateEnableTracesOptions();
         updateImmediatelyDestroyActivitiesOptions();
         updateAppProcessLimitOptions();
         updateShowAllANRsOptions();
@@ -315,7 +338,9 @@
         writeAnimationScaleOption(0, mWindowAnimationScale, null);
         writeAnimationScaleOption(1, mTransitionAnimationScale, null);
         writeAnimationScaleOption(2, mAnimatorDurationScale, null);
+        writeEnableTracesOptions(0);
         writeAppProcessLimitOptions(null);
+        mHaveDebugSettings = false;
         updateAllOptions();
     }
 
@@ -369,7 +394,7 @@
     private void updateDebuggerOptions() {
         mDebugApp = Settings.System.getString(
                 getActivity().getContentResolver(), Settings.System.DEBUG_APP);
-        mWaitForDebugger.setChecked(Settings.System.getInt(
+        updateCheckBox(mWaitForDebugger, Settings.System.getInt(
                 getActivity().getContentResolver(), Settings.System.WAIT_FOR_DEBUGGER, 0) != 0);
         if (mDebugApp != null && mDebugApp.length() > 0) {
             String label;
@@ -383,6 +408,7 @@
             }
             mDebugAppPref.setSummary(getResources().getString(R.string.debug_app_set, label));
             mWaitForDebugger.setEnabled(true);
+            mHaveDebugSettings = true;
         } else {
             mDebugAppPref.setSummary(getResources().getString(R.string.debug_app_not_set));
             mWaitForDebugger.setEnabled(false);
@@ -411,7 +437,7 @@
     }
 
     private void updateStrictModeVisualOptions() {
-        mStrictMode.setChecked(currentStrictModeActiveIndex() == 1);
+        updateCheckBox(mStrictMode, currentStrictModeActiveIndex() == 1);
     }
 
     private void writePointerLocationOptions() {
@@ -420,7 +446,7 @@
     }
 
     private void updatePointerLocationOptions() {
-        mPointerLocation.setChecked(Settings.System.getInt(getActivity().getContentResolver(),
+        updateCheckBox(mPointerLocation, Settings.System.getInt(getActivity().getContentResolver(),
                 Settings.System.POINTER_LOCATION, 0) != 0);
     }
 
@@ -430,7 +456,7 @@
     }
 
     private void updateShowTouchesOptions() {
-        mShowTouches.setChecked(Settings.System.getInt(getActivity().getContentResolver(),
+        updateCheckBox(mShowTouches, Settings.System.getInt(getActivity().getContentResolver(),
                 Settings.System.SHOW_TOUCHES, 0) != 0);
     }
 
@@ -448,11 +474,11 @@
                 @SuppressWarnings("unused")
                 int enableGL = reply.readInt();
                 int showUpdates = reply.readInt();
-                mShowScreenUpdates.setChecked(showUpdates != 0);
+                updateCheckBox(mShowScreenUpdates, showUpdates != 0);
                 @SuppressWarnings("unused")
                 int showBackground = reply.readInt();
                 int disableOverlays = reply.readInt();
-                mDisableOverlays.setChecked(disableOverlays != 0);
+                updateCheckBox(mDisableOverlays, disableOverlays != 0);
                 reply.recycle();
                 data.recycle();
             }
@@ -495,7 +521,7 @@
     }
 
     private void updateHardwareUiOptions() {
-        mForceHardwareUi.setChecked(SystemProperties.getBoolean(HARDWARE_UI_PROPERTY, false));
+        updateCheckBox(mForceHardwareUi, SystemProperties.getBoolean(HARDWARE_UI_PROPERTY, false));
     }
     
     private void writeHardwareUiOptions() {
@@ -503,7 +529,7 @@
     }
 
     private void updateTrackFrameTimeOptions() {
-        mTrackFrameTime.setChecked(
+        updateCheckBox(mTrackFrameTime,
                 SystemProperties.getBoolean(HardwareRenderer.PROFILE_PROPERTY, false));
     }
 
@@ -513,7 +539,7 @@
     }
 
     private void updateShowHwScreenUpdatesOptions() {
-        mShowHwScreenUpdates.setChecked(
+        updateCheckBox(mShowHwScreenUpdates,
                 SystemProperties.getBoolean(HardwareRenderer.DEBUG_DIRTY_REGIONS_PROPERTY, false));
     }
 
@@ -523,7 +549,7 @@
     }
 
     private void updateDebugLayoutOptions() {
-        mDebugLayout.setChecked(
+        updateCheckBox(mDebugLayout,
                 SystemProperties.getBoolean(View.DEBUG_LAYOUT_PROPERTY, false));
     }
 
@@ -533,7 +559,7 @@
     }
 
     private void updateCpuUsageOptions() {
-        mShowCpuUsage.setChecked(Settings.System.getInt(getActivity().getContentResolver(),
+        updateCheckBox(mShowCpuUsage, Settings.System.getInt(getActivity().getContentResolver(),
                 Settings.System.SHOW_PROCESSES, 0) != 0);
     }
     
@@ -559,13 +585,16 @@
     }
 
     private void updateImmediatelyDestroyActivitiesOptions() {
-        mImmediatelyDestroyActivities.setChecked(Settings.System.getInt(
+        updateCheckBox(mImmediatelyDestroyActivities, Settings.System.getInt(
             getActivity().getContentResolver(), Settings.System.ALWAYS_FINISH_ACTIVITIES, 0) != 0);
     }
 
     private void updateAnimationScaleValue(int which, ListPreference pref) {
         try {
             float scale = mWindowManager.getAnimationScale(which);
+            if (scale != 1) {
+                mHaveDebugSettings = true;
+            }
             CharSequence[] values = pref.getEntryValues();
             for (int i=0; i<values.length; i++) {
                 float val = Float.parseFloat(values[i].toString());
@@ -603,6 +632,9 @@
             for (int i=0; i<values.length; i++) {
                 int val = Integer.parseInt(values[i].toString());
                 if (val >= limit) {
+                    if (i != 0) {
+                        mHaveDebugSettings = true;
+                    }
                     mAppProcessLimit.setValueIndex(i);
                     mAppProcessLimit.setSummary(mAppProcessLimit.getEntries()[i]);
                     return;
@@ -630,10 +662,51 @@
     }
 
     private void updateShowAllANRsOptions() {
-        mShowAllANRs.setChecked(Settings.Secure.getInt(
+        updateCheckBox(mShowAllANRs, Settings.Secure.getInt(
             getActivity().getContentResolver(), Settings.Secure.ANR_SHOW_BACKGROUND, 0) != 0);
     }
 
+    private void updateEnableTracesOptions() {
+        String strValue = SystemProperties.get(Trace.PROPERTY_TRACE_TAG_ENABLEFLAGS);
+        long flags = SystemProperties.getLong(Trace.PROPERTY_TRACE_TAG_ENABLEFLAGS, 0);
+        String[] values = mEnableTracesPref.getEntryValues();
+        int numSet = 0;
+        for (int i=Trace.TRACE_FLAGS_START_BIT; i<values.length; i++) {
+            boolean set = (flags&(1<<i)) != 0;
+            mEnableTracesPref.setValue(i-Trace.TRACE_FLAGS_START_BIT, set);
+            if (set) {
+                numSet++;
+            }
+        }
+        if (numSet == 0) {
+            mEnableTracesPref.setSummary(R.string.enable_traces_summary_none);
+        } else if (numSet == values.length) {
+            mHaveDebugSettings = true;
+            mEnableTracesPref.setSummary(R.string.enable_traces_summary_all);
+        } else {
+            mHaveDebugSettings = true;
+            mEnableTracesPref.setSummary(getString(R.string.enable_traces_summary_num, numSet));
+        }
+    }
+
+    private void writeEnableTracesOptions() {
+        long value = 0;
+        String[] values = mEnableTracesPref.getEntryValues();
+        for (int i=Trace.TRACE_FLAGS_START_BIT; i<values.length; i++) {
+            if (mEnableTracesPref.getValue(i-Trace.TRACE_FLAGS_START_BIT)) {
+                value |= 1<<i;
+            }
+        }
+        writeEnableTracesOptions(value);
+        // Make sure summary is updated.
+        updateEnableTracesOptions();
+    }
+
+    private void writeEnableTracesOptions(long value) {
+        SystemProperties.set(Trace.PROPERTY_TRACE_TAG_ENABLEFLAGS,
+                "0x" + Long.toString(value, 16));
+    }
+
     @Override
     public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
         if (buttonView == mEnabledSwitch) {
@@ -754,6 +827,9 @@
         } else if (preference == mAnimatorDurationScale) {
             writeAnimationScaleOption(2, mAnimatorDurationScale, newValue);
             return true;
+        } else if (preference == mEnableTracesPref) {
+            writeEnableTracesOptions();
+            return true;
         } else if (preference == mAppProcessLimit) {
             writeAppProcessLimitOptions(newValue);
             return true;
diff --git a/src/com/android/settings/RingerVolumePreference.java b/src/com/android/settings/RingerVolumePreference.java
index 5845c8f..c80cd35 100644
--- a/src/com/android/settings/RingerVolumePreference.java
+++ b/src/com/android/settings/RingerVolumePreference.java
@@ -117,7 +117,7 @@
 
             if (mCheckBoxes[i] != null) {
                 if (streamType == AudioManager.STREAM_RING && muted
-                        && mAudioManager.shouldVibrate(AudioManager.VIBRATE_TYPE_RINGER)) {
+                        && !(mAudioManager.getRingerMode() == AudioManager.RINGER_MODE_SILENT)) {
                     mCheckBoxes[i].setImageResource(
                             com.android.internal.R.drawable.ic_audio_ring_notif_vibrate);
                 } else {
diff --git a/src/com/android/settings/Settings.java b/src/com/android/settings/Settings.java
index 88fac0a..b0daf6c 100644
--- a/src/com/android/settings/Settings.java
+++ b/src/com/android/settings/Settings.java
@@ -321,7 +321,10 @@
                 AccountSyncSettings.class.getName().equals(fragmentName) ||
                 UserDictionarySettings.class.getName().equals(fragmentName) ||
                 Memory.class.getName().equals(fragmentName) ||
-                ManageApplications.class.getName().equals(fragmentName)) {
+                ManageApplications.class.getName().equals(fragmentName) ||
+                WirelessSettings.class.getName().equals(fragmentName) ||
+                SoundSettings.class.getName().equals(fragmentName) ||
+                PrivacySettings.class.getName().equals(fragmentName)) {
             intent.putExtra(EXTRA_CLEAR_UI_OPTIONS, true);
         }
 
diff --git a/src/com/android/settings/SoundSettings.java b/src/com/android/settings/SoundSettings.java
index 59e40df..4b9d975 100644
--- a/src/com/android/settings/SoundSettings.java
+++ b/src/com/android/settings/SoundSettings.java
@@ -56,7 +56,7 @@
     private static final int FALLBACK_EMERGENCY_TONE_VALUE = 0;
 
     private static final String KEY_SILENT_MODE = "silent_mode";
-    private static final String KEY_VIBRATE = "vibrate_on_ring";
+    private static final String KEY_VIBRATE = "vibrate_when_ringing";
     private static final String KEY_RING_VOLUME = "ring_volume";
     private static final String KEY_MUSICFX = "musicfx";
     private static final String KEY_DTMF_TONE = "dtmf_tone";
@@ -81,6 +81,7 @@
     private static final int MSG_UPDATE_RINGTONE_SUMMARY = 1;
     private static final int MSG_UPDATE_NOTIFICATION_SUMMARY = 2;
 
+    private CheckBoxPreference mVibrateWhenRinging;
     private ListPreference mSilentMode;
     private CheckBoxPreference mDtmfTone;
     private CheckBoxPreference mSoundEffects;
@@ -141,6 +142,11 @@
             mSilentMode.setOnPreferenceChangeListener(this);
         }
 
+        mVibrateWhenRinging = (CheckBoxPreference) findPreference(KEY_VIBRATE);
+        mVibrateWhenRinging.setPersistent(false);
+        mVibrateWhenRinging.setChecked(Settings.System.getInt(resolver,
+                Settings.System.VIBRATE_WHEN_RINGING, 0) != 0);
+
         mDtmfTone = (CheckBoxPreference) findPreference(KEY_DTMF_TONE);
         mDtmfTone.setPersistent(false);
         mDtmfTone.setChecked(Settings.System.getInt(resolver,
@@ -161,7 +167,9 @@
         mRingtonePreference = findPreference(KEY_RINGTONE);
         mNotificationPreference = findPreference(KEY_NOTIFICATION_SOUND);
 
-        if (!((Vibrator) getSystemService(Context.VIBRATOR_SERVICE)).hasVibrator()) {
+        Vibrator vibrator = (Vibrator) getSystemService(Context.VIBRATOR_SERVICE);
+        if (vibrator == null || !vibrator.hasVibrator()) {
+            getPreferenceScreen().removePreference(mVibrateWhenRinging);
             getPreferenceScreen().removePreference(mHapticFeedback);
         }
 
@@ -294,7 +302,10 @@
 
     @Override
     public boolean onPreferenceTreeClick(PreferenceScreen preferenceScreen, Preference preference) {
-        if (preference == mDtmfTone) {
+        if (preference == mVibrateWhenRinging) {
+            Settings.System.putInt(getContentResolver(), Settings.System.VIBRATE_WHEN_RINGING,
+                    mVibrateWhenRinging.isChecked() ? 1 : 0);
+        } else if (preference == mDtmfTone) {
             Settings.System.putInt(getContentResolver(), Settings.System.DTMF_TONE_WHEN_DIALING,
                     mDtmfTone.isChecked() ? 1 : 0);
 
diff --git a/src/com/android/settings/UserDictionarySettings.java b/src/com/android/settings/UserDictionarySettings.java
index 8d4e8b4..822c490 100644
--- a/src/com/android/settings/UserDictionarySettings.java
+++ b/src/com/android/settings/UserDictionarySettings.java
@@ -28,6 +28,7 @@
 import android.os.Bundle;
 import android.provider.UserDictionary;
 import android.text.InputType;
+import android.text.TextUtils;
 import android.util.Log;
 import android.view.LayoutInflater;
 import android.view.Menu;
@@ -53,11 +54,11 @@
     private static final String TAG = "UserDictionarySettings";
 
     private static final String[] QUERY_PROJECTION = {
-        UserDictionary.Words._ID, UserDictionary.Words.WORD
+        UserDictionary.Words._ID, UserDictionary.Words.WORD, UserDictionary.Words.SHORTCUT
     };
 
-    private static final int INDEX_ID = 0;
-    private static final int INDEX_WORD = 1;
+    // The index of the shortcut in the above array.
+    private static final int INDEX_SHORTCUT = 2;
 
     // Either the locale is empty (means the word is applicable to all locales)
     // or the word equals our current locale
@@ -66,7 +67,11 @@
     private static final String QUERY_SELECTION_ALL_LOCALES =
             UserDictionary.Words.LOCALE + " is null";
 
-    private static final String DELETE_SELECTION = UserDictionary.Words.WORD + "=?";
+    private static final String DELETE_SELECTION_WITH_SHORTCUT = UserDictionary.Words.WORD
+            + "=? AND " + UserDictionary.Words.SHORTCUT + "=?";
+    private static final String DELETE_SELECTION_WITHOUT_SHORTCUT = UserDictionary.Words.WORD
+            + "=? AND " + UserDictionary.Words.SHORTCUT + " is null OR "
+            + UserDictionary.Words.SHORTCUT + "=''";
 
     private static final int OPTIONS_MENU_ADD = Menu.FIRST;
 
@@ -148,15 +153,16 @@
     private ListAdapter createAdapter() {
         return new MyAdapter(getActivity(),
                 R.layout.user_dictionary_item, mCursor,
-                new String[] { UserDictionary.Words.WORD, UserDictionary.Words._ID },
-                new int[] { android.R.id.text1, R.id.delete_button }, this);
+                new String[] { UserDictionary.Words.WORD, UserDictionary.Words.SHORTCUT },
+                new int[] { android.R.id.text1, android.R.id.text2 }, this);
     }
 
     @Override
     public void onListItemClick(ListView l, View v, int position, long id) {
-        String word = getWord(position);
+        final String word = getWord(position);
+        final String shortcut = getShortcut(position);
         if (word != null) {
-            showAddOrEditDialog(word);
+            showAddOrEditDialog(word, shortcut);
         }
     }
 
@@ -172,7 +178,7 @@
     @Override
     public boolean onOptionsItemSelected(MenuItem item) {
         if (item.getItemId() == OPTIONS_MENU_ADD) {
-            showAddOrEditDialog(null);
+            showAddOrEditDialog(null, null);
             return true;
         }
         return false;
@@ -181,13 +187,15 @@
     /**
      * Add or edit a word. If editingWord is null, it's an add; otherwise, it's an edit.
      * @param editingWord the word to edit, or null if it's an add.
+     * @param editingShortcut the shortcut for this entry, or null if none.
      */
-    private void showAddOrEditDialog(final String editingWord) {
+    private void showAddOrEditDialog(final String editingWord, final String editingShortcut) {
         final Bundle args = new Bundle();
         args.putInt(UserDictionaryAddWordContents.EXTRA_MODE, null == editingWord
                 ? UserDictionaryAddWordContents.MODE_INSERT
                 : UserDictionaryAddWordContents.MODE_EDIT);
         args.putString(UserDictionaryAddWordContents.EXTRA_WORD, editingWord);
+        args.putString(UserDictionaryAddWordContents.EXTRA_SHORTCUT, editingShortcut);
         args.putString(UserDictionaryAddWordContents.EXTRA_LOCALE, mLocale);
         android.preference.PreferenceActivity pa =
                 (android.preference.PreferenceActivity)getActivity();
@@ -196,7 +204,7 @@
                 args, R.string.details_title, null, null, 0);
     }
 
-    private String getWord(int position) {
+    private String getWord(final int position) {
         if (null == mCursor) return null;
         mCursor.moveToPosition(position);
         // Handle a possible race-condition
@@ -206,23 +214,45 @@
                 mCursor.getColumnIndexOrThrow(UserDictionary.Words.WORD));
     }
 
-    public static void deleteWord(final String word, final ContentResolver resolver) {
-        resolver.delete(
-                UserDictionary.Words.CONTENT_URI, DELETE_SELECTION, new String[] { word });
+    private String getShortcut(final int position) {
+        if (null == mCursor) return null;
+        mCursor.moveToPosition(position);
+        // Handle a possible race-condition
+        if (mCursor.isAfterLast()) return null;
+
+        return mCursor.getString(
+                mCursor.getColumnIndexOrThrow(UserDictionary.Words.SHORTCUT));
     }
 
-    private static class MyAdapter extends SimpleCursorAdapter implements SectionIndexer,
-            View.OnClickListener {
+    public static void deleteWord(final String word, final String shortcut,
+            final ContentResolver resolver) {
+        if (TextUtils.isEmpty(shortcut)) {
+            resolver.delete(
+                    UserDictionary.Words.CONTENT_URI, DELETE_SELECTION_WITHOUT_SHORTCUT,
+                    new String[] { word });
+        } else {
+            resolver.delete(
+                    UserDictionary.Words.CONTENT_URI, DELETE_SELECTION_WITH_SHORTCUT,
+                    new String[] { word, shortcut });
+        }
+    }
+
+    private static class MyAdapter extends SimpleCursorAdapter implements SectionIndexer {
 
         private AlphabetIndexer mIndexer;
-        private UserDictionarySettings mSettings;
 
         private ViewBinder mViewBinder = new ViewBinder() {
 
             public boolean setViewValue(View v, Cursor c, int columnIndex) {
-                if (v instanceof ImageView && columnIndex == INDEX_ID) {
-                    v.setOnClickListener(MyAdapter.this);
-                    v.setTag(c.getString(INDEX_WORD));
+                if (columnIndex == INDEX_SHORTCUT) {
+                    final String shortcut = c.getString(INDEX_SHORTCUT);
+                    if (TextUtils.isEmpty(shortcut)) {
+                        v.setVisibility(View.GONE);
+                    } else {
+                        ((TextView)v).setText(shortcut);
+                        v.setVisibility(View.VISIBLE);
+                    }
+                    v.invalidate();
                     return true;
                 }
 
@@ -234,7 +264,6 @@
                 UserDictionarySettings settings) {
             super(context, layout, c, from, to);
 
-            mSettings = settings;
             if (null != c) {
                 final String alphabet = context.getString(
                         com.android.internal.R.string.fast_scroll_alphabet);
@@ -255,10 +284,5 @@
         public Object[] getSections() {
             return null == mIndexer ? null : mIndexer.getSections();
         }
-
-        public void onClick(View v) {
-            UserDictionarySettings.deleteWord((String) v.getTag(),
-                    mSettings.getActivity().getContentResolver());
-        }
     }
 }
diff --git a/src/com/android/settings/accounts/AccountSyncSettings.java b/src/com/android/settings/accounts/AccountSyncSettings.java
index 82f9844..4d9f80e 100644
--- a/src/com/android/settings/accounts/AccountSyncSettings.java
+++ b/src/com/android/settings/accounts/AccountSyncSettings.java
@@ -208,11 +208,13 @@
                 new SyncStateCheckBoxPreference(getActivity(), account, authority);
         item.setPersistent(false);
         final ProviderInfo providerInfo = getPackageManager().resolveContentProvider(authority, 0);
-        CharSequence providerLabel = providerInfo != null
-                ? providerInfo.loadLabel(getPackageManager()) : null;
+        if (providerInfo == null) {
+            return;
+        }
+        CharSequence providerLabel = providerInfo.loadLabel(getPackageManager());
         if (TextUtils.isEmpty(providerLabel)) {
             Log.e(TAG, "Provider needs a label for authority '" + authority + "'");
-            providerLabel = authority;
+            return;
         }
         String title = getString(R.string.sync_item_title, providerLabel);
         item.setTitle(title);
diff --git a/src/com/android/settings/applications/ManageApplications.java b/src/com/android/settings/applications/ManageApplications.java
index a28fa33..eee9c43 100644
--- a/src/com/android/settings/applications/ManageApplications.java
+++ b/src/com/android/settings/applications/ManageApplications.java
@@ -88,8 +88,7 @@
         if ((info.flags & ApplicationInfo.FLAG_EXTERNAL_STORAGE) != 0) {
             canBe = true;
         } else {
-            if ((info.flags & ApplicationInfo.FLAG_FORWARD_LOCK) == 0 &&
-                    (info.flags & ApplicationInfo.FLAG_SYSTEM) == 0) {
+            if ((info.flags & ApplicationInfo.FLAG_SYSTEM) == 0) {
                 if (info.installLocation == PackageInfo.INSTALL_LOCATION_PREFER_EXTERNAL ||
                         info.installLocation == PackageInfo.INSTALL_LOCATION_AUTO) {
                     canBe = true;
@@ -764,6 +763,8 @@
     void updateStorageUsage() {
         // Fragment view not yet created?
         if (mRootView == null) return;
+        // Make sure a callback didn't come at an inopportune time.
+        if (getActivity() == null) return;
 
         if (mCurView == VIEW_RUNNING) {
             return;
@@ -945,8 +946,6 @@
         @Override
         public void onServiceConnected(ComponentName name, IBinder service) {
             mContainerService = IMediaContainerService.Stub.asInterface(service);
-            // Make sure this callback didn't come at an inopportune time.
-            if (getActivity() == null) return;
             updateStorageUsage();
         }
 
diff --git a/src/com/android/settings/inputmethod/InputMethodAndLanguageSettings.java b/src/com/android/settings/inputmethod/InputMethodAndLanguageSettings.java
index cb350b2..6448a97 100644
--- a/src/com/android/settings/inputmethod/InputMethodAndLanguageSettings.java
+++ b/src/com/android/settings/inputmethod/InputMethodAndLanguageSettings.java
@@ -49,7 +49,7 @@
 import java.util.ArrayList;
 import java.util.Collections;
 import java.util.List;
-import java.util.Set;
+import java.util.TreeSet;
 
 public class InputMethodAndLanguageSettings extends SettingsPreferenceFragment
         implements Preference.OnPreferenceChangeListener, InputManager.InputDeviceListener {
@@ -190,7 +190,7 @@
 
     private void updateUserDictionaryPreference(Preference userDictionaryPreference) {
         final Activity activity = getActivity();
-        final Set<String> localeList = UserDictionaryList.getUserDictionaryLocalesList(activity);
+        final TreeSet<String> localeList = UserDictionaryList.getUserDictionaryLocalesSet(activity);
         if (null == localeList) {
             // The locale list is null if and only if the user dictionary service is
             // not present or disabled. In this case we need to remove the preference.
@@ -205,9 +205,9 @@
             // If the size of localeList is 0, we don't set the locale parameter in the
             // extras. This will be interpreted by the UserDictionarySettings class as
             // meaning "the current locale".
-            // Note that with the current code for UserDictionaryList#getUserDictionaryLocalesList()
+            // Note that with the current code for UserDictionaryList#getUserDictionaryLocalesSet()
             // the locale list always has at least one element, since it always includes the current
-            // locale explicitly. @see UserDictionaryList.getUserDictionaryLocalesList().
+            // locale explicitly. @see UserDictionaryList.getUserDictionaryLocalesSet().
             if (localeList.size() == 1) {
                 final String locale = (String)localeList.toArray()[0];
                 userDictionaryPreference.getExtras().putString("locale", locale);
diff --git a/src/com/android/settings/inputmethod/UserDictionaryAddWordActivity.java b/src/com/android/settings/inputmethod/UserDictionaryAddWordActivity.java
index f741d19..e52ab7a 100644
--- a/src/com/android/settings/inputmethod/UserDictionaryAddWordActivity.java
+++ b/src/com/android/settings/inputmethod/UserDictionaryAddWordActivity.java
@@ -17,48 +17,21 @@
 package com.android.settings.inputmethod;
 
 import com.android.settings.R;
-import com.android.settings.UserDictionarySettings;
-import com.android.settings.Utils;
 
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Locale;
-import java.util.Set;
-
-import android.animation.LayoutTransition;
 import android.app.Activity;
-import android.content.Context;
 import android.content.Intent;
 import android.os.Bundle;
-import android.provider.UserDictionary;
-import android.text.TextUtils;
 import android.view.View;
-import android.view.ViewGroup;
-import android.widget.AdapterView;
-import android.widget.ArrayAdapter;
-import android.widget.EditText;
-import android.widget.Spinner;
 
-public class UserDictionaryAddWordActivity extends Activity
-        implements AdapterView.OnItemSelectedListener {
+public class UserDictionaryAddWordActivity extends Activity {
 
     private static final String STATE_KEY_IS_OPEN = "isOpen";
 
     public static final String MODE_EDIT_ACTION = "com.android.settings.USER_DICTIONARY_EDIT";
     public static final String MODE_INSERT_ACTION = "com.android.settings.USER_DICTIONARY_INSERT";
 
-    private static final int[] IDS_SHOWN_ONLY_IN_MORE_OPTIONS_MODE = {
-        R.id.user_dictionary_add_word_label,
-        R.id.user_dictionary_add_shortcut_label,
-        R.id.user_dictionary_add_locale_label,
-        R.id.user_dictionary_settings_add_dialog_shortcut,
-        R.id.user_dictionary_settings_add_dialog_locale,
-    };
-
     private UserDictionaryAddWordContents mContents;
 
-    private boolean mIsShowingMoreOptions = false;
-
     @Override
     public void onCreate(final Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
@@ -82,33 +55,16 @@
         args.putInt(UserDictionaryAddWordContents.EXTRA_MODE, mode);
 
         if (null != savedInstanceState) {
-            mIsShowingMoreOptions =
-                    savedInstanceState.getBoolean(STATE_KEY_IS_OPEN, mIsShowingMoreOptions);
             // Override options if we have a saved state.
             args.putAll(savedInstanceState);
         }
 
         mContents = new UserDictionaryAddWordContents(getWindow().getDecorView(), args);
-
-        if (mIsShowingMoreOptions) {
-            onClickMoreOptions(findViewById(R.id.user_dictionary_settings_add_dialog_more_options));
-        }
-
-        // TODO: The following code enables layout transition for eye-candy, but there is still
-        // a jankiness issue with the window moving on one frame, resizing suddenly on the next,
-        // and animation only starting afterwards on children.
-        final ViewGroup v = (ViewGroup)findViewById(R.id.user_dictionary_add_word_grid);
-        final LayoutTransition transition = new LayoutTransition();
-        transition.setStartDelay(LayoutTransition.APPEARING, 0);
-        v.setLayoutTransition(transition);
     }
 
     @Override
     public void onSaveInstanceState(final Bundle outState) {
-        outState.putBoolean(STATE_KEY_IS_OPEN, mIsShowingMoreOptions);
-        outState.putString(
-                UserDictionaryAddWordContents.EXTRA_WORD, mContents.mEditText.getText().toString());
-        outState.putString(UserDictionaryAddWordContents.EXTRA_LOCALE, mContents.mLocale);
+        mContents.saveStateIntoBundle(outState);
     }
 
     public void onClickCancel(final View v) {
@@ -119,100 +75,4 @@
         mContents.apply(this);
         finish();
     }
-
-    private static class LocaleRenderer {
-        private final String mLocaleString;
-        private final String mDescription;
-        // LocaleString may NOT be null.
-        public LocaleRenderer(final Context context, final String localeString) {
-            mLocaleString = localeString;
-            if (null == localeString) {
-                mDescription = context.getString(R.string.user_dict_settings_more_languages);
-            } else if ("".equals(localeString)) {
-                mDescription = context.getString(R.string.user_dict_settings_all_languages);
-            } else {
-                mDescription = Utils.createLocaleFromString(localeString).getDisplayName();
-            }
-        }
-        @Override
-        public String toString() {
-            return mDescription;
-        }
-        public String getLocaleString() {
-            return mLocaleString;
-        }
-    }
-
-    private static void addLocaleDisplayNameToList(final Context context,
-            final List<LocaleRenderer> list, final String locale) {
-        if (null != locale) {
-            list.add(new LocaleRenderer(context, locale));
-        }
-    }
-
-    public void onClickMoreOptions(final View v) {
-        for (final int idToShow : IDS_SHOWN_ONLY_IN_MORE_OPTIONS_MODE) {
-            final View viewToShow = findViewById(idToShow);
-            viewToShow.setVisibility(View.VISIBLE);
-        }
-        findViewById(R.id.user_dictionary_settings_add_dialog_more_options)
-                .setVisibility(View.GONE);
-        findViewById(R.id.user_dictionary_settings_add_dialog_less_options)
-                .setVisibility(View.VISIBLE);
-
-        final Set<String> locales = UserDictionaryList.getUserDictionaryLocalesList(this);
-        // Remove our locale if it's in, because we're always gonna put it at the top
-        locales.remove(mContents.mLocale); // mLocale may not be null
-        final String systemLocale = Locale.getDefault().toString();
-        // The system locale should be inside. We want it at the 2nd spot.
-        locales.remove(systemLocale); // system locale may not be null
-        locales.remove(""); // Remove the empty string if it's there
-        final ArrayList<LocaleRenderer> localesList = new ArrayList<LocaleRenderer>();
-        // Add the passed locale, then the system locale at the top of the list. Add an
-        // "all languages" entry at the bottom of the list.
-        addLocaleDisplayNameToList(this, localesList, mContents.mLocale);
-        if (!systemLocale.equals(mContents.mLocale)) {
-            addLocaleDisplayNameToList(this, localesList, systemLocale);
-        }
-        for (final String l : locales) {
-            // TODO: sort in unicode order
-            addLocaleDisplayNameToList(this, localesList, l);
-        }
-        localesList.add(new LocaleRenderer(this, "")); // meaning: all languages
-        localesList.add(new LocaleRenderer(this, null)); // meaning: select another locale
-        final Spinner localeSpinner =
-                (Spinner)findViewById(R.id.user_dictionary_settings_add_dialog_locale);
-        final ArrayAdapter<LocaleRenderer> adapter = new ArrayAdapter<LocaleRenderer>(this,
-                android.R.layout.simple_spinner_item, localesList);
-        adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
-        localeSpinner.setAdapter(adapter);
-        localeSpinner.setOnItemSelectedListener(this);
-        mIsShowingMoreOptions = true;
-    }
-
-    public void onClickLessOptions(final View v) {
-        for (final int idToHide : IDS_SHOWN_ONLY_IN_MORE_OPTIONS_MODE) {
-            final View viewToHide = findViewById(idToHide);
-            viewToHide.setVisibility(View.GONE);
-        }
-        findViewById(R.id.user_dictionary_settings_add_dialog_more_options)
-                .setVisibility(View.VISIBLE);
-        findViewById(R.id.user_dictionary_settings_add_dialog_less_options)
-                .setVisibility(View.GONE);
-        mIsShowingMoreOptions = false;
-    }
-
-    @Override
-    public void onItemSelected(final AdapterView<?> parent, final View view, final int pos,
-            final long id) {
-        final LocaleRenderer locale = (LocaleRenderer)parent.getItemAtPosition(pos);
-        mContents.updateLocale(locale.getLocaleString());
-    }
-
-    @Override
-    public void onNothingSelected(AdapterView<?> parent) {
-        // I'm not sure we can come here, but if we do, that's the right thing to do.
-        final Intent intent = getIntent();
-        mContents.updateLocale(intent.getStringExtra(UserDictionaryAddWordContents.EXTRA_LOCALE));
-    }
 }
diff --git a/src/com/android/settings/inputmethod/UserDictionaryAddWordContents.java b/src/com/android/settings/inputmethod/UserDictionaryAddWordContents.java
index 5de6f03..1e8bf74 100644
--- a/src/com/android/settings/inputmethod/UserDictionaryAddWordContents.java
+++ b/src/com/android/settings/inputmethod/UserDictionaryAddWordContents.java
@@ -16,6 +16,7 @@
 
 package com.android.settings.inputmethod;
 
+import android.app.Activity;
 import android.content.ContentResolver;
 import android.content.Context;
 import android.os.Bundle;
@@ -28,7 +29,9 @@
 import com.android.settings.UserDictionarySettings;
 import com.android.settings.Utils;
 
+import java.util.ArrayList;
 import java.util.Locale;
+import java.util.TreeSet;
 
 /**
  * A container class to factor common code to UserDictionaryAddWordFragment
@@ -37,6 +40,7 @@
 public class UserDictionaryAddWordContents {
     public static final String EXTRA_MODE = "mode";
     public static final String EXTRA_WORD = "word";
+    public static final String EXTRA_SHORTCUT = "shortcut";
     public static final String EXTRA_LOCALE = "locale";
 
     public static final int MODE_EDIT = 0;
@@ -44,20 +48,28 @@
 
     private static final int FREQUENCY_FOR_USER_DICTIONARY_ADDS = 250;
 
-    /* package */ final int mMode; // Either MODE_EDIT or MODE_INSERT
-    /* package */ final EditText mEditText;
-    /* package */ String mLocale;
-    /* package */ String mOldWord;
+    private final int mMode; // Either MODE_EDIT or MODE_INSERT
+    private final EditText mWordEditText;
+    private final EditText mShortcutEditText;
+    private String mLocale;
+    private final String mOldWord;
+    private final String mOldShortcut;
 
     /* package */ UserDictionaryAddWordContents(final View view, final Bundle args) {
-        mEditText = (EditText)view.findViewById(R.id.user_dictionary_add_word_text);
+        mWordEditText = (EditText)view.findViewById(R.id.user_dictionary_add_word_text);
+        mShortcutEditText = (EditText)view.findViewById(R.id.user_dictionary_add_shortcut);
         final String word = args.getString(EXTRA_WORD);
         if (null != word) {
-            mEditText.setText(word);
-            mEditText.setSelection(word.length());
+            mWordEditText.setText(word);
+            mWordEditText.setSelection(word.length());
+        }
+        final String shortcut = args.getString(EXTRA_SHORTCUT);
+        if (null != shortcut && null != mShortcutEditText) {
+            mShortcutEditText.setText(shortcut);
         }
         mMode = args.getInt(EXTRA_MODE); // default return value for #getInt() is 0 = MODE_EDIT
         mOldWord = args.getString(EXTRA_WORD);
+        mOldShortcut = args.getString(EXTRA_SHORTCUT);
         updateLocale(args.getString(EXTRA_LOCALE));
     }
 
@@ -67,24 +79,104 @@
         mLocale = null == locale ? Locale.getDefault().toString() : locale;
     }
 
+    /* package */ void saveStateIntoBundle(final Bundle outState) {
+        outState.putString(EXTRA_WORD, mWordEditText.getText().toString());
+        if (null != mShortcutEditText) {
+            outState.putString(EXTRA_SHORTCUT, mShortcutEditText.getText().toString());
+        }
+        outState.putString(EXTRA_LOCALE, mLocale);
+    }
+
     /* package */ void apply(final Context context) {
         final ContentResolver resolver = context.getContentResolver();
         if (UserDictionaryAddWordContents.MODE_EDIT == mMode && !TextUtils.isEmpty(mOldWord)) {
-            UserDictionarySettings.deleteWord(mOldWord, resolver);
+            // Mode edit: remove the old entry.
+            UserDictionarySettings.deleteWord(mOldWord, mOldShortcut, resolver);
         }
-        final String newWord = mEditText.getText().toString();
+        final String newWord = mWordEditText.getText().toString();
+        final String newShortcut;
+        if (null == mShortcutEditText) {
+            newShortcut = null;
+        } else {
+            final String tmpShortcut = mShortcutEditText.getText().toString();
+            if (TextUtils.isEmpty(tmpShortcut)) {
+                newShortcut = null;
+            } else {
+                newShortcut = tmpShortcut;
+            }
+        }
         if (TextUtils.isEmpty(newWord)) {
             // If the word is somehow empty, don't insert it.
             return;
         }
-        // Disallow duplicates.
-        // TODO: Redefine the logic when we support shortcuts.
-        UserDictionarySettings.deleteWord(newWord, resolver);
+        // Disallow duplicates. If the same word with no shortcut is defined, remove it; if
+        // the same word with the same shortcut is defined, remove it; but we don't mind if
+        // there is the same word with a different, non-empty shortcut.
+        UserDictionarySettings.deleteWord(newWord, null, resolver);
+        if (!TextUtils.isEmpty(newShortcut)) {
+            // If newShortcut is empty we just deleted this, no need to do it again
+            UserDictionarySettings.deleteWord(newWord, newShortcut, resolver);
+        }
 
         // In this class we use the empty string to represent 'all locales' and mLocale cannot
         // be null. However the addWord method takes null to mean 'all locales'.
         UserDictionary.Words.addWord(context, newWord.toString(),
-                FREQUENCY_FOR_USER_DICTIONARY_ADDS, null /* shortcut */,
+                FREQUENCY_FOR_USER_DICTIONARY_ADDS, newShortcut,
                 TextUtils.isEmpty(mLocale) ? null : Utils.createLocaleFromString(mLocale));
     }
+
+    public static class LocaleRenderer {
+        private final String mLocaleString;
+        private final String mDescription;
+        // LocaleString may NOT be null.
+        public LocaleRenderer(final Context context, final String localeString) {
+            mLocaleString = localeString;
+            if (null == localeString) {
+                mDescription = context.getString(R.string.user_dict_settings_more_languages);
+            } else if ("".equals(localeString)) {
+                mDescription = context.getString(R.string.user_dict_settings_all_languages);
+            } else {
+                mDescription = Utils.createLocaleFromString(localeString).getDisplayName();
+            }
+        }
+        @Override
+        public String toString() {
+            return mDescription;
+        }
+        public String getLocaleString() {
+            return mLocaleString;
+        }
+    }
+
+    private static void addLocaleDisplayNameToList(final Context context,
+            final ArrayList<LocaleRenderer> list, final String locale) {
+        if (null != locale) {
+            list.add(new LocaleRenderer(context, locale));
+        }
+    }
+
+    // Helper method to get the list of locales to display for this word
+    public ArrayList<LocaleRenderer> getLocalesList(final Activity activity) {
+        final TreeSet<String> locales = UserDictionaryList.getUserDictionaryLocalesSet(activity);
+        // Remove our locale if it's in, because we're always gonna put it at the top
+        locales.remove(mLocale); // mLocale may not be null
+        final String systemLocale = Locale.getDefault().toString();
+        // The system locale should be inside. We want it at the 2nd spot.
+        locales.remove(systemLocale); // system locale may not be null
+        locales.remove(""); // Remove the empty string if it's there
+        final ArrayList<LocaleRenderer> localesList = new ArrayList<LocaleRenderer>();
+        // Add the passed locale, then the system locale at the top of the list. Add an
+        // "all languages" entry at the bottom of the list.
+        addLocaleDisplayNameToList(activity, localesList, mLocale);
+        if (!systemLocale.equals(mLocale)) {
+            addLocaleDisplayNameToList(activity, localesList, systemLocale);
+        }
+        for (final String l : locales) {
+            // TODO: sort in unicode order
+            addLocaleDisplayNameToList(activity, localesList, l);
+        }
+        localesList.add(new LocaleRenderer(activity, "")); // meaning: all languages
+        localesList.add(new LocaleRenderer(activity, null)); // meaning: select another locale
+        return localesList;
+    }
 }
diff --git a/src/com/android/settings/inputmethod/UserDictionaryAddWordFragment.java b/src/com/android/settings/inputmethod/UserDictionaryAddWordFragment.java
index f4a39a2..0a9738f 100644
--- a/src/com/android/settings/inputmethod/UserDictionaryAddWordFragment.java
+++ b/src/com/android/settings/inputmethod/UserDictionaryAddWordFragment.java
@@ -23,8 +23,14 @@
 import android.view.MenuItem;
 import android.view.View;
 import android.view.ViewGroup;
+import android.widget.AdapterView;
+import android.widget.ArrayAdapter;
+import android.widget.Spinner;
 
 import com.android.settings.R;
+import com.android.settings.inputmethod.UserDictionaryAddWordContents.LocaleRenderer;
+
+import java.util.ArrayList;
 
 /**
  * Fragment to add a word/shortcut to the user dictionary.
@@ -32,11 +38,13 @@
  * As opposed to the UserDictionaryActivity, this is only invoked within Settings
  * from the UserDictionarySettings.
  */
-public class UserDictionaryAddWordFragment extends Fragment {
+public class UserDictionaryAddWordFragment extends Fragment
+        implements AdapterView.OnItemSelectedListener {
 
     private static final int OPTIONS_MENU_DELETE = Menu.FIRST;
 
     private UserDictionaryAddWordContents mContents;
+    private View mRootView;
 
     @Override
     public void onActivityCreated(Bundle savedInstanceState) {
@@ -46,9 +54,8 @@
 
     @Override
     public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedState) {
-        final View view = inflater.inflate(R.layout.user_dictionary_add_word_fullscreen, null);
-        mContents = new UserDictionaryAddWordContents(view, getArguments());
-        return view;
+        mRootView = inflater.inflate(R.layout.user_dictionary_add_word_fullscreen, null);
+        return mRootView;
     }
 
     @Override
@@ -63,6 +70,16 @@
     public void onResume() {
         super.onResume();
         // We are being shown: display the word
+        mContents = new UserDictionaryAddWordContents(mRootView, getArguments());
+        final ArrayList<LocaleRenderer> localesList = mContents.getLocalesList(getActivity());
+
+        final Spinner localeSpinner =
+                (Spinner)mRootView.findViewById(R.id.user_dictionary_add_locale);
+        final ArrayAdapter<LocaleRenderer> adapter = new ArrayAdapter<LocaleRenderer>(getActivity(),
+                android.R.layout.simple_spinner_item, localesList);
+        adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
+        localeSpinner.setAdapter(adapter);
+        localeSpinner.setOnItemSelectedListener(this);
     }
 
     @Override
@@ -71,4 +88,18 @@
         mContents.apply(getActivity());
         // We are being hidden: commit changes to the user dictionary
     }
+
+    @Override
+    public void onItemSelected(final AdapterView<?> parent, final View view, final int pos,
+            final long id) {
+        final LocaleRenderer locale = (LocaleRenderer)parent.getItemAtPosition(pos);
+        mContents.updateLocale(locale.getLocaleString());
+    }
+
+    @Override
+    public void onNothingSelected(final AdapterView<?> parent) {
+        // I'm not sure we can come here, but if we do, that's the right thing to do.
+        final Bundle args = getArguments();
+        mContents.updateLocale(args.getString(UserDictionaryAddWordContents.EXTRA_LOCALE));
+    }
 }
diff --git a/src/com/android/settings/inputmethod/UserDictionaryList.java b/src/com/android/settings/inputmethod/UserDictionaryList.java
index ff82a30..5390be6 100644
--- a/src/com/android/settings/inputmethod/UserDictionaryList.java
+++ b/src/com/android/settings/inputmethod/UserDictionaryList.java
@@ -29,7 +29,6 @@
 import android.provider.UserDictionary;
 
 import java.util.Locale;
-import java.util.Set;
 import java.util.TreeSet;
 
 public class UserDictionaryList extends SettingsPreferenceFragment {
@@ -43,12 +42,12 @@
         setPreferenceScreen(getPreferenceManager().createPreferenceScreen(getActivity()));
     }
 
-    static Set<String> getUserDictionaryLocalesList(Activity activity) {
+    static TreeSet<String> getUserDictionaryLocalesSet(Activity activity) {
         @SuppressWarnings("deprecation")
         final Cursor cursor = activity.managedQuery(UserDictionary.Words.CONTENT_URI,
                 new String[] { UserDictionary.Words.LOCALE },
                 null, null, null);
-        final Set<String> localeList = new TreeSet<String>();
+        final TreeSet<String> localeList = new TreeSet<String>();
         if (null == cursor) {
             // The user dictionary service is not present or disabled. Return null.
             return null;
@@ -70,7 +69,8 @@
     protected void createUserDictSettings(PreferenceGroup userDictGroup) {
         final Activity activity = getActivity();
         userDictGroup.removeAll();
-        final Set<String> localeList = UserDictionaryList.getUserDictionaryLocalesList(activity);
+        final TreeSet<String> localeList =
+                UserDictionaryList.getUserDictionaryLocalesSet(activity);
 
         if (localeList.isEmpty()) {
             userDictGroup.addPreference(createUserDictionaryPreference(null, activity));
diff --git a/src/com/android/settings/wifi/WifiSettings.java b/src/com/android/settings/wifi/WifiSettings.java
index 8772f53..5037ad3 100644
--- a/src/com/android/settings/wifi/WifiSettings.java
+++ b/src/com/android/settings/wifi/WifiSettings.java
@@ -134,12 +134,19 @@
     // this boolean extra specifies whether to disable the Next button when not connected
     private static final String EXTRA_ENABLE_NEXT_ON_CONNECT = "wifi_enable_next_on_connect";
 
+    // this boolean extra specifies whether to auto finish when connection is established
+    private static final String EXTRA_AUTO_FINISH_ON_CONNECT = "wifi_auto_finish_on_connect";
+
     private static final String EXTRA_WIFI_SHOW_ACTION_BAR = "wifi_show_action_bar";
     private static final String EXTRA_WIFI_SHOW_MENUS = "wifi_show_menus";
+    private static final String EXTRA_WIFI_DISABLE_BACK = "wifi_disable_back";
 
     // should Next button only be enabled when we have a connection?
     private boolean mEnableNextOnConnection;
 
+    // should activity finish once we have a connection?
+    private boolean mAutoFinishOnConnection;
+
     // Save the dialog details
     private boolean mDlgEdit;
     private AccessPoint mDlgAccessPoint;
@@ -220,6 +227,24 @@
         final Activity activity = getActivity();
         final Intent intent = activity.getIntent();
 
+        // first if we're supposed to finish once we have a connection
+        mAutoFinishOnConnection = intent.getBooleanExtra(EXTRA_AUTO_FINISH_ON_CONNECT, false);
+
+        if (mAutoFinishOnConnection) {
+            // Hide the next button
+            if (hasNextButton()) {
+                getNextButton().setVisibility(View.GONE);
+            }
+
+            final ConnectivityManager connectivity = (ConnectivityManager)
+                    getActivity().getSystemService(Context.CONNECTIVITY_SERVICE);
+            if (connectivity != null
+                    && connectivity.getNetworkInfo(ConnectivityManager.TYPE_WIFI).isConnected()) {
+                activity.finish();
+                return;
+            }
+        }
+
         // if we're supposed to enable/disable the Next button based on our current connection
         // state, start it off in the right state
         mEnableNextOnConnection = intent.getBooleanExtra(EXTRA_ENABLE_NEXT_ON_CONNECT, false);
@@ -238,6 +263,11 @@
 
         addPreferencesFromResource(R.xml.wifi_settings);
 
+        // Back key is disabled if requested
+        if (intent.getBooleanExtra(EXTRA_WIFI_DISABLE_BACK, false)) {
+            getView().setSystemUiVisibility(View.STATUS_BAR_DISABLE_BACK);
+        }
+
         // Action bar is hidden for Setup Wizard
         final boolean showActionBar = intent.getBooleanExtra(EXTRA_WIFI_SHOW_ACTION_BAR, true);
         if (showActionBar) {
@@ -651,6 +681,10 @@
             changeNextButtonState(info.isConnected());
             updateAccessPoints();
             updateConnectionState(info.getDetailedState());
+            if (mAutoFinishOnConnection && info.isConnected()) {
+                getActivity().finish();
+                return;
+            }
         } else if (WifiManager.RSSI_CHANGED_ACTION.equals(action)) {
             updateConnectionState(null);
         }
