diff --git a/src/com/android/settings/InputMethodAndSubtypeEnabler.java b/src/com/android/settings/InputMethodAndSubtypeEnabler.java
index 81116ce..0c1d7d4 100644
--- a/src/com/android/settings/InputMethodAndSubtypeEnabler.java
+++ b/src/com/android/settings/InputMethodAndSubtypeEnabler.java
@@ -19,23 +19,18 @@
 import android.app.AlertDialog;
 import android.content.Context;
 import android.content.DialogInterface;
-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.Preference;
-import android.preference.PreferenceActivity;
 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 android.view.inputmethod.InputMethodSubtype;
 
 import java.util.ArrayList;
-import java.util.HashSet;
 import java.util.List;
 
 public class InputMethodAndSubtypeEnabler extends SettingsPreferenceFragment {
@@ -44,10 +39,6 @@
 
     private List<InputMethodInfo> mInputMethodProperties;
 
-    private final TextUtils.SimpleStringSplitter mStringColonSplitter
-            = new TextUtils.SimpleStringSplitter(':');
-
-    private String mLastInputMethodId;
     private String mLastTickedInputMethodId;
 
     private AlertDialog mDialog = null;
@@ -64,13 +55,15 @@
     @Override
     public void onResume() {
         super.onResume();
-        loadInputMethodSubtypeList();
+        InputMethodAndSubtypeUtil.loadInputMethodSubtypeList(this, mInputMethodProperties);
+        mLastTickedInputMethodId = null;
     }
 
     @Override
     public void onPause() {
         super.onPause();
-        saveInputMethodSubtypeList();
+        InputMethodAndSubtypeUtil.saveInputMethodSubtypeList(this, mInputMethodProperties,
+                mHaveHardKeyboard, mLastTickedInputMethodId);
     }
 
     @Override
@@ -88,8 +81,9 @@
                     InputMethodInfo imi = mInputMethodProperties.get(i);
                     if (id.equals(imi.getId())) {
                         selImi = imi;
-                        if (isSystemIme(imi)) {
-                            setSubtypesPreferenceEnabled(id, true);
+                        if (InputMethodAndSubtypeUtil.isSystemIme(imi)) {
+                            InputMethodAndSubtypeUtil.setSubtypesPreferenceEnabled(
+                                    this, mInputMethodProperties, id, true);
                             // This is a built-in IME, so no need to warn.
                             mLastTickedInputMethodId = id;
                             return super.onPreferenceTreeClick(preferenceScreen, preference);
@@ -110,7 +104,9 @@
                                     new DialogInterface.OnClickListener() {
                                         public void onClick(DialogInterface dialog, int which) {
                                             chkPref.setChecked(true);
-                                            setSubtypesPreferenceEnabled(id, true);
+                                            InputMethodAndSubtypeUtil.setSubtypesPreferenceEnabled(
+                                                    InputMethodAndSubtypeEnabler.this,
+                                                    mInputMethodProperties, id, true);
                                             mLastTickedInputMethodId = id;
                                         }
 
@@ -135,7 +131,8 @@
                 if (id.equals(mLastTickedInputMethodId)) {
                     mLastTickedInputMethodId = null;
                 }
-                setSubtypesPreferenceEnabled(id, false);
+                InputMethodAndSubtypeUtil.setSubtypesPreferenceEnabled(
+                        this, mInputMethodProperties, id, false);
             }
         }
         return super.onPreferenceTreeClick(preferenceScreen, preference);
@@ -156,9 +153,6 @@
 
         // TODO: Change mInputMethodProperties to Map
         mInputMethodProperties = imm.getInputMethodList();
-
-        mLastInputMethodId = Settings.Secure.getString(getContentResolver(),
-                Settings.Secure.DEFAULT_INPUT_METHOD);
     }
 
     private PreferenceScreen createPreferenceHierarchy() {
@@ -175,7 +169,7 @@
 
             PackageManager pm = getPackageManager();
             CharSequence label = property.loadLabel(pm);
-            boolean systemIME = isSystemIme(property);
+            boolean systemIME = InputMethodAndSubtypeUtil.isSystemIme(property);
 
             keyboardSettingsCategory.setTitle(label);
 
@@ -220,100 +214,4 @@
         }
         return root;
     }
-
-    private void loadInputMethodSubtypeList() {
-        final HashSet<String> enabled = new HashSet<String>();
-        String enabledStr = Settings.Secure.getString(getContentResolver(),
-                Settings.Secure.ENABLED_INPUT_METHODS);
-        if (enabledStr != null) {
-            final TextUtils.SimpleStringSplitter splitter = mStringColonSplitter;
-            splitter.setString(enabledStr);
-            while (splitter.hasNext()) {
-                enabled.add(splitter.next());
-            }
-        }
-
-        // Update the statuses of the Check Boxes.
-        int N = mInputMethodProperties.size();
-        // TODO: Use iterator.
-        for (int i = 0; i < N; ++i) {
-            final String id = mInputMethodProperties.get(i).getId();
-            CheckBoxPreference pref = (CheckBoxPreference) findPreference(
-                    mInputMethodProperties.get(i).getId());
-            if (pref != null) {
-                boolean isEnabled = enabled.contains(id);
-                pref.setChecked(isEnabled);
-                setSubtypesPreferenceEnabled(id, isEnabled);
-            }
-        }
-        mLastTickedInputMethodId = null;
-    }
-
-    private void saveInputMethodSubtypeList() {
-        StringBuilder builder = new StringBuilder();
-        StringBuilder disabledSysImes = new StringBuilder();
-
-        int firstEnabled = -1;
-        int N = mInputMethodProperties.size();
-        for (int i = 0; i < N; ++i) {
-            final InputMethodInfo property = mInputMethodProperties.get(i);
-            final String id = property.getId();
-            CheckBoxPreference pref = (CheckBoxPreference) findPreference(id);
-            boolean currentInputMethod = id.equals(mLastInputMethodId);
-            boolean systemIme = isSystemIme(property);
-            // TODO: Append subtypes by using the separator ";"
-            if (((N == 1 || systemIme) && !mHaveHardKeyboard)
-                    || (pref != null && pref.isChecked())) {
-                if (builder.length() > 0) builder.append(':');
-                builder.append(id);
-                if (firstEnabled < 0) {
-                    firstEnabled = i;
-                }
-            } else if (currentInputMethod) {
-                mLastInputMethodId = mLastTickedInputMethodId;
-            }
-            // 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 && mHaveHardKeyboard) {
-                if (disabledSysImes.length() > 0) disabledSysImes.append(":");
-                disabledSysImes.append(id);
-            }
-        }
-
-        // If the last input method is unset, set it as the first enabled one.
-        if (TextUtils.isEmpty(mLastInputMethodId)) {
-            if (firstEnabled >= 0) {
-                mLastInputMethodId = mInputMethodProperties.get(firstEnabled).getId();
-            } else {
-                mLastInputMethodId = null;
-            }
-        }
-
-        Settings.Secure.putString(getContentResolver(),
-                Settings.Secure.ENABLED_INPUT_METHODS, builder.toString());
-        Settings.Secure.putString(getContentResolver(),
-                Settings.Secure.DISABLED_SYSTEM_INPUT_METHODS, disabledSysImes.toString());
-        Settings.Secure.putString(getContentResolver(),
-                Settings.Secure.DEFAULT_INPUT_METHOD,
-                mLastInputMethodId != null ? mLastInputMethodId : "");
-    }
-
-    private void setSubtypesPreferenceEnabled(String id, boolean enabled) {
-        PreferenceScreen preferenceScreen = getPreferenceScreen();
-        final int N = mInputMethodProperties.size();
-        // TODO: Use iterator.
-        for (int i = 0; i < N; i++) {
-            InputMethodInfo imi = mInputMethodProperties.get(i);
-            if (id.equals(imi.getId())) {
-                for (InputMethodSubtype subtype: imi.getSubtypes()) {
-                    preferenceScreen.findPreference(id + subtype.hashCode()).setEnabled(enabled);
-                }
-            }
-        }
-    }
-
-    private boolean isSystemIme(InputMethodInfo property) {
-        return (property.getServiceInfo().applicationInfo.flags
-                & ApplicationInfo.FLAG_SYSTEM) != 0;
-    }
 }
