diff --git a/AndroidManifest.xml b/AndroidManifest.xml
index eb1c078..fdbfd15 100644
--- a/AndroidManifest.xml
+++ b/AndroidManifest.xml
@@ -332,7 +332,6 @@
                 android:clearTaskOnLaunch="true">
             <intent-filter>
                 <action android:name="android.intent.action.MAIN" />
-                <action android:name="android.settings.INPUT_METHOD_SETTINGS" />
                 <action android:name="com.android.settings.VOICE_INPUT_OUTPUT_SETTINGS" />
                 <category android:name="android.intent.category.VOICE_LAUNCH" />
                 <category android:name="android.intent.category.DEFAULT" />
@@ -365,6 +364,23 @@
                 android:value="com.android.settings.Settings$InputMethodAndLanguageSettingsActivity" />
         </activity>
 
+        <activity android:name="Settings$InputMethodConfigActivity"
+                android:theme="@android:style/Theme.Holo"
+                android:label="@string/configure_input_method"
+                android:clearTaskOnLaunch="true">
+            <intent-filter>
+                <action android:name="android.intent.action.MAIN" />
+                <action android:name="android.settings.INPUT_METHOD_SETTINGS" />
+                <category android:name="android.intent.category.VOICE_LAUNCH" />
+                <category android:name="android.intent.category.DEFAULT" />
+                <category android:name="com.android.settings.SHORTCUT" />
+            </intent-filter>
+            <meta-data android:name="com.android.settings.FRAGMENT_CLASS"
+                android:value="com.android.settings.inputmethod.InputMethodConfig" />
+            <meta-data android:name="com.android.settings.TOP_LEVEL_HEADER_ID"
+                android:resource="@id/language_settings" />
+        </activity>
+
         <activity android:name="PhysicalKeyboardSettings"
                 android:label="@string/builtin_keyboard_settings_title"
                 android:theme="@android:style/Theme.Holo.DialogWhenLarge">
diff --git a/res/values/donottranslate.xml b/res/values/donottranslate.xml
new file mode 100644
index 0000000..e6bd9a6
--- /dev/null
+++ b/res/values/donottranslate.xml
@@ -0,0 +1,36 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+/*
+**
+** Copyright 2010, The Android Open Source Project
+**
+** Licensed under the Apache License, Version 2.0 (the "License");
+** you may not use this file except in compliance with the License.
+** You may obtain a copy of the License at
+**
+**     http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+** See the License for the specific language governing permissions and
+** limitations under the License.
+*/
+-->
+<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <string-array name="input_method_selector_titles">
+        <item>@string/input_method_selector_show_automatically_title</item>
+        <item>@string/input_method_selector_always_show_title</item>
+        <item>@string/input_method_selector_always_hide_title</item>
+    </string-array>
+    <!-- values for input method selector should be corresponding to the array index of titles -->
+    <string name="input_method_selector_show_automatically_value">0</string>
+    <string name="input_method_selector_always_show_value">1</string>
+    <string name="input_method_selector_always_hide_value">2</string>
+    <string name="input_method_selector_visibility_default_value">0</string>
+    <string-array name="input_method_selector_values">
+        <item>@string/input_method_selector_show_automatically_value</item>
+        <item>@string/input_method_selector_always_show_value</item>
+        <item>@string/input_method_selector_always_hide_value</item>
+    </string-array>
+</resources>
diff --git a/res/values/strings.xml b/res/values/strings.xml
index a3a909f..2b7ccb2 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -2254,13 +2254,30 @@
     <string name="input_methods_settings_title">Text input</string>
     <!-- Setting name for Input Method chooser -->
     <string name="input_method">Input method</string>
+    <!-- Title for selecting the current input method -->
+    <string name="current_input_method">Current input method</string>
+    <!-- Title for setting the visibility of input method selector-->
+    <string name="input_method_selector">Input method selector</string>
+    <!-- An option to always show input method selector automatically when needed -->
+    <string name="input_method_selector_show_automatically_title">Automatic</string>
+    <!-- An option to always show input method selector -->
+    <string name="input_method_selector_always_show_title">Always show</string>
+    <!-- An option to always hide input method selector -->
+    <string name="input_method_selector_always_hide_title">Always hide</string>
+    <!-- Title for configuring input method settings -->
+    <string name="configure_input_method">Configure input methods</string>
+    <!-- Title for settings of each IME -->
+    <string name="input_method_settings">Settings</string>
+    <!-- Title for settings of active input methods in each IME -->
+    <string name="active_input_method_subtypes">Active input methods</string>
+
     <string name="input_methods_settings_summary">Manage text input options</string>
     <!-- Input Methods Settings localized format string for generating the appropriate "Foo settings" menu label for the Input Method named "Foo" -->
     <string name="input_methods_settings_label_format"><xliff:g id="ime_name">%1$s</xliff:g> settings</string>
-    <!--  The title for the item to manage the settings of enabled the input methods and subtypes. -->
-    <string name="input_methods_and_subtype_enabler_title">Manage Input Methods</string>
-    <!-- Label for selecting the input methods and subtypes to use -->
-    <string name="input_methods_and_subtype_enabler_title_format">Manage input methods in <xliff:g id="ime_application_name">%1$s</xliff:g></string>
+    <!-- Title for the settings of selecting active input methods of an IME -->
+    <string name="input_methods_and_subtype_enabler_title">Select active input methods</string>
+    <!-- Title format for active input methods. "Active input methods in Foo" menu label for the IME named "Foo" -->
+    <string name="input_methods_and_subtype_enabler_title_format">Active input methods in <xliff:g id="ime_application_name">%1$s</xliff:g></string>
     <!-- Summary for on-screen keyboard settings -->
     <string name="onscreen_keyboard_settings_summary">Onscreen keyboard settings</string>
     <!-- Title for built-in keyboard settings -->
diff --git a/res/xml/language_settings.xml b/res/xml/language_settings.xml
index 3afe861..9230496 100644
--- a/res/xml/language_settings.xml
+++ b/res/xml/language_settings.xml
@@ -57,18 +57,20 @@
 
     <PreferenceCategory android:key="keyboard_settings_category"
             android:title="@string/keyboard_settings_category">
