diff --git a/res/xml/language_settings.xml b/res/xml/language_settings.xml
index 9074d0a..d829dc4 100644
--- a/res/xml/language_settings.xml
+++ b/res/xml/language_settings.xml
@@ -15,9 +15,8 @@
 -->
 
 <PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"
-                  xmlns:settings="http://schemas.android.com/apk/res/com.android.settings"
-        android:key="language_keyboard_settings"
-        android:title="@string/language_keyboard_settings_title">
+                  android:key="language_keyboard_settings"
+                  android:title="@string/language_keyboard_settings_title">
 
     <PreferenceScreen
             android:key="phone_language"
@@ -50,26 +49,6 @@
             android:fragment="com.android.settings.inputmethod.PhysicalKeyboardFragment" />
     </PreferenceCategory>
 
-    <!-- Temporarily disabled: -->
-    <!--<PreferenceCategory-->
-            <!--android:key="keyboard_settings_category"-->
-            <!--android:title="@string/keyboard_settings_category">-->
-
-        <!--<PreferenceScreen-->
-                <!--android:key="current_input_method"-->
-                <!--android:title="@string/current_input_method"-->
-                <!--/>-->
-        <!--&lt;!&ndash; Enabled input method list will be populated programmatically here. &ndash;&gt;-->
-    <!--</PreferenceCategory>-->
-
-    <!--<PreferenceCategory-->
-            <!--android:key="hard_keyboard"-->
-            <!--android:title="@string/builtin_keyboard_settings_title"-->
-            <!--android:persistent="false">-->
-        <!--&lt;!&ndash; Additional preference screens are inserted here programmatically-->
-             <!--with low order values to set the key map of each attached keyboard. &ndash;&gt;-->
-    <!--</PreferenceCategory>-->
-
     <PreferenceCategory
             android:key="voice_category"
             android:title="@string/voice_category" >
diff --git a/src/com/android/settings/inputmethod/InputMethodAndLanguageSettings.java b/src/com/android/settings/inputmethod/InputMethodAndLanguageSettings.java
index f1fa70d..ea6c529 100644
--- a/src/com/android/settings/inputmethod/InputMethodAndLanguageSettings.java
+++ b/src/com/android/settings/inputmethod/InputMethodAndLanguageSettings.java
@@ -18,20 +18,14 @@
 
 import android.app.Activity;
 import android.app.Fragment;
-import android.app.admin.DevicePolicyManager;
 import android.content.ComponentName;
-import android.content.ContentResolver;
 import android.content.Context;
 import android.content.Intent;
-import android.content.SharedPreferences;
 import android.content.pm.ServiceInfo;
-import android.content.res.Configuration;
-import android.database.ContentObserver;
 import android.hardware.input.InputDeviceIdentifier;
 import android.hardware.input.InputManager;
 import android.hardware.input.KeyboardLayout;
 import android.os.Bundle;
-import android.os.Handler;
 import android.provider.Settings;
 import android.provider.Settings.System;
 import android.speech.tts.TtsEngines;
@@ -39,9 +33,6 @@
 import android.support.v7.preference.Preference;
 import android.support.v7.preference.Preference.OnPreferenceClickListener;
 import android.support.v7.preference.PreferenceCategory;
-import android.support.v7.preference.PreferenceManager;
-import android.support.v7.preference.PreferenceScreen;
-import android.text.TextUtils;
 import android.view.InputDevice;
 import android.view.inputmethod.InputMethodInfo;
 import android.view.inputmethod.InputMethodManager;
@@ -65,39 +56,23 @@
 import com.android.settings.search.Indexable;
 import com.android.settings.search.SearchIndexableRaw;
 
-import java.text.Collator;
 import java.util.ArrayList;
-import java.util.Collections;
-import java.util.Comparator;
-import java.util.HashMap;
-import java.util.HashSet;
 import java.util.List;
 import java.util.TreeSet;
 
 public class InputMethodAndLanguageSettings extends SettingsPreferenceFragment
         implements InputManager.InputDeviceListener,
