diff --git a/res/values/strings.xml b/res/values/strings.xml
index 3b9e712..b6ef7b7 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -7194,6 +7194,12 @@
         <item>@*android:string/gigabyteShort</item>
     </string-array>
 
+    <!-- [CHAR LIMIT=30] Label for setting to control the default spell checker -->
+    <string name="default_spell_checker">Default spell checker</string>
+
+    <!-- [CHAR LIMIT=30] Title for dialog for setting to control the default spell checker -->
+    <string name="choose_spell_checker">Choose spell checker</string>
+
     <!-- Notification log debug tool: missing title -->
     <string name="notification_log_no_title">(none)</string>
     <!-- Notification log debug tool: delimiter between header and field data -->
diff --git a/src/com/android/settings/inputmethod/SpellCheckerPreference.java b/src/com/android/settings/inputmethod/SpellCheckerPreference.java
index daa26fb..c730bcc 100644
--- a/src/com/android/settings/inputmethod/SpellCheckerPreference.java
+++ b/src/com/android/settings/inputmethod/SpellCheckerPreference.java
@@ -16,20 +16,20 @@
 
 package com.android.settings.inputmethod;
 
+import android.app.AlertDialog.Builder;
 import android.content.ActivityNotFoundException;
 import android.content.Context;
+import android.content.DialogInterface;
 import android.content.Intent;
-import android.support.v7.preference.Preference;
+import android.support.v7.preference.ListPreference;
 import android.support.v7.preference.PreferenceViewHolder;
 import android.text.TextUtils;
 import android.view.View;
 import android.view.View.OnClickListener;
 import android.view.textservice.SpellCheckerInfo;
-import android.widget.RadioButton;
-import android.widget.Toast;
 
+import com.android.settings.CustomListPreference;
 import com.android.settings.R;
-import com.android.settings.Utils;
 
 /**
  * Spell checker service preference.
@@ -38,115 +38,92 @@
  * button on the left side is used to choose the current spell checker service. 2) A settings
  * icon on the right side is used to invoke the setting activity of the spell checker service.
  */