-
-        <PreferenceScreen android:key="input_method"
-                android:title="@string/input_method"
+        <PreferenceScreen android:key="current_input_method"
+                android:title="@string/current_input_method"
                 android:widgetLayout="@*android:layout/preference_dialog" />
 
+        <ListPreference android:key="input_method_selector"
+                android:title="@string/input_method_selector"
+                android:persistent="true"
+                android:entryValues="@array/input_method_selector_values"
+                android:entries="@array/input_method_selector_titles"
+                android:defaultValue="@string/input_method_selector_visibility_default_value"/>
+
+        <PreferenceScreen android:key="configure_input_method"
+                android:title="@string/configure_input_method">
+                <intent android:action="android.settings.INPUT_METHOD_SETTINGS"/>
+        </PreferenceScreen>
     </PreferenceCategory>
-
-    <PreferenceScreen
-        android:fragment="com.android.settings.PhysicalKeyboardSettings"
-        android:key="hardkeyboard_category"
-        android:title="@string/builtin_keyboard_settings_title"
-        android:summary="@string/builtin_keyboard_settings_summary">
-    </PreferenceScreen>
-
 </PreferenceScreen>
diff --git a/src/com/android/settings/Settings.java b/src/com/android/settings/Settings.java
index b91c7ee..280f295 100644
--- a/src/com/android/settings/Settings.java
+++ b/src/com/android/settings/Settings.java
@@ -302,6 +302,7 @@
     public static class StorageSettingsActivity extends Settings { }
     public static class WifiSettingsActivity extends Settings { }
     public static class InputMethodAndLanguageSettingsActivity extends Settings { }
+    public static class InputMethodConfigActivity extends Settings { }
     public static class InputMethodAndSubtypeEnablerActivity extends Settings { }
     public static class LocalePickerActivity extends Settings { }
     public static class UserDictionarySettingsActivity extends Settings { }
diff --git a/src/com/android/settings/inputmethod/InputMethodAndLanguageSettings.java b/src/com/android/settings/inputmethod/InputMethodAndLanguageSettings.java
index ef59201..117bec5 100644
--- a/src/com/android/settings/inputmethod/InputMethodAndLanguageSettings.java
+++ b/src/com/android/settings/inputmethod/InputMethodAndLanguageSettings.java
@@ -26,127 +26,74 @@
 import android.content.DialogInterface;
 import android.content.Intent;
 import android.content.pm.ApplicationInfo;
+import android.content.pm.PackageManager;
 import android.content.res.Configuration;
 import android.os.Bundle;
 import android.preference.CheckBoxPreference;
+import android.preference.ListPreference;
 import android.preference.Preference;
 import android.preference.PreferenceGroup;
 import android.preference.PreferenceScreen;
+import android.provider.Settings;
 import android.text.TextUtils;
+import android.util.Log;
 import android.view.inputmethod.InputMethodInfo;
 import android.view.inputmethod.InputMethodManager;
 
 import java.util.ArrayList;
+import java.util.HashMap;
 import java.util.List;
 