-        KeyboardLayoutDialogFragment.OnSetupKeyboardLayoutsListener, Indexable,
-        InputMethodPreference.OnSavePreferenceListener {
+        KeyboardLayoutDialogFragment.OnSetupKeyboardLayoutsListener, Indexable {
+
     private static final String KEY_SPELL_CHECKERS = "spellcheckers_settings";
     private static final String KEY_PHONE_LANGUAGE = "phone_language";
-    private static final String KEY_CURRENT_INPUT_METHOD = "current_input_method";
     private static final String KEY_USER_DICTIONARY_SETTINGS = "key_user_dictionary_settings";
-    private static final String KEY_PREVIOUSLY_ENABLED_SUBTYPES = "previously_enabled_subtypes";
 
-    private PreferenceCategory mKeyboardSettingsCategory;
-    private PreferenceCategory mHardKeyboardCategory;
     private PreferenceCategory mGameControllerCategory;
     private Preference mLanguagePref;
-    private final ArrayList<InputMethodPreference> mInputMethodPreferenceList = new ArrayList<>();
-    private final ArrayList<PreferenceScreen> mHardKeyboardPreferenceList = new ArrayList<>();
     private InputManager mIm;
-    private InputMethodManager mImm;
-    private boolean mShowsOnlyFullImeAndKeyboardList;
-    private Handler mHandler;
-    private SettingsObserver mSettingsObserver;
     private Intent mIntentWaitingForResult;
     private InputMethodSettingValuesWrapper mInputMethodSettingValues;
-    private DevicePolicyManager mDpm;
 
     @Override
     public int getMetricsCategory() {
@@ -111,7 +86,6 @@
         addPreferencesFromResource(R.xml.language_settings);
 
         final Activity activity = getActivity();
-        mImm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
         mInputMethodSettingValues = InputMethodSettingValuesWrapper.getInstance(activity);
 
         if (activity.getAssets().getLocales().length == 1) {
@@ -123,28 +97,9 @@
 
         new VoiceInputOutputSettings(this).onCreate();
 
-        // Get references to dynamically constructed categories.
-        mHardKeyboardCategory = (PreferenceCategory)findPreference("hard_keyboard");
-        mKeyboardSettingsCategory = (PreferenceCategory)findPreference(
-                "keyboard_settings_category");
         mGameControllerCategory = (PreferenceCategory)findPreference(
                 "game_controller_settings_category");
 
-        final Intent startingIntent = activity.getIntent();
-        // Filter out irrelevant features if invoked from IME settings button.
-        mShowsOnlyFullImeAndKeyboardList = Settings.ACTION_INPUT_METHOD_SETTINGS.equals(
-                startingIntent.getAction());
-        if (mShowsOnlyFullImeAndKeyboardList) {
-            getPreferenceScreen().removeAll();
-            if (mHardKeyboardCategory != null) {
-                getPreferenceScreen().addPreference(mHardKeyboardCategory);
-            }
-            if (mKeyboardSettingsCategory != null) {
-                mKeyboardSettingsCategory.removeAll();
-                getPreferenceScreen().addPreference(mKeyboardSettingsCategory);
-            }
-        }
-
         // Build hard keyboard and game controller preference categories.
         mIm = (InputManager)activity.getSystemService(Context.INPUT_SERVICE);
         updateInputDevices();
@@ -162,19 +117,6 @@
                     R.string.spellcheckers_settings_title);
             spellChecker.setIntent(intent);
         }
-
-        mHandler = new Handler();
-        mSettingsObserver = new SettingsObserver(mHandler, activity);
-        mDpm = (DevicePolicyManager) (getActivity().
-                getSystemService(Context.DEVICE_POLICY_SERVICE));
-
-        // If we've launched from the keyboard layout notification, go ahead and just show the
-        // keyboard layout dialog.
-        final InputDeviceIdentifier identifier =
-                startingIntent.getParcelableExtra(Settings.EXTRA_INPUT_DEVICE_IDENTIFIER);
-        if (mShowsOnlyFullImeAndKeyboardList && identifier != null) {
-            showKeyboardLayoutDialog(identifier);
-        }
     }
 
     private void updateUserDictionaryPreference(Preference userDictionaryPreference) {
@@ -221,7 +163,6 @@
     public void onResume() {
         super.onResume();
 
-        mSettingsObserver.resume();
         mIm.registerInputDeviceListener(this, null);
 
         final Preference spellChecker = findPreference(KEY_SPELL_CHECKERS);
@@ -240,22 +181,19 @@
             }
         }
 
-        if (!mShowsOnlyFullImeAndKeyboardList) {
-            if (mLanguagePref != null) {
-                final String localeNames = FeatureFactory.getFactory(getContext())
-                        .getLocaleFeatureProvider().getLocaleNames();
-                mLanguagePref.setSummary(localeNames);
-            }
-
-            updateUserDictionaryPreference(findPreference(KEY_USER_DICTIONARY_SETTINGS));
+        if (mLanguagePref != null) {
+            final String localeNames = FeatureFactory.getFactory(getContext())
+                    .getLocaleFeatureProvider().getLocaleNames();
+            mLanguagePref.setSummary(localeNames);
         }
 
+        updateUserDictionaryPreference(findPreference(KEY_USER_DICTIONARY_SETTINGS));
+
         updateInputDevices();
 
         // Refresh internal states in mInputMethodSettingValues to keep the latest
         // "InputMethodInfo"s and "InputMethodSubtype"s
         mInputMethodSettingValues.refreshAllInputMethodAndSubtypes();
-        updateInputMethodPreferenceViews();
     }
 
     @Override
@@ -263,12 +201,11 @@
         super.onPause();
 
         mIm.unregisterInputDeviceListener(this);
-        mSettingsObserver.pause();
 
         // TODO: Consolidate the logic to InputMethodSettingsWrapper
         InputMethodAndSubtypeUtil.saveInputMethodSubtypeList(
                 this, getContentResolver(), mInputMethodSettingValues.getInputMethodList(),
-                !mHardKeyboardPreferenceList.isEmpty());
+                false /* hasHardKeyboard */);
     }
 
     @Override