-class SpellCheckerPreference extends Preference implements OnClickListener {
-    interface OnRadioButtonPreferenceListener {
-        /**
-         * Called when this preference needs to be saved its state.
-         *
-         * Note that this preference is non-persistent and needs explicitly to be saved its state.
-         * Because changing one IME state may change other IMEs' state, this is a place to update
-         * other IMEs' state as well.
-         *
-         * @param pref This preference.
-         */
-        public void onRadioButtonClicked(SpellCheckerPreference pref);
+class SpellCheckerPreference extends CustomListPreference {
+
+    private final SpellCheckerInfo[] mScis;
+    private Intent mIntent;
+
+    public SpellCheckerPreference(final Context context, final SpellCheckerInfo[] scis) {
+        super(context, null);
+        mScis = scis;
+        setWidgetLayoutResource(R.layout.preference_widget_settings);
+        CharSequence[] labels = new CharSequence[scis.length];
+        CharSequence[] values = new CharSequence[scis.length];
+        for (int i = 0 ; i < scis.length; i++) {
+            labels[i] = scis[i].loadLabel(context.getPackageManager());
+            // Use values as indexing since ListPreference doesn't support generic objects.
+            values[i] = String.valueOf(i);
+        }
+        setEntries(labels);
+        setEntryValues(values);
     }
 
-    private final SpellCheckerInfo mSci;
-    private final OnRadioButtonPreferenceListener mOnRadioButtonListener;
+    @Override
+    protected void onPrepareDialogBuilder(Builder builder,
+            DialogInterface.OnClickListener listener) {
+        builder.setTitle(R.string.choose_spell_checker);
+        builder.setSingleChoiceItems(getEntries(), findIndexOfValue(getValue()), listener);
+    }
 
-    private RadioButton mRadioButton;
-    private View mPrefLeftButton;
-    private View mSettingsButton;
-    private boolean mSelected;
-
-    public SpellCheckerPreference(final Context context, final SpellCheckerInfo sci,
-            final OnRadioButtonPreferenceListener onRadioButtonListener) {
-        super(context, null, 0);
-        setPersistent(false);
-        setLayoutResource(R.layout.preference_spellchecker);
-        setWidgetLayoutResource(R.layout.preference_spellchecker_widget);
-        mSci = sci;
-        mOnRadioButtonListener = onRadioButtonListener;
-        setKey(sci.getId());
-        setTitle(sci.loadLabel(context.getPackageManager()));
-        final String settingsActivity = mSci.getSettingsActivity();
-        if (TextUtils.isEmpty(settingsActivity)) {
-            setIntent(null);
-        } else {
-            final Intent intent = new Intent(Intent.ACTION_MAIN);
-            intent.setClassName(mSci.getPackageName(), settingsActivity);
-            setIntent(intent);
+    public void setSelected(SpellCheckerInfo currentSci) {
+        if (currentSci == null) {
+            setValue(null);
+            return;
         }
+        for (int i = 0; i < mScis.length; i++) {
+            if (mScis[i].getId().equals(currentSci.getId())) {
+                setValueIndex(i);
+                return;
+            }
+        }
+    }
+
+    @Override
+    public void setValue(String value) {
+        super.setValue(value);
+        int index = value != null ? Integer.parseInt(value) : -1;
+        if (index == -1) {
+            mIntent = null;
+            return;
+        }
+        SpellCheckerInfo sci = mScis[index];
+        final String settingsActivity = sci.getSettingsActivity();
+        if (TextUtils.isEmpty(settingsActivity)) {
+            mIntent = null;
+        } else {
+            mIntent = new Intent(Intent.ACTION_MAIN);
+            mIntent.setClassName(sci.getPackageName(), settingsActivity);
+        }
+    }
+
+    @Override
+    public boolean callChangeListener(Object newValue) {
+        newValue = newValue != null ? mScis[Integer.parseInt((String) newValue)] : null;
+        return super.callChangeListener(newValue);
     }
 
     @Override
     public void onBindViewHolder(PreferenceViewHolder view) {
         super.onBindViewHolder(view);
-        mRadioButton = (RadioButton)view.findViewById(R.id.pref_radio);
-        mPrefLeftButton = view.findViewById(R.id.pref_left_button);
-        mPrefLeftButton.setOnClickListener(this);
-        mSettingsButton = view.findViewById(R.id.pref_right_button);
-        mSettingsButton.setOnClickListener(this);
-        updateSelectedState(mSelected);
-    }
-
-    @Override
-    public void onClick(final View v) {
-        if (v == mPrefLeftButton) {
-            mOnRadioButtonListener.onRadioButtonClicked(this);
-            return;
-        }
-        if (v == mSettingsButton) {
-            onSettingsButtonClicked();
-            return;
-        }
+        View settingsButton = view.findViewById(R.id.settings_button);
+        settingsButton.setVisibility(mIntent != null ? View.VISIBLE : View.INVISIBLE);
+        settingsButton.setOnClickListener(new OnClickListener() {
+            @Override
+            public void onClick(View v) {
+                onSettingsButtonClicked();
+            }
+        });
     }
 
     private void onSettingsButtonClicked() {
         final Context context = getContext();
         try {
-            final Intent intent = getIntent();
+            final Intent intent = mIntent;
             if (intent != null) {
                 // Invoke a settings activity of an spell checker.
                 context.startActivity(intent);
             }
         } catch (final ActivityNotFoundException e) {
-            final String message = context.getString(R.string.failed_to_open_app_settings_toast,
-                    mSci.loadLabel(context.getPackageManager()));
-            Toast.makeText(context, message, Toast.LENGTH_LONG).show();
-        }
-    }
-
-    public SpellCheckerInfo getSpellCheckerInfo() {
-        return mSci;
-    }
-
-    public void setSelected(final boolean selected) {
-        mSelected = selected;
-        updateSelectedState(selected);
-    }
-
-    private void updateSelectedState(final boolean selected) {
-        if (mRadioButton != null) {
-            mRadioButton.setChecked(selected);
-            enableSettingsButton(isEnabled() && selected);
-        }
-    }
-
-    private void enableSettingsButton(final boolean enabled) {
-        if (mSettingsButton == null) {
-            return;
-        }
-        if (getIntent() == null) {
-            mSettingsButton.setVisibility(View.GONE);
-        } else {
-            mSettingsButton.setEnabled(enabled);
-            mSettingsButton.setClickable(enabled);
-            mSettingsButton.setFocusable(enabled);
-            if (!enabled) {
-                mSettingsButton.setAlpha(Utils.DISABLED_ALPHA);
-            }
         }
     }
 }
diff --git a/src/com/android/settings/inputmethod/SpellCheckersSettings.java b/src/com/android/settings/inputmethod/SpellCheckersSettings.java
index abece21..ad6a17b 100644
--- a/src/com/android/settings/inputmethod/SpellCheckersSettings.java
+++ b/src/com/android/settings/inputmethod/SpellCheckersSettings.java
@@ -22,6 +22,7 @@
 import android.content.pm.ApplicationInfo;
 import android.os.Bundle;
 import android.support.v7.preference.Preference;
+import android.support.v7.preference.Preference.OnPreferenceChangeListener;
 import android.support.v7.preference.Preference.OnPreferenceClickListener;
 import android.support.v7.preference.PreferenceScreen;
 import android.util.Log;
@@ -34,13 +35,11 @@
 import com.android.settings.R;
 import com.android.settings.SettingsActivity;
 import com.android.settings.SettingsPreferenceFragment;
-import com.android.settings.inputmethod.SpellCheckerPreference.OnRadioButtonPreferenceListener;
 import com.android.settings.widget.SwitchBar;
 import com.android.settings.widget.SwitchBar.OnSwitchChangeListener;
 
 public class SpellCheckersSettings extends SettingsPreferenceFragment
-        implements OnSwitchChangeListener, OnPreferenceClickListener,
-        OnRadioButtonPreferenceListener {
+        implements OnSwitchChangeListener, OnPreferenceClickListener, OnPreferenceChangeListener {
     private static final String TAG = SpellCheckersSettings.class.getSimpleName();
     private static final boolean DBG = false;
 
@@ -77,13 +76,16 @@
         final PreferenceScreen screen = getPreferenceScreen();
         final Context context = getActivity();
         final int count = (mEnabledScis == null) ? 0 : mEnabledScis.length;
+
         for (int index = 0; index < count; ++index) {
             final SpellCheckerInfo sci = mEnabledScis[index];
-            final SpellCheckerPreference pref = new SpellCheckerPreference(getPrefContext(), sci,
-                    this);
-            screen.addPreference(pref);
-            InputMethodAndSubtypeUtil.removeUnnecessaryNonPersistentPreference(pref);
         }
+        final SpellCheckerPreference pref = new SpellCheckerPreference(getPrefContext(),
+                mEnabledScis);
+        pref.setTitle(R.string.default_spell_checker);
+        pref.setSummary("%s");
+        pref.setOnPreferenceChangeListener(this);
+        screen.addPreference(pref);
     }
 
     @Override
@@ -123,8 +125,7 @@
             preference.setEnabled(isSpellCheckerEnabled);
             if (preference instanceof SpellCheckerPreference) {
                 final SpellCheckerPreference pref = (SpellCheckerPreference)preference;
-                final SpellCheckerInfo sci = pref.getSpellCheckerInfo();
-                pref.setSelected(mCurrentSci != null && mCurrentSci.getId().equals(sci.getId()));
+                pref.setSelected(mCurrentSci);
             }
         }
     }
@@ -151,14 +152,16 @@
     }
 
     @Override
-    public void onRadioButtonClicked(final SpellCheckerPreference pref) {
-        final SpellCheckerInfo sci = pref.getSpellCheckerInfo();
+    public boolean onPreferenceChange(Preference preference, Object newValue) {
+        final SpellCheckerInfo sci = (SpellCheckerInfo) newValue;
         final boolean isSystemApp =
                 (sci.getServiceInfo().applicationInfo.flags & ApplicationInfo.FLAG_SYSTEM) != 0;
         if (isSystemApp) {
             changeCurrentSpellChecker(sci);
+            return true;
         } else {
-            showSecurityWarnDialog(pref);
+            showSecurityWarnDialog(sci);
+            return false;
         }
     }
 
@@ -209,14 +212,14 @@
         mDialog.show();
     }
 
-    private void showSecurityWarnDialog(final SpellCheckerPreference pref) {
+    private void showSecurityWarnDialog(final SpellCheckerInfo sci) {
         if (mDialog != null && mDialog.isShowing()) {
             mDialog.dismiss();
         }
-        final SpellCheckerInfo sci = pref.getSpellCheckerInfo();
         final AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
         builder.setTitle(android.R.string.dialog_alert_title);
-        builder.setMessage(getString(R.string.spellchecker_security_warning, pref.getTitle()));
+        builder.setMessage(getString(R.string.spellchecker_security_warning,
+                sci.loadLabel(getPackageManager())));
         builder.setCancelable(true);
         builder.setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener() {
             @Override