-public class InputMethodAndLanguageSettings extends SettingsPreferenceFragment {
+public class InputMethodAndLanguageSettings extends SettingsPreferenceFragment
+        implements Preference.OnPreferenceChangeListener{
 
     private static final String KEY_PHONE_LANGUAGE = "phone_language";
-    private static final String KEY_INPUT_METHOD = "input_method";
-    private static final String KEY_KEYBOARD_SETTINGS_CATEGORY = "keyboard_settings_category";
-    private static final String KEY_HARDKEYBOARD_CATEGORY = "hardkeyboard_category";
-    private boolean mHaveHardKeyboard;
+    private static final String KEY_CURRENT_INPUT_METHOD = "current_input_method";
+    private static final String KEY_INPUT_METHOD_SELECTOR = "input_method_selector";
 
-    private List<InputMethodInfo> mInputMethodProperties;
-    private List<CheckBoxPreference> mCheckboxes;
+    private int mDefaultInputMethodSelectorVisibility = 0;
+    private ListPreference mShowInputMethodSelectorPref;
     private Preference mLanguagePref;
 
-    final TextUtils.SimpleStringSplitter mStringColonSplitter
-            = new TextUtils.SimpleStringSplitter(':');
-
-    private AlertDialog mDialog = null;
-    
-    static public String getInputMethodIdFromKey(String key) {
-        return key;
-    }
-
     @Override
     public void onCreate(Bundle icicle) {
         super.onCreate(icicle);
 
         addPreferencesFromResource(R.xml.language_settings);
 
+        try {
+            mDefaultInputMethodSelectorVisibility = Integer.valueOf(
+                    getString(R.string.input_method_selector_visibility_default_value));
+        } catch (NumberFormatException e) {
+        }
+
         if (getActivity().getAssets().getLocales().length == 1) {
-            getPreferenceScreen().
-                removePreference(findPreference(KEY_PHONE_LANGUAGE));
+            // No "Select language" pref if there's only one system locale available.
+            getPreferenceScreen().removePreference(findPreference(KEY_PHONE_LANGUAGE));
         } else {
             mLanguagePref = findPreference(KEY_PHONE_LANGUAGE);
         }
-
-        Configuration config = getResources().getConfiguration();
-        if (config.keyboard != Configuration.KEYBOARD_QWERTY) {
-            getPreferenceScreen().removePreference(
-                    getPreferenceScreen().findPreference(KEY_HARDKEYBOARD_CATEGORY));
-        } else {
-            mHaveHardKeyboard = true;
-        }
-        mCheckboxes = new ArrayList<CheckBoxPreference>();
-        onCreateIMM();
+        mShowInputMethodSelectorPref = (ListPreference)findPreference(
+                KEY_INPUT_METHOD_SELECTOR);
+        mShowInputMethodSelectorPref.setOnPreferenceChangeListener(this);
+        // TODO: Update current input method name on summary
+        updateInputMethodSelectorSummary(loadInputMethodSelectorVisibility());
 
         new VoiceInputOutputSettings(this).onCreate();
     }
 
-    private boolean isSystemIme(InputMethodInfo property) {
-        return (property.getServiceInfo().applicationInfo.flags
-                & ApplicationInfo.FLAG_SYSTEM) != 0;
-    }
-
-    private void onCreateIMM() {
-        InputMethodManager imm = (InputMethodManager) getSystemService(
-                Context.INPUT_METHOD_SERVICE);
-
-        mInputMethodProperties = imm.getInputMethodList();
-
-        PreferenceGroup keyboardSettingsCategory = (PreferenceGroup) findPreference(
-                KEY_KEYBOARD_SETTINGS_CATEGORY);
-        
-        int N = (mInputMethodProperties == null ? 0 : mInputMethodProperties
-                .size());
-        for (int i = 0; i < N; ++i) {
-            InputMethodInfo property = mInputMethodProperties.get(i);
-            String prefKey = property.getId();
-
-            CharSequence label = property.loadLabel(getActivity().getPackageManager());
-            boolean systemIME = isSystemIme(property);
-            // Add a check box.
-            // Don't show the toggle if it's the only keyboard in the system, or it's a system IME.
-            if (mHaveHardKeyboard || (N > 1 && !systemIME)) {
-                CheckBoxPreference chkbxPref = new CheckBoxPreference(getActivity());
-                chkbxPref.setKey(prefKey);
-                chkbxPref.setTitle(label);
-                keyboardSettingsCategory.addPreference(chkbxPref);
-                mCheckboxes.add(chkbxPref);
-            }
-
-            // If setting activity is available, add a setting screen entry.
-            if (null != property.getSettingsActivity()) {
-                PreferenceScreen prefScreen = new PreferenceScreen(getActivity(), null);
-                String settingsActivity = property.getSettingsActivity();
-                if (settingsActivity.lastIndexOf("/") < 0) {
-                    settingsActivity = property.getPackageName() + "/" + settingsActivity;
-                }
-                prefScreen.setKey(settingsActivity);
-                prefScreen.setTitle(label);
-                if (N == 1) {
-                    prefScreen.setSummary(getResources().getString(
-                            R.string.onscreen_keyboard_settings_summary));
-                } else {
-                    CharSequence settingsLabel = getResources().getString(
-                            R.string.input_methods_settings_label_format, label);
-                    prefScreen.setSummary(settingsLabel);
-                }
-                keyboardSettingsCategory.addPreference(prefScreen);
-            }
+    private void updateInputMethodSelectorSummary(int value) {
+        String[] inputMethodSelectorTitles = getResources().getStringArray(
+                R.array.input_method_selector_titles);
+        if (inputMethodSelectorTitles.length > value) {
+            mShowInputMethodSelectorPref.setSummary(inputMethodSelectorTitles[value]);
+            mShowInputMethodSelectorPref.setValue(String.valueOf(value));
         }
     }
 
     @Override
     public void onResume() {
         super.onResume();
-
-        InputMethodAndSubtypeUtil.loadInputMethodSubtypeList(
-                this, getContentResolver(), mInputMethodProperties);
-
         if (mLanguagePref != null) {
             Configuration conf = getResources().getConfiguration();
             String locale = conf.locale.getDisplayName(conf.locale);
@@ -155,107 +102,58 @@
                 mLanguagePref.setSummary(locale);
             }
         }
+
+        mShowInputMethodSelectorPref.setOnPreferenceChangeListener(this);
     }
 
     @Override
     public void onPause() {
         super.onPause();
-        InputMethodAndSubtypeUtil.saveInputMethodSubtypeList(this, getContentResolver(),
-                mInputMethodProperties, mHaveHardKeyboard);
+        mShowInputMethodSelectorPref.setOnPreferenceChangeListener(null);
     }
 
     @Override
     public boolean onPreferenceTreeClick(PreferenceScreen preferenceScreen, Preference preference) {
-
         // Input Method stuff
         if (Utils.isMonkeyRunning()) {
             return false;
         }
-
-        if (preference instanceof CheckBoxPreference) {
-            final CheckBoxPreference chkPref = (CheckBoxPreference) preference;
-            final String id = getInputMethodIdFromKey(chkPref.getKey());
-            if (chkPref.isChecked()) {
-                InputMethodInfo selImi = null;
-                final int N = mInputMethodProperties.size();
-                for (int i=0; i<N; i++) {
-                    InputMethodInfo imi = mInputMethodProperties.get(i);
-                    if (id.equals(imi.getId())) {
-                        selImi = imi;
-                        if (isSystemIme(imi)) {
-                            // This is a built-in IME, so no need to warn.
-                            return super.onPreferenceTreeClick(preferenceScreen, preference);
-                        }
-                    }
-                }
-                chkPref.setChecked(false);
-                if (selImi == null) {
-                    return super.onPreferenceTreeClick(preferenceScreen, preference);
-                }
-                if (mDialog == null) {
-                    // TODO: DialogFragment?
-                    mDialog = (new AlertDialog.Builder(getActivity()))
-                            .setTitle(android.R.string.dialog_alert_title)
-                            .setIcon(android.R.drawable.ic_dialog_alert)
-                            .setCancelable(true)
-                            .setPositiveButton(android.R.string.ok,
-                                    new DialogInterface.OnClickListener() {
-                                        public void onClick(DialogInterface dialog, int which) {
-                                            chkPref.setChecked(true);
-                                        }
-
-                            })
-                            .setNegativeButton(android.R.string.cancel,
-                                    new DialogInterface.OnClickListener() {
-                                        public void onClick(DialogInterface dialog, int which) {
-                                        }
-
-                            })
-                            .create();
-                } else {
-                    if (mDialog.isShowing()) {
-                        mDialog.dismiss();
-                    }
-                }
-                mDialog.setMessage(getResources().getString(
-                        R.string.ime_security_warning,
-                        selImi.getServiceInfo().applicationInfo.loadLabel(getPackageManager())));
-                mDialog.show();
-            }
-        } else if (preference instanceof PreferenceScreen) {
+        if (preference instanceof PreferenceScreen) {
             if (preference.getFragment() != null) {
                 // Fragment will be handled correctly by the super class.
-            } else if (KEY_INPUT_METHOD.equals(preference.getKey())) {
+            } else if (KEY_CURRENT_INPUT_METHOD.equals(preference.getKey())) {
                 final InputMethodManager imm = (InputMethodManager)
                         getSystemService(Context.INPUT_METHOD_SERVICE);
                 imm.showInputMethodPicker();
-            } else if (preference.getIntent() == null) {
-                PreferenceScreen pref = (PreferenceScreen) preference;
-                String activityName = pref.getKey();
-                String packageName = activityName.substring(0, activityName
-                        .lastIndexOf("."));
-                int slash = activityName.indexOf("/");
-                if (slash > 0) {
-                    packageName = activityName.substring(0, slash);
-                    activityName = activityName.substring(slash + 1);
-                }
-                if (activityName.length() > 0) {
-                    Intent i = new Intent(Intent.ACTION_MAIN);
-                    i.setClassName(packageName, activityName);
-                    startActivity(i);
-                }
             }
         }
         return super.onPreferenceTreeClick(preferenceScreen, preference);
     }
 
-    @Override
-    public void onDestroy() {
-        super.onDestroy();
-        if (mDialog != null) {
-            mDialog.dismiss();
-            mDialog = null;
+    private void saveInputMethodSelectorVisibility(String value) {
+        try {
+            int intValue = Integer.valueOf(value);
+            Settings.Secure.putInt(getContentResolver(),
+                    Settings.Secure.INPUT_METHOD_SELECTOR_VISIBILITY, intValue);
+            updateInputMethodSelectorSummary(intValue);
+        } catch(NumberFormatException e) {
         }
     }
 
+    private int loadInputMethodSelectorVisibility() {
+        return Settings.Secure.getInt(getContentResolver(),
+                Settings.Secure.INPUT_METHOD_SELECTOR_VISIBILITY,
+                mDefaultInputMethodSelectorVisibility);
+    }
+
+    @Override
+    public boolean onPreferenceChange(Preference preference, Object value) {
+        if (preference == mShowInputMethodSelectorPref) {
+            if (value instanceof String) {
+                saveInputMethodSelectorVisibility((String)value);
+            }
+        }
+        return false;
+    }
+
 }
diff --git a/src/com/android/settings/inputmethod/InputMethodAndSubtypeEnabler.java b/src/com/android/settings/inputmethod/InputMethodAndSubtypeEnabler.java
index cb90514..c2c0a07 100644
--- a/src/com/android/settings/inputmethod/InputMethodAndSubtypeEnabler.java
+++ b/src/com/android/settings/inputmethod/InputMethodAndSubtypeEnabler.java
@@ -29,26 +29,32 @@
 import android.preference.Preference;
 import android.preference.PreferenceCategory;
 import android.preference.PreferenceScreen;
+import android.text.TextUtils;
 import android.view.inputmethod.InputMethodInfo;
 import android.view.inputmethod.InputMethodManager;
 import android.view.inputmethod.InputMethodSubtype;
 
 import java.util.ArrayList;
+import java.util.HashMap;
 import java.util.List;
 
 public class InputMethodAndSubtypeEnabler extends SettingsPreferenceFragment {
 
-    private boolean mHaveHardKeyboard;
-
-    private List<InputMethodInfo> mInputMethodProperties;
+    public static final String EXTRA_INPUT_METHOD_ID = "input_method_id";
 
     private AlertDialog mDialog = null;
+    private boolean mHaveHardKeyboard;
+    final private HashMap<String, List<Preference>> mInputMethodPrefsMap =
+        new HashMap<String, List<Preference>>();
+    private List<InputMethodInfo> mInputMethodProperties;
+    private String mInputMethodId;
 
     @Override
     public void onCreate(Bundle icicle) {
         super.onCreate(icicle);
         Configuration config = getResources().getConfiguration();
         mHaveHardKeyboard = (config.keyboard == Configuration.KEYBOARD_QWERTY);
+        mInputMethodId = getActivity().getIntent().getStringExtra(EXTRA_INPUT_METHOD_ID);
         onCreateIMM();
         setPreferenceScreen(createPreferenceHierarchy());
     }
@@ -57,7 +63,7 @@
     public void onResume() {
         super.onResume();
         InputMethodAndSubtypeUtil.loadInputMethodSubtypeList(
-                this, getContentResolver(), mInputMethodProperties);
+                this, getContentResolver(), mInputMethodProperties, mInputMethodPrefsMap);
     }
 
     @Override
@@ -156,53 +162,48 @@
         PreferenceScreen root = getPreferenceManager().createPreferenceScreen(getActivity());
 
         int N = (mInputMethodProperties == null ? 0 : mInputMethodProperties.size());
-        // TODO: Use iterator.
+
         for (int i = 0; i < N; ++i) {
+            final InputMethodInfo imi = mInputMethodProperties.get(i);
+            if (imi.getSubtypes().size() <= 1) continue;
+            String imiId = imi.getId();
+            // Add to this subtype the list when no IME is specified or when the IME of this
+            // subtype is the specified IME.
+            if (!TextUtils.isEmpty(mInputMethodId) && !mInputMethodId.equals(imiId)) {
+                continue;
+            }
             PreferenceCategory keyboardSettingsCategory = new PreferenceCategory(getActivity());
             root.addPreference(keyboardSettingsCategory);
-            InputMethodInfo property = mInputMethodProperties.get(i);
-            String prefKey = property.getId();
 
             PackageManager pm = getPackageManager();
-            CharSequence label = property.loadLabel(pm);
-            boolean systemIME = InputMethodAndSubtypeUtil.isSystemIme(property);
+            CharSequence label = imi.loadLabel(pm);
 
-            keyboardSettingsCategory.setTitle(label);
+            keyboardSettingsCategory.setTitle(getResources().getString(
+                    R.string.input_methods_and_subtype_enabler_title_format, label));
+            keyboardSettingsCategory.setKey(imiId);
 
-            // Add a check box.
-            // Don't show the toggle if it's the only keyboard in the system, or it's a system IME.
-            if (mHaveHardKeyboard || (N > 1 && !systemIME)) {
-                CheckBoxPreference chkbxPref = new CheckBoxPreference(getActivity());
-                chkbxPref.setKey(prefKey);
-                chkbxPref.setTitle(label);
-                keyboardSettingsCategory.addPreference(chkbxPref);
-            }
-
-            ArrayList<InputMethodSubtype> subtypes = property.getSubtypes();
+            ArrayList<InputMethodSubtype> subtypes = imi.getSubtypes();
+            ArrayList<Preference> subtypePreferences = new ArrayList<Preference>();
             if (subtypes.size() > 0) {
-                PreferenceCategory subtypesCategory = new PreferenceCategory(getActivity());
-                subtypesCategory.setTitle(getResources().getString(
-                        R.string.input_methods_and_subtype_enabler_title_format, label));
-                root.addPreference(subtypesCategory);
                 for (InputMethodSubtype subtype: subtypes) {
                     CharSequence subtypeLabel;
                     int nameResId = subtype.getNameResId();
                     if (nameResId != 0) {
-                        subtypeLabel = pm.getText(property.getPackageName(), nameResId,
-                                property.getServiceInfo().applicationInfo);
+                        subtypeLabel = pm.getText(imi.getPackageName(), nameResId,
+                                imi.getServiceInfo().applicationInfo);
                     } else {
                         String mode = subtype.getMode();
                         CharSequence language = subtype.getLocale();
-                        // TODO: Use more friendly Title and UI
                         subtypeLabel = (mode == null ? "" : mode) + ","
                                 + (language == null ? "" : language);
                     }
                     CheckBoxPreference chkbxPref = new CheckBoxPreference(getActivity());
-                    chkbxPref.setKey(prefKey + subtype.hashCode());
+                    chkbxPref.setKey(imiId + subtype.hashCode());
                     chkbxPref.setTitle(subtypeLabel);
-                    chkbxPref.setSummary(label);
-                    subtypesCategory.addPreference(chkbxPref);
+                    keyboardSettingsCategory.addPreference(chkbxPref);
+                    subtypePreferences.add(chkbxPref);
                 }
+                mInputMethodPrefsMap.put(imiId, subtypePreferences);
             }
         }
         return root;
diff --git a/src/com/android/settings/inputmethod/InputMethodAndSubtypeUtil.java b/src/com/android/settings/inputmethod/InputMethodAndSubtypeUtil.java
index 288e6c2..460bc9c 100644
--- a/src/com/android/settings/inputmethod/InputMethodAndSubtypeUtil.java
+++ b/src/com/android/settings/inputmethod/InputMethodAndSubtypeUtil.java
@@ -21,6 +21,7 @@
 import android.content.ContentResolver;
 import android.content.pm.ApplicationInfo;
 import android.preference.CheckBoxPreference;
+import android.preference.Preference;
 import android.preference.PreferenceScreen;
 import android.provider.Settings;
 import android.provider.Settings.SettingNotFoundException;
@@ -32,6 +33,7 @@
 import java.util.HashMap;
 import java.util.HashSet;
 import java.util.List;
+import java.util.Map;
 
 public class InputMethodAndSubtypeUtil {
 
@@ -48,6 +50,42 @@
     private static final TextUtils.SimpleStringSplitter sStringInputMethodSubtypeSplitter
             = new TextUtils.SimpleStringSplitter(INPUT_METHOD_SUBTYPE_SEPARATER);
 
+    private static void buildEnabledInputMethodsString(
+            StringBuilder builder, String imi, HashSet<String> subtypes) {
+        builder.append(imi);
+        // Inputmethod and subtypes are saved in the settings as follows:
+        // ime0;subtype0;subtype1:ime1;subtype0:ime2:ime3;subtype0;subtype1
+        for (String subtypeId: subtypes) {
+            builder.append(INPUT_METHOD_SUBTYPE_SEPARATER).append(subtypeId);
+        }
+    }
+
+    public static void buildInputMethodsAndSubtypesString(
+            StringBuilder builder, HashMap<String, HashSet<String>> imsList) {
+        boolean needsAppendSeparator = false;
+        for (String imi: imsList.keySet()) {
+            if (needsAppendSeparator) {
+                builder.append(INPUT_METHOD_SEPARATER);
+            } else {
+                needsAppendSeparator = true;
+            }
+            buildEnabledInputMethodsString(builder, imi, imsList.get(imi));
+        }
+    }
+
+    public static void buildDisabledSystemInputMethods(
+            StringBuilder builder, HashSet<String> imes) {
+        boolean needsAppendSeparator = false;
+        for (String ime: imes) {
+            if (needsAppendSeparator) {
+                builder.append(INPUT_METHOD_SEPARATER);
+            } else {
+                needsAppendSeparator = true;
+            }
+            builder.append(ime);
+        }
+    }
+
     private static int getInputMethodSubtypeSelected(ContentResolver resolver) {
         try {
             return Settings.Secure.getInt(resolver,
@@ -96,82 +134,117 @@
         return imsList;
     }
 
-    public static void saveInputMethodSubtypeList(
-            SettingsPreferenceFragment context, ContentResolver resolver,
-            List<InputMethodInfo> inputMethodProperties, boolean hasHardKeyboard) {
+    private static HashSet<String> getDisabledSystemIMEs(ContentResolver resolver) {
+        HashSet<String> set = new HashSet<String>();
+        String disabledIMEsStr = Settings.Secure.getString(
+                resolver, Settings.Secure.DISABLED_SYSTEM_INPUT_METHODS);
+        sStringInputMethodSplitter.setString(disabledIMEsStr);
+        while(sStringInputMethodSplitter.hasNext()) {
+            set.add(sStringInputMethodSplitter.next());
+        }
+        return set;
+    }
+
+    public static void saveInputMethodSubtypeList(SettingsPreferenceFragment context,
+            ContentResolver resolver, List<InputMethodInfo> inputMethodInfos,
+            boolean hasHardKeyboard) {
         String currentInputMethodId = Settings.Secure.getString(resolver,
                 Settings.Secure.DEFAULT_INPUT_METHOD);
         final int selectedInputMethodSubtype = getInputMethodSubtypeSelected(resolver);
+        HashMap<String, HashSet<String>> enabledIMEAndSubtypesMap =
+                getEnabledInputMethodsAndSubtypeList(resolver);
+        HashSet<String> disabledSystemIMEs = getDisabledSystemIMEs(resolver);
 
-        StringBuilder builder = new StringBuilder();
-        StringBuilder disabledSysImes = new StringBuilder();
-        int firstSubtypeHashCode = NOT_A_SUBTYPE_ID;
-
-        final boolean onlyOneIME = inputMethodProperties.size() == 1;
-        boolean existsSelectedIME = false;
-        for (InputMethodInfo property : inputMethodProperties) {
-            final String id = property.getId();
-            CheckBoxPreference pref = (CheckBoxPreference) context.findPreference(id);
-            boolean isCurrentInputMethod = id.equals(currentInputMethodId);
-            boolean systemIme = isSystemIme(property);
-            // TODO: Append subtypes by using the separator ";"
-            if (((onlyOneIME || systemIme) && !hasHardKeyboard)
-                    || (pref != null && pref.isChecked())) {
-                if (builder.length() > 0) builder.append(INPUT_METHOD_SEPARATER);
-                builder.append(id);
-                for (InputMethodSubtype subtype : property.getSubtypes()) {
+        final boolean onlyOneIME = inputMethodInfos.size() == 1;
+        boolean existsSelectedSubtype = false;
+        for (InputMethodInfo imi : inputMethodInfos) {
+            final String imiId = imi.getId();
+            Preference pref = context.findPreference(imiId);
+            if (pref == null) continue;
+            // In the Configure input method screen or in the subtype enabler screen.
+            // pref is instance of CheckBoxPreference in the Configure input method screen.
+            final boolean isImeChecked = (pref instanceof CheckBoxPreference) ?
+                    ((CheckBoxPreference) pref).isChecked()
+                            : enabledIMEAndSubtypesMap.containsKey(imiId);
+            boolean isCurrentInputMethod = imiId.equals(currentInputMethodId);
+            boolean systemIme = isSystemIme(imi);
+            if (((onlyOneIME || systemIme) && !hasHardKeyboard) || isImeChecked) {
+                if (!enabledIMEAndSubtypesMap.containsKey(imiId)) {
+                    // imiId has just been enabled
+                    enabledIMEAndSubtypesMap.put(imiId, new HashSet<String>());
+                }
+                HashSet<String> subtypesSet = enabledIMEAndSubtypesMap.get(imiId);
+                for (InputMethodSubtype subtype : imi.getSubtypes()) {
+                    final String subtypeHashCodeStr = String.valueOf(subtype.hashCode());
                     CheckBoxPreference subtypePref = (CheckBoxPreference) context.findPreference(
-                            id + subtype.hashCode());
-                    if (subtypePref != null && subtypePref.isChecked()) {
-                        builder.append(INPUT_METHOD_SUBTYPE_SEPARATER).append(subtype.hashCode());
+                            imiId + subtypeHashCodeStr);
+                    // In the Configure input method screen which does not have subtype preferences.
+                    if (subtypePref == null) continue;
+                    if (subtypePref.isChecked()) {
+                        subtypesSet.add(subtypeHashCodeStr);
                         if (isCurrentInputMethod) {
                             if (selectedInputMethodSubtype == subtype.hashCode()) {
-                                existsSelectedIME = true;
-                            } else if (firstSubtypeHashCode == NOT_A_SUBTYPE_ID) {
-                                firstSubtypeHashCode = subtype.hashCode();
+                                existsSelectedSubtype = true;
                             }
                         }
+                    } else {
+                        subtypesSet.remove(subtypeHashCodeStr);
                     }
                 }
-            } else if (isCurrentInputMethod) {
-                // We are processing the current input method, but found that it's not enabled.
-                // This means that the current input method has been uninstalled.
-                // If currentInputMethod is already uninstalled, InputMethodManagerService will
-                // find the applicable IME from the history and the system locale.
-                if (DEBUG) {
-                    Log.d(TAG, "Current IME was uninstalled or disabled.");
+            } else {
+                enabledIMEAndSubtypesMap.remove(imiId);
+                if (isCurrentInputMethod) {
+                    // We are processing the current input method, but found that it's not enabled.
+                    // This means that the current input method has been uninstalled.
+                    // If currentInputMethod is already uninstalled, InputMethodManagerService will
+                    // find the applicable IME from the history and the system locale.
+                    if (DEBUG) {
+                        Log.d(TAG, "Current IME was uninstalled or disabled.");
+                    }
                 }
             }
             // If it's a disabled system ime, add it to the disabled list so that it
             // doesn't get enabled automatically on any changes to the package list
-            if (pref != null && !pref.isChecked() && systemIme && hasHardKeyboard) {
-                if (disabledSysImes.length() > 0) disabledSysImes.append(INPUT_METHOD_SEPARATER);
-                disabledSysImes.append(id);
+            if (systemIme && hasHardKeyboard) {
+                if (disabledSystemIMEs.contains(imiId)) {
+                    if (isImeChecked) {
+                        disabledSystemIMEs.remove(imiId);
+                    }
+                } else {
+                    if (!isImeChecked) {
+                        disabledSystemIMEs.add(imiId);
+                    }
+                }
             }
         }
 
+        StringBuilder builder = new StringBuilder();
+        buildInputMethodsAndSubtypesString(builder, enabledIMEAndSubtypesMap);
+        StringBuilder disabledSysImesBuilder = new StringBuilder();
+        buildDisabledSystemInputMethods(disabledSysImesBuilder, disabledSystemIMEs);
         if (DEBUG) {
             Log.d(TAG, "--- Save enabled inputmethod settings. :" + builder.toString());
             Log.d(TAG, "--- Save disable system inputmethod settings. :"
-                    + disabledSysImes.toString());
+                    + disabledSysImesBuilder.toString());
             Log.d(TAG, "--- Save default inputmethod settings. :" + currentInputMethodId);
         }
 
         // Redefines SelectedSubtype when all subtypes are unchecked or there is no subtype
         // selected. And if the selected subtype of the current input method was disabled,
         // We should reset the selected input method's subtype.
-        if (!existsSelectedIME || !isInputMethodSubtypeSelected(resolver)) {
+        if (!existsSelectedSubtype || !isInputMethodSubtypeSelected(resolver)) {
             if (DEBUG) {
-                Log.d(TAG, "--- Set inputmethod subtype because it's not defined."
-                        + firstSubtypeHashCode);
+                Log.d(TAG, "--- Reset inputmethod subtype because it's not defined.");
             }
-            putSelectedInputMethodSubtype(resolver, firstSubtypeHashCode);
+            putSelectedInputMethodSubtype(resolver, NOT_A_SUBTYPE_ID);
         }
 
         Settings.Secure.putString(resolver,
                 Settings.Secure.ENABLED_INPUT_METHODS, builder.toString());
-        Settings.Secure.putString(resolver,
-                Settings.Secure.DISABLED_SYSTEM_INPUT_METHODS, disabledSysImes.toString());
+        if (disabledSysImesBuilder.length() > 0) {
+            Settings.Secure.putString(resolver, Settings.Secure.DISABLED_SYSTEM_INPUT_METHODS,
+                    disabledSysImesBuilder.toString());
+        }
         // If the current input method is unset, InputMethodManagerService will find the applicable
         // IME from the history and the system locale.
         Settings.Secure.putString(resolver, Settings.Secure.DEFAULT_INPUT_METHOD,
@@ -180,18 +253,25 @@
 
     public static void loadInputMethodSubtypeList(
             SettingsPreferenceFragment context, ContentResolver resolver,
-            List<InputMethodInfo> inputMethodProperties) {
+            List<InputMethodInfo> inputMethodInfos,
+            final Map<String, List<Preference>> inputMethodPrefsMap) {
         HashMap<String, HashSet<String>> enabledSubtypes =
-                getEnabledInputMethodsAndSubtypeList(resolver);
+            getEnabledInputMethodsAndSubtypeList(resolver);
 
-        for (InputMethodInfo property : inputMethodProperties) {
-            final String id = property.getId();
-            CheckBoxPreference pref = (CheckBoxPreference) context.findPreference(id);
-            if (pref != null) {
-                boolean isEnabled = enabledSubtypes.containsKey(id);
-                pref.setChecked(isEnabled);
-                setSubtypesPreferenceEnabled(context, inputMethodProperties, id, isEnabled);
-                updateSubtypesPreferenceChecked(context, inputMethodProperties, enabledSubtypes);
+        for (InputMethodInfo imi : inputMethodInfos) {
+            final String imiId = imi.getId();
+            Preference pref = context.findPreference(imiId);
+            if (pref != null && pref instanceof CheckBoxPreference) {
+                CheckBoxPreference checkBoxPreference = (CheckBoxPreference) pref;
+                boolean isEnabled = enabledSubtypes.containsKey(imiId);
+                checkBoxPreference.setChecked(isEnabled);
+                if (inputMethodPrefsMap != null) {
+                    for (Preference childPref: inputMethodPrefsMap.get(imiId)) {
+                        childPref.setEnabled(isEnabled);
+                    }
+                }
+                setSubtypesPreferenceEnabled(context, inputMethodInfos, imiId, isEnabled);
+                updateSubtypesPreferenceChecked(context, inputMethodInfos, enabledSubtypes);
             }
         }
     }
diff --git a/src/com/android/settings/inputmethod/InputMethodConfig.java b/src/com/android/settings/inputmethod/InputMethodConfig.java
new file mode 100644
index 0000000..640a773
--- /dev/null
+++ b/src/com/android/settings/inputmethod/InputMethodConfig.java
@@ -0,0 +1,237 @@
+/*
+ * Copyright (C) 2010 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.settings.inputmethod;
+
+import com.android.settings.R;
+import com.android.settings.SettingsPreferenceFragment;
+
+import android.app.AlertDialog;
+import android.content.Context;
+import android.content.DialogInterface;
+import android.content.Intent;
+import android.content.pm.PackageManager;
+import android.content.res.Configuration;
+import android.os.Bundle;
+import android.preference.CheckBoxPreference;
+import android.preference.Preference;
+import android.preference.PreferenceCategory;
+import android.preference.PreferenceScreen;
+import android.provider.Settings;
+import android.text.TextUtils;
+import android.view.inputmethod.InputMethodInfo;
+import android.view.inputmethod.InputMethodManager;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+
+public class InputMethodConfig extends SettingsPreferenceFragment {
+
+    private static final String KEY_PHYSICALKEYBOARD_CATEGORY = "hardkeyboard_category";
+    private static final String PHYSICALKEYBOARD_SETTINGS_FRAGMENT
+            = "com.android.settings.PhysicalKeyboardSettings";
+
+    private AlertDialog mDialog = null;
+    private boolean mHaveHardKeyboard;
+    // Map of imi and its preferences
+    final private HashMap<String, List<Preference>> mInputMethodPrefsMap =
+        new HashMap<String, List<Preference>>();
+    private List<InputMethodInfo> mInputMethodProperties;
+
+
+    @Override
+    public void onCreate(Bundle icicle) {
+        super.onCreate(icicle);
+        Configuration config = getResources().getConfiguration();
+        mHaveHardKeyboard = (config.keyboard == Configuration.KEYBOARD_QWERTY);
+        InputMethodManager imm = (InputMethodManager) getSystemService(
+                Context.INPUT_METHOD_SERVICE);
+
+        // TODO: Change mInputMethodProperties to Map
+        mInputMethodProperties = imm.getInputMethodList();
+        setPreferenceScreen(createPreferenceHierarchy());
+    }
+
+    @Override
+    public void onResume() {
+        super.onResume();
+        InputMethodAndSubtypeUtil.loadInputMethodSubtypeList(
+                this, getContentResolver(), mInputMethodProperties, mInputMethodPrefsMap);
+    }
+
+    @Override
+    public void onPause() {
+        super.onPause();
+        InputMethodAndSubtypeUtil.saveInputMethodSubtypeList(this, getContentResolver(),
+                mInputMethodProperties, mHaveHardKeyboard);
+    }
+
+    private void showSecurityWarnDialog(InputMethodInfo imi, final CheckBoxPreference chkPref,
+            final String imiId) {
+        if (mDialog == null) {
+            mDialog = (new AlertDialog.Builder(getActivity()))
+                    .setTitle(android.R.string.dialog_alert_title)
+                    .setIcon(android.R.drawable.ic_dialog_alert)
+                    .setCancelable(true)
+                    .setPositiveButton(android.R.string.ok,
+                            new DialogInterface.OnClickListener() {
+                        public void onClick(DialogInterface dialog, int which) {
+                            chkPref.setChecked(true);
+                            for (Preference pref: mInputMethodPrefsMap.get(imiId)) {
+                                pref.setEnabled(true);
+                            }
+                        }
+                    })
+                    .setNegativeButton(android.R.string.cancel,
+                            new DialogInterface.OnClickListener() {
+                        public void onClick(DialogInterface dialog, int which) {
+                        }
+                    })
+                    .create();
+        } else {
+            if (mDialog.isShowing()) {
+                mDialog.dismiss();
+            }
+        }
+        mDialog.setMessage(getResources().getString(R.string.ime_security_warning,
+                imi.getServiceInfo().applicationInfo.loadLabel(getPackageManager())));
+        mDialog.show();
+    }
+
+    private InputMethodInfo getInputMethodInfoFromImiId(String imiId) {
+        final int N = mInputMethodProperties.size();
+        for (int i = 0; i < N; ++i) {
+            InputMethodInfo imi = mInputMethodProperties.get(i);
+            if (imiId.equals(imi.getId())) {
+                return imi;
+            }
+        }
+        return null;
+    }
+
+    @Override
+    public boolean onPreferenceTreeClick(
+            PreferenceScreen preferenceScreen, Preference preference) {
+
+        if (preference instanceof CheckBoxPreference) {
+            final CheckBoxPreference chkPref = (CheckBoxPreference) preference;
+            final String imiId = chkPref.getKey();
+            if (chkPref.isChecked()) {
+                InputMethodInfo selImi = getInputMethodInfoFromImiId(imiId);
+                if (selImi != null) {
+                    if (InputMethodAndSubtypeUtil.isSystemIme(selImi)) {
+                        // This is a built-in IME, so no need to warn.
+                        return super.onPreferenceTreeClick(preferenceScreen, preference);
+                    }
+                } else {
+                    return super.onPreferenceTreeClick(preferenceScreen, preference);
+                }
+                chkPref.setChecked(false);
+                showSecurityWarnDialog(selImi, chkPref, imiId);
+            } else {
+                for (Preference pref: mInputMethodPrefsMap.get(imiId)) {
+                    pref.setEnabled(false);
+                }
+            }
+        }
+        return super.onPreferenceTreeClick(preferenceScreen, preference);
+    }
+
+    @Override
+    public void onDestroy() {
+        super.onDestroy();
+        if (mDialog != null) {
+            mDialog.dismiss();
+            mDialog = null;
+        }
+    }
+
+    private void addHardKeyboardPreference(PreferenceScreen root) {
+        PreferenceCategory keyboardSettingsCategory = new PreferenceCategory(getActivity());
+        keyboardSettingsCategory.setTitle(R.string.builtin_keyboard_settings_title);
+        root.addPreference(keyboardSettingsCategory);
+        PreferenceScreen prefScreen = new PreferenceScreen(getActivity(), null);
+        prefScreen.setKey(KEY_PHYSICALKEYBOARD_CATEGORY);
+        prefScreen.setTitle(R.string.builtin_keyboard_settings_title);
+        prefScreen.setSummary(R.string.builtin_keyboard_settings_summary);
+        prefScreen.setFragment(PHYSICALKEYBOARD_SETTINGS_FRAGMENT);
+    }
+
+    private void addInputMethodPreference(PreferenceScreen root, InputMethodInfo imi,
+            final int imiSize) {
+        PreferenceCategory keyboardSettingsCategory = new PreferenceCategory(getActivity());
+        root.addPreference(keyboardSettingsCategory);
+        final String imiId = imi.getId();
+        mInputMethodPrefsMap.put(imiId, new ArrayList<Preference>());
+
+        PackageManager pm = getPackageManager();
+        CharSequence label = imi.loadLabel(pm);
+        keyboardSettingsCategory.setTitle(label);
+
+        final boolean isSystemIME = InputMethodAndSubtypeUtil.isSystemIme(imi);
+        // Add a check box for enabling/disabling IME
+        CheckBoxPreference chkbxPref = new CheckBoxPreference(getActivity());
+        chkbxPref.setKey(imiId);
+        chkbxPref.setTitle(label);
+        keyboardSettingsCategory.addPreference(chkbxPref);
+        // Disable the toggle if it's the only keyboard in the system, or it's a system IME.
+        if (!mHaveHardKeyboard && (imiSize <= 1 || isSystemIME)) {
+            chkbxPref.setEnabled(false);
+        }
+
+        Intent intent;
+        // Add subtype settings when this IME has two or more subtypes.
+        PreferenceScreen prefScreen = new PreferenceScreen(getActivity(), null);
+        prefScreen.setTitle(R.string.active_input_method_subtypes);
+        if (imi.getSubtypes().size() > 1) {
+            intent = new Intent(Settings.ACTION_INPUT_METHOD_AND_SUBTYPE_ENABLER);
+            intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK
+                    | Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED
+                    | Intent.FLAG_ACTIVITY_CLEAR_TOP);
+            intent.putExtra(InputMethodAndSubtypeEnabler.EXTRA_INPUT_METHOD_ID, imiId);
+            prefScreen.setIntent(intent);
+            keyboardSettingsCategory.addPreference(prefScreen);
+            mInputMethodPrefsMap.get(imiId).add(prefScreen);
+        }
+
+        // Add IME settings
+        String settingsActivity = imi.getSettingsActivity();
+        if (!TextUtils.isEmpty(settingsActivity)) {
+            prefScreen = new PreferenceScreen(getActivity(), null);
+            prefScreen.setTitle(R.string.input_method_settings);
+            intent = new Intent(Intent.ACTION_MAIN);
+            intent.setClassName(imi.getPackageName(), settingsActivity);
+            prefScreen.setIntent(intent);
+            keyboardSettingsCategory.addPreference(prefScreen);
+            mInputMethodPrefsMap.get(imiId).add(prefScreen);
+        }
+    }
+
+    private PreferenceScreen createPreferenceHierarchy() {
+        // Root
+        PreferenceScreen root = getPreferenceManager().createPreferenceScreen(getActivity());
+        if (mHaveHardKeyboard) {
+            addHardKeyboardPreference(root);
+        }
+
+        final int N = (mInputMethodProperties == null ? 0 : mInputMethodProperties.size());
+        for (int i = 0; i < N; ++i) {
+            addInputMethodPreference(root, mInputMethodProperties.get(i), N);
+        }
+        return root;
+    }
+}