@@ -292,15 +229,7 @@
         if (Utils.isMonkeyRunning()) {
             return false;
         }
-        if (preference instanceof PreferenceScreen) {
-            if (preference.getFragment() != null) {
-                // Fragment will be handled correctly by the super class.
-            } else if (KEY_CURRENT_INPUT_METHOD.equals(preference.getKey())) {
-                final InputMethodManager imm = (InputMethodManager)
-                        getSystemService(Context.INPUT_METHOD_SERVICE);
-                imm.showInputMethodPicker(false /* showAuxiliarySubtypes */);
-            }
-        } else if (preference instanceof SwitchPreference) {
+        if (preference instanceof SwitchPreference) {
             final SwitchPreference pref = (SwitchPreference) preference;
             if (pref == mGameControllerCategory.findPreference("vibrate_input_devices")) {
                 System.putInt(getContentResolver(), Settings.System.VIBRATE_INPUT_DEVICES,
@@ -311,202 +240,10 @@
         return super.onPreferenceTreeClick(preference);
     }
 
-    private void updateInputMethodPreferenceViews() {
-        if (mKeyboardSettingsCategory == null) {
-            return;
-        }
-
-        synchronized (mInputMethodPreferenceList) {
-            // Clear existing "InputMethodPreference"s
-            for (final InputMethodPreference pref : mInputMethodPreferenceList) {
-                mKeyboardSettingsCategory.removePreference(pref);
-            }
-            mInputMethodPreferenceList.clear();
-            List<String> permittedList = mDpm.getPermittedInputMethodsForCurrentUser();
-            final Context context = getPrefContext();
-            final List<InputMethodInfo> imis = mShowsOnlyFullImeAndKeyboardList
-                    ? mInputMethodSettingValues.getInputMethodList()
-                    : mImm.getEnabledInputMethodList();
-            final int N = (imis == null ? 0 : imis.size());
-            for (int i = 0; i < N; ++i) {
-                final InputMethodInfo imi = imis.get(i);
-                final boolean isAllowedByOrganization = permittedList == null
-                        || permittedList.contains(imi.getPackageName());
-                final InputMethodPreference pref = new InputMethodPreference(
-                        context, imi, mShowsOnlyFullImeAndKeyboardList /* hasSwitch */,
-                        isAllowedByOrganization, this);
-                mInputMethodPreferenceList.add(pref);
-            }
-            final Collator collator = Collator.getInstance();
-            Collections.sort(mInputMethodPreferenceList, new Comparator<InputMethodPreference>() {
-                @Override
-                public int compare(InputMethodPreference lhs, InputMethodPreference rhs) {
-                    return lhs.compareTo(rhs, collator);
-                }
-            });
-            for (int i = 0; i < N; ++i) {
-                final InputMethodPreference pref = mInputMethodPreferenceList.get(i);
-                mKeyboardSettingsCategory.addPreference(pref);
-                InputMethodAndSubtypeUtil.removeUnnecessaryNonPersistentPreference(pref);
-                pref.updatePreferenceViews();
-            }
-        }
-        updateCurrentImeName();
-        // TODO: Consolidate the logic with InputMethodSettingsWrapper
-        // CAVEAT: The preference class here does not know about the default value - that is
-        // managed by the Input Method Manager Service, so in this case it could save the wrong
-        // value. Hence we must update the checkboxes here.
-        InputMethodAndSubtypeUtil.loadInputMethodSubtypeList(
-                this, getContentResolver(),
-                mInputMethodSettingValues.getInputMethodList(), null);
-    }
-
-    @Override
-    public void onSaveInputMethodPreference(final InputMethodPreference pref) {
-        final InputMethodInfo imi = pref.getInputMethodInfo();
-        if (!pref.isChecked()) {
-            // An IME is being disabled. Save enabled subtypes of the IME to shared preference to be
-            // able to re-enable these subtypes when the IME gets re-enabled.
-            saveEnabledSubtypesOf(imi);
-        }
-        final boolean hasHardwareKeyboard = getResources().getConfiguration().keyboard
-                == Configuration.KEYBOARD_QWERTY;
-        InputMethodAndSubtypeUtil.saveInputMethodSubtypeList(this, getContentResolver(),
-                mImm.getInputMethodList(), hasHardwareKeyboard);
-        // Update input method settings and preference list.
-        mInputMethodSettingValues.refreshAllInputMethodAndSubtypes();
-        if (pref.isChecked()) {
-            // An IME is being enabled. Load the previously enabled subtypes from shared preference
-            // and enable these subtypes.
-            restorePreviouslyEnabledSubtypesOf(imi);
-        }
-        for (final InputMethodPreference p : mInputMethodPreferenceList) {
-            p.updatePreferenceViews();
-        }
-    }
-
-    private void saveEnabledSubtypesOf(final InputMethodInfo imi) {
-        final HashSet<String> enabledSubtypeIdSet = new HashSet<>();
-        final List<InputMethodSubtype> enabledSubtypes = mImm.getEnabledInputMethodSubtypeList(
-                imi, true /* allowsImplicitlySelectedSubtypes */);
-        for (final InputMethodSubtype subtype : enabledSubtypes) {
-            final String subtypeId = Integer.toString(subtype.hashCode());
-            enabledSubtypeIdSet.add(subtypeId);
-        }
-        final HashMap<String, HashSet<String>> imeToEnabledSubtypeIdsMap =
-                loadPreviouslyEnabledSubtypeIdsMap();
-        final String imiId = imi.getId();
-        imeToEnabledSubtypeIdsMap.put(imiId, enabledSubtypeIdSet);
-        savePreviouslyEnabledSubtypeIdsMap(imeToEnabledSubtypeIdsMap);
-    }
-
-    private void restorePreviouslyEnabledSubtypesOf(final InputMethodInfo imi) {
-        final HashMap<String, HashSet<String>> imeToEnabledSubtypeIdsMap =
-                loadPreviouslyEnabledSubtypeIdsMap();
-        final String imiId = imi.getId();
-        final HashSet<String> enabledSubtypeIdSet = imeToEnabledSubtypeIdsMap.remove(imiId);
-        if (enabledSubtypeIdSet == null) {
-            return;
-        }
-        savePreviouslyEnabledSubtypeIdsMap(imeToEnabledSubtypeIdsMap);
-        InputMethodAndSubtypeUtil.enableInputMethodSubtypesOf(
-                getContentResolver(), imiId, enabledSubtypeIdSet);
-    }
-
-    private HashMap<String, HashSet<String>> loadPreviouslyEnabledSubtypeIdsMap() {
-        final Context context = getActivity();
-        final SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context);
-        final String imesAndSubtypesString = prefs.getString(KEY_PREVIOUSLY_ENABLED_SUBTYPES, null);
-        return InputMethodAndSubtypeUtil.parseInputMethodsAndSubtypesString(imesAndSubtypesString);
-    }
-
-    private void savePreviouslyEnabledSubtypeIdsMap(
-            final HashMap<String, HashSet<String>> subtypesMap) {
-        final Context context = getActivity();
-        final SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context);
-        final String imesAndSubtypesString = InputMethodAndSubtypeUtil
-                .buildInputMethodsAndSubtypesString(subtypesMap);
-        prefs.edit().putString(KEY_PREVIOUSLY_ENABLED_SUBTYPES, imesAndSubtypesString).apply();
-    }
-
-    private void updateCurrentImeName() {
-        final Context context = getActivity();
-        if (context == null || mImm == null) return;
-        final Preference curPref = getPreferenceScreen().findPreference(KEY_CURRENT_INPUT_METHOD);
-        if (curPref != null) {
-            final CharSequence curIme =
-                    mInputMethodSettingValues.getCurrentInputMethodName(context);
-            if (!TextUtils.isEmpty(curIme)) {
-                synchronized (this) {
-                    curPref.setSummary(curIme);
-                }
-            }
-        }
-    }
-
     private void updateInputDevices() {
-        updateHardKeyboards();
         updateGameControllers();
     }
 
-    private void updateHardKeyboards() {
-        if (mHardKeyboardCategory == null) {
-            return;
-        }
-
-        mHardKeyboardPreferenceList.clear();
-        final int[] devices = InputDevice.getDeviceIds();
-        for (int i = 0; i < devices.length; i++) {
-            InputDevice device = InputDevice.getDevice(devices[i]);
-            if (device != null
-                    && !device.isVirtual()
-                    && device.isFullKeyboard()) {
-                final InputDeviceIdentifier identifier = device.getIdentifier();
-                final String keyboardLayoutDescriptor =
-                    mIm.getCurrentKeyboardLayoutForInputDevice(identifier);
-                final KeyboardLayout keyboardLayout = keyboardLayoutDescriptor != null ?
-                    mIm.getKeyboardLayout(keyboardLayoutDescriptor) : null;
-
-                final PreferenceScreen pref = new PreferenceScreen(getPrefContext(), null);
-                pref.setTitle(device.getName());
-                if (keyboardLayout != null) {
-                    pref.setSummary(keyboardLayout.toString());
-                } else {
-                    pref.setSummary(R.string.keyboard_layout_default_label);
-                }
-                pref.setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() {
-                    @Override
-                    public boolean onPreferenceClick(Preference preference) {
-                        showKeyboardLayoutDialog(identifier);
-                        return true;
-                    }
-                });
-                mHardKeyboardPreferenceList.add(pref);
-            }
-        }
-
-        if (!mHardKeyboardPreferenceList.isEmpty()) {
-            for (int i = mHardKeyboardCategory.getPreferenceCount(); i-- > 0; ) {
-                final Preference pref = mHardKeyboardCategory.getPreference(i);
-                if (pref.getOrder() < 1000) {
-                    mHardKeyboardCategory.removePreference(pref);
-                }
-            }
-
-            Collections.sort(mHardKeyboardPreferenceList);
-            final int count = mHardKeyboardPreferenceList.size();
-            for (int i = 0; i < count; i++) {
-                final Preference pref = mHardKeyboardPreferenceList.get(i);
-                pref.setOrder(i);
-                mHardKeyboardCategory.addPreference(pref);
-            }
-
-            getPreferenceScreen().addPreference(mHardKeyboardCategory);
-        } else {
-            getPreferenceScreen().removePreference(mHardKeyboardCategory);
-        }
-    }
-
     private void showKeyboardLayoutDialog(InputDeviceIdentifier inputDeviceIdentifier) {
         KeyboardLayoutDialogFragment fragment = (KeyboardLayoutDialogFragment)
                 getFragmentManager().findFragmentByTag("keyboardLayout");
@@ -563,31 +300,6 @@
         return false;
     }
 