diff --git a/src/com/android/settings/InputMethodAndSubtypeUtil.java b/src/com/android/settings/InputMethodAndSubtypeUtil.java
new file mode 100644
index 0000000..cef2d90
--- /dev/null
+++ b/src/com/android/settings/InputMethodAndSubtypeUtil.java
@@ -0,0 +1,135 @@
+/*
+ * 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;
+
+import android.content.pm.ApplicationInfo;
+import android.preference.CheckBoxPreference;
+import android.preference.PreferenceScreen;
+import android.provider.Settings;
+import android.text.TextUtils;
+import android.view.inputmethod.InputMethodInfo;
+import android.view.inputmethod.InputMethodSubtype;
+
+import java.util.HashSet;
+import java.util.List;
+
+public class InputMethodAndSubtypeUtil {
+
+    private static final TextUtils.SimpleStringSplitter sStringColonSplitter
+            = new TextUtils.SimpleStringSplitter(':');
+
+    public static void saveInputMethodSubtypeList(
+            SettingsPreferenceFragment context, List<InputMethodInfo> inputMethodProperties,
+            boolean hasHardKeyboard, String lastTickedInputMethodId) {
+        String lastInputMethodId = Settings.Secure.getString(context.getContentResolver(),
+                Settings.Secure.DEFAULT_INPUT_METHOD);
+
+        StringBuilder builder = new StringBuilder();
+        StringBuilder disabledSysImes = new StringBuilder();
+
+        int firstEnabled = -1;
+        int N = inputMethodProperties.size();
+        for (int i = 0; i < N; ++i) {
+            final InputMethodInfo property = inputMethodProperties.get(i);
+            final String id = property.getId();
+            CheckBoxPreference pref = (CheckBoxPreference) context.findPreference(id);
+            boolean currentInputMethod = id.equals(lastInputMethodId);
+            boolean systemIme = isSystemIme(property);
+            // TODO: Append subtypes by using the separator ";"
+            if (((N == 1 || systemIme) && !hasHardKeyboard)
+                    || (pref != null && pref.isChecked())) {
+                if (builder.length() > 0) builder.append(':');
+                builder.append(id);
+                if (firstEnabled < 0) {
+                    firstEnabled = i;
+                }
+            } else if (currentInputMethod) {
+                lastInputMethodId = lastTickedInputMethodId;
+            }
+            // 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(":");
+                disabledSysImes.append(id);
+            }
+        }
+
+        // If the last input method is unset, set it as the first enabled one.
+        if (TextUtils.isEmpty(lastInputMethodId)) {
+            if (firstEnabled >= 0) {
+                lastInputMethodId = inputMethodProperties.get(firstEnabled).getId();
+            } else {
+                lastInputMethodId = null;
+            }
+        }
+
+        Settings.Secure.putString(context.getContentResolver(),
+                Settings.Secure.ENABLED_INPUT_METHODS, builder.toString());
+        Settings.Secure.putString(context.getContentResolver(),
+                Settings.Secure.DISABLED_SYSTEM_INPUT_METHODS, disabledSysImes.toString());
+        Settings.Secure.putString(context.getContentResolver(),
+                Settings.Secure.DEFAULT_INPUT_METHOD,
+                lastInputMethodId != null ? lastInputMethodId : "");
+    }
+
+    public static void loadInputMethodSubtypeList(SettingsPreferenceFragment context,
+            List<InputMethodInfo> inputMethodProperties) {
+        final HashSet<String> enabled = new HashSet<String>();
+        String enabledStr = Settings.Secure.getString(context.getContentResolver(),
+                Settings.Secure.ENABLED_INPUT_METHODS);
+        if (enabledStr != null) {
+            final TextUtils.SimpleStringSplitter splitter = sStringColonSplitter;
+            splitter.setString(enabledStr);
+            while (splitter.hasNext()) {
+                enabled.add(splitter.next());
+            }
+        }
+
+        // Update the statuses of the Check Boxes.
+        int N = inputMethodProperties.size();
+        // TODO: Use iterator.
+        for (int i = 0; i < N; ++i) {
+            final String id = inputMethodProperties.get(i).getId();
+            CheckBoxPreference pref = (CheckBoxPreference) context.findPreference(
+                    inputMethodProperties.get(i).getId());
+            if (pref != null) {
+                boolean isEnabled = enabled.contains(id);
+                pref.setChecked(isEnabled);
+                setSubtypesPreferenceEnabled(context, inputMethodProperties, id, isEnabled);
+            }
+        }
+    }
+
+    public static void setSubtypesPreferenceEnabled(SettingsPreferenceFragment context,
+            List<InputMethodInfo> inputMethodProperties, String id, boolean enabled) {
+        PreferenceScreen preferenceScreen = context.getPreferenceScreen();
+        final int N = inputMethodProperties.size();
+        // TODO: Use iterator.
+        for (int i = 0; i < N; i++) {
+            InputMethodInfo imi = inputMethodProperties.get(i);
+            if (id.equals(imi.getId())) {
+                for (InputMethodSubtype subtype: imi.getSubtypes()) {
+                    preferenceScreen.findPreference(id + subtype.hashCode()).setEnabled(enabled);
+                }
+            }
+        }
+    }
+    public static boolean isSystemIme(InputMethodInfo property) {
+        return (property.getServiceInfo().applicationInfo.flags
+                & ApplicationInfo.FLAG_SYSTEM) != 0;
+    }
+}
diff --git a/src/com/android/settings/LanguageSettings.java b/src/com/android/settings/LanguageSettings.java
index f70baa4..1cc91a1 100644
--- a/src/com/android/settings/LanguageSettings.java
+++ b/src/com/android/settings/LanguageSettings.java
@@ -16,7 +16,6 @@
 
 package com.android.settings;
 
-import android.app.Activity;
 import android.app.AlertDialog;
 import android.content.Context;
 import android.content.DialogInterface;
@@ -28,14 +27,11 @@
 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.HashSet;
 import java.util.List;
 
 public class LanguageSettings extends SettingsPreferenceFragment {
@@ -85,14 +81,15 @@
         mCheckboxes = new ArrayList<CheckBoxPreference>();
         onCreateIMM();
     }
-    
+
     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);
+        InputMethodManager imm = (InputMethodManager) getSystemService(
+                Context.INPUT_METHOD_SERVICE);
 
         mInputMethodProperties = imm.getInputMethodList();
 
@@ -143,27 +140,7 @@
     public void onResume() {
         super.onResume();
 
-        final HashSet<String> enabled = new HashSet<String>();
-        String enabledStr = Settings.Secure.getString(getContentResolver(),
-                Settings.Secure.ENABLED_INPUT_METHODS);
-        if (enabledStr != null) {
-            final TextUtils.SimpleStringSplitter splitter = mStringColonSplitter;
-            splitter.setString(enabledStr);
-            while (splitter.hasNext()) {
-                enabled.add(splitter.next());
-            }
-        }
-        
-        // Update the statuses of the Check Boxes.
-        int N = mInputMethodProperties.size();
-        for (int i = 0; i < N; ++i) {
-            final String id = mInputMethodProperties.get(i).getId();
-            CheckBoxPreference pref = (CheckBoxPreference) findPreference(mInputMethodProperties
-                    .get(i).getId());
-            if (pref != null) {
-                pref.setChecked(enabled.contains(id));
-            }
-        }
+        InputMethodAndSubtypeUtil.loadInputMethodSubtypeList(this, mInputMethodProperties);
         mLastTickedInputMethodId = null;
 
         if (mLanguagePref != null) {
@@ -179,60 +156,13 @@
     @Override
     public void onPause() {
         super.onPause();
-
-        String lastInputMethodId = Settings.Secure.getString(getContentResolver(),
-                Settings.Secure.DEFAULT_INPUT_METHOD);
-
-        StringBuilder builder = new StringBuilder();
-        StringBuilder disabledSysImes = new StringBuilder();
-
-        int firstEnabled = -1;
-        int N = mInputMethodProperties.size();
-        for (int i = 0; i < N; ++i) {
-            final InputMethodInfo property = mInputMethodProperties.get(i);
-            final String id = property.getId();
-            CheckBoxPreference pref = (CheckBoxPreference) findPreference(id);
-            boolean hasIt = id.equals(lastInputMethodId);
-            boolean systemIme = isSystemIme(property); 
-            if (((N == 1 || systemIme) && !mHaveHardKeyboard) 
-                    || (pref != null && pref.isChecked())) {
-                if (builder.length() > 0) builder.append(':');
-                builder.append(id);
-                if (firstEnabled < 0) {
-                    firstEnabled = i;
-                }
-            } else if (hasIt) {
-                lastInputMethodId = mLastTickedInputMethodId;
-            }
-            // 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 && mHaveHardKeyboard) {
-                if (disabledSysImes.length() > 0) disabledSysImes.append(":");
-                disabledSysImes.append(id);
-            }
-        }
-
-        // If the last input method is unset, set it as the first enabled one.
-        if (null == lastInputMethodId || "".equals(lastInputMethodId)) {
-            if (firstEnabled >= 0) {
-                lastInputMethodId = mInputMethodProperties.get(firstEnabled).getId();
-            } else {
-                lastInputMethodId = null;
-            }
-        }
-        
-        Settings.Secure.putString(getContentResolver(),
-            Settings.Secure.ENABLED_INPUT_METHODS, builder.toString());
-        Settings.Secure.putString(getContentResolver(),
-                Settings.Secure.DISABLED_SYSTEM_INPUT_METHODS, disabledSysImes.toString());
-        Settings.Secure.putString(getContentResolver(),
-            Settings.Secure.DEFAULT_INPUT_METHOD,
-            lastInputMethodId != null ? lastInputMethodId : "");
+        InputMethodAndSubtypeUtil.saveInputMethodSubtypeList(this, mInputMethodProperties,
+                mHaveHardKeyboard, mLastTickedInputMethodId);
     }
 
     @Override
     public boolean onPreferenceTreeClick(PreferenceScreen preferenceScreen, Preference preference) {
-        
+
         // Input Method stuff
         if (Utils.isMonkeyRunning()) {
             return false;