-    private class SettingsObserver extends ContentObserver {
-        private Context mContext;
-
-        public SettingsObserver(Handler handler, Context context) {
-            super(handler);
-            mContext = context;
-        }
-
-        @Override public void onChange(boolean selfChange) {
-            updateCurrentImeName();
-        }
-
-        public void resume() {
-            final ContentResolver cr = mContext.getContentResolver();
-            cr.registerContentObserver(
-                    Settings.Secure.getUriFor(Settings.Secure.DEFAULT_INPUT_METHOD), false, this);
-            cr.registerContentObserver(Settings.Secure.getUriFor(
-                    Settings.Secure.SELECTED_INPUT_METHOD_SUBTYPE), false, this);
-        }
-
-        public void pause() {
-            mContext.getContentResolver().unregisterContentObserver(this);
-        }
-    }
-
     private static class SummaryProvider implements SummaryLoader.SummaryProvider {
 
         private final Context mContext;
@@ -613,7 +325,7 @@
             = new SummaryLoader.SummaryProviderFactory() {
         @Override
         public SummaryLoader.SummaryProvider createSummaryProvider(Activity activity,
-                                                                   SummaryLoader summaryLoader) {
+                SummaryLoader summaryLoader) {
             return new SummaryProvider(activity, summaryLoader);
         }
     };
@@ -668,16 +380,6 @@
                     .getInstance(context);
             immValues.refreshAllInputMethodAndSubtypes();
 
-            // Current IME.
-            String currImeName = immValues.getCurrentInputMethodName(context).toString();
-            indexable = new SearchIndexableRaw(context);
-            indexable.key = KEY_CURRENT_INPUT_METHOD;
-            indexable.title = context.getString(R.string.current_input_method);
-            indexable.summaryOn = currImeName;
-            indexable.summaryOff = currImeName;
-            indexable.screenTitle = screenTitle;
-            indexables.add(indexable);
-
             InputMethodManager inputMethodManager = (InputMethodManager) context.getSystemService(
                     Context.INPUT_METHOD_SERVICE);
 
@@ -744,8 +446,7 @@
                 // Hard keyboard category.
                 indexable = new SearchIndexableRaw(context);
                 indexable.key = "builtin_keyboard_settings";
-                indexable.title = context.getString(
-                        R.string.builtin_keyboard_settings_title);
+                indexable.title = context.getString(R.string.builtin_keyboard_settings_title);
                 indexable.screenTitle = screenTitle;
                 indexables.add(indexable);
             }
