diff --git a/src/com/android/settings/AppListPreference.java b/src/com/android/settings/AppListPreference.java
new file mode 100644
index 0000000..919720f
--- /dev/null
+++ b/src/com/android/settings/AppListPreference.java
@@ -0,0 +1,118 @@
+/*
+ * Copyright (C) 2013 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.app.Activity;
+import android.app.AlertDialog.Builder;
+import android.content.Context;
+import android.content.pm.ApplicationInfo;
+import android.content.pm.PackageManager;
+import android.content.pm.PackageManager.NameNotFoundException;
+import android.graphics.drawable.Drawable;
+import android.preference.ListPreference;
+import android.util.AttributeSet;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.ArrayAdapter;
+import android.widget.CheckedTextView;
+import android.widget.ImageView;
+import android.widget.ListAdapter;
+
+/**
+ * Extends ListPreference to allow us to show the icons for a given list of applications. We do this
+ * because the names of applications are very similar and the user may not be able to determine what
+ * app they are selecting without an icon.
+ */
+public class AppListPreference extends ListPreference {
+    private Drawable[] mEntryDrawables;
+
+    public class AppArrayAdapter extends ArrayAdapter<CharSequence> {
+        private Drawable[] mImageDrawables = null;
+        private int mSelectedIndex = 0;
+
+        public AppArrayAdapter(Context context, int textViewResourceId,
+                CharSequence[] objects, Drawable[] imageDrawables, int selectedIndex) {
+            super(context, textViewResourceId, objects);
+            mSelectedIndex = selectedIndex;
+            mImageDrawables = imageDrawables;
+        }
+
+        @Override
+        public View getView(int position, View convertView, ViewGroup parent) {
+            LayoutInflater inflater = ((Activity)getContext()).getLayoutInflater();
+            View view = inflater.inflate(R.layout.app_preference_item, parent, false);
+            CheckedTextView checkedTextView = (CheckedTextView)view.findViewById(R.id.app_label);
+            checkedTextView.setText(getItem(position));
+            if (position == mSelectedIndex) {
+                checkedTextView.setChecked(true);
+            }
+            ImageView imageView = (ImageView)view.findViewById(R.id.app_image);
+            imageView.setImageDrawable(mImageDrawables[position]);
+            return view;
+        }
+    }
+
+    public AppListPreference(Context context, AttributeSet attrs) {
+        super(context, attrs);
+    }
+
+    public void setPackageNames(String[] packageNames, String defaultPackageName) {
+        // Look up all package names in PackageManager. Skip ones we can't find.
+        int foundPackages = 0;
+        PackageManager pm = getContext().getPackageManager();
+        ApplicationInfo[] appInfos = new ApplicationInfo[packageNames.length];
+        for (int i = 0; i < packageNames.length; i++) {
+            try {
+                appInfos[i] = pm.getApplicationInfo(packageNames[i], 0);
+                foundPackages++;
+            } catch (NameNotFoundException e) {
+                // Leave appInfos[i] uninitialized; it will be skipped in the list.
+            }
+        }
+
+        // Show the label and icon for each application package.
+        CharSequence[] applicationNames = new CharSequence[foundPackages];
+        mEntryDrawables = new Drawable[foundPackages];
+        int index = 0;
+        int selectedIndex = -1;
+        for (ApplicationInfo appInfo : appInfos) {
+            if (appInfo != null) {
+                applicationNames[index] = appInfo.loadLabel(pm);
+                mEntryDrawables[index] = appInfo.loadIcon(pm);
+                if (appInfo.packageName.contentEquals(defaultPackageName)) {
+                    selectedIndex = index;
+                }
+                index++;
+            }
+        }
+        setEntries(applicationNames);
+        setEntryValues(packageNames);
+        if (selectedIndex != -1) {
+            setValueIndex(selectedIndex);
+        }
+    }
+
+    @Override
+    protected void onPrepareDialogBuilder(Builder builder) {
+        int selectedIndex = findIndexOfValue(getValue());
+        ListAdapter adapter = new AppArrayAdapter(getContext(),
+            R.layout.app_preference_item, getEntries(), mEntryDrawables, selectedIndex);
+        builder.setAdapter(adapter, this);
+        super.onPrepareDialogBuilder(builder);
+    }
+}
diff --git a/src/com/android/settings/SmsListPreference.java b/src/com/android/settings/SmsListPreference.java
deleted file mode 100644
index 15df776..0000000
--- a/src/com/android/settings/SmsListPreference.java
+++ /dev/null
@@ -1,86 +0,0 @@
-/*
- * Copyright (C) 2013 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.app.Activity;
-import android.app.AlertDialog.Builder;
-import android.content.Context;
-import android.graphics.drawable.Drawable;
-import android.preference.ListPreference;
-import android.util.AttributeSet;
-import android.view.LayoutInflater;
-import android.view.View;
-import android.view.ViewGroup;
-import android.widget.ArrayAdapter;
-import android.widget.CheckedTextView;
-import android.widget.ImageView;
-import android.widget.ListAdapter;
-
-/**
- * Extends ListPreference to allow us to show the icons for the available SMS applications. We do
- * this because the names of SMS applications are very similar and the user may not be able to
- * determine what app they are selecting without an icon.
- */
-public class SmsListPreference extends ListPreference {
-    private Drawable[] mEntryDrawables;
-
-    public class SmsArrayAdapter extends ArrayAdapter<CharSequence> {
-        private Drawable[] mImageDrawables = null;
-        private int mSelectedIndex = 0;
-
-        public SmsArrayAdapter(Context context, int textViewResourceId,
-                CharSequence[] objects, Drawable[] imageDrawables, int selectedIndex) {
-            super(context, textViewResourceId, objects);
-            mSelectedIndex = selectedIndex;
-            mImageDrawables = imageDrawables;
-        }
-
-        public View getView(int position, View convertView, ViewGroup parent) {
-            LayoutInflater inflater = ((Activity)getContext()).getLayoutInflater();
-            View view = inflater.inflate(R.layout.sms_preference_item, parent, false);
-            CheckedTextView checkedTextView = (CheckedTextView)view.findViewById(R.id.sms_text);
-            checkedTextView.setText(getItem(position));
-            if (position == mSelectedIndex) {
-                checkedTextView.setChecked(true);
-            }
-            ImageView imageView = (ImageView)view.findViewById(R.id.sms_image);
-            imageView.setImageDrawable(mImageDrawables[position]);
-            return view;
-        }
-    }
-
-    public SmsListPreference(Context context, AttributeSet attrs) {
-        super(context, attrs);
-    }
-
-    public void setEntryDrawables(Drawable[] entries) {
-        mEntryDrawables = entries;
-    }
-
-    public Drawable[] getEntryDrawables() {
-        return mEntryDrawables;
-    }
-
-    @Override
-    protected void onPrepareDialogBuilder(Builder builder) {
-        int selectedIndex = findIndexOfValue(getValue());
-        ListAdapter adapter = new SmsArrayAdapter(getContext(),
-            R.layout.sms_preference_item, getEntries(), mEntryDrawables, selectedIndex);
-        builder.setAdapter(adapter, this);
-        super.onPrepareDialogBuilder(builder);
-    }
-}
\ No newline at end of file
diff --git a/src/com/android/settings/WirelessSettings.java b/src/com/android/settings/WirelessSettings.java
index 59074e5..733d771 100644
--- a/src/com/android/settings/WirelessSettings.java
+++ b/src/com/android/settings/WirelessSettings.java
@@ -26,9 +26,7 @@
 import android.content.DialogInterface;
 import android.content.Intent;
 import android.content.pm.PackageManager;
-import android.content.pm.PackageManager.NameNotFoundException;
 import android.content.res.Resources;
-import android.graphics.drawable.Drawable;
 import android.net.ConnectivityManager;
 import android.net.NetworkInfo;
 import android.nfc.NfcAdapter;
@@ -85,7 +83,7 @@
     private static final int MANAGE_MOBILE_PLAN_DIALOG_ID = 1;
     private static final String SAVED_MANAGE_MOBILE_PLAN_MSG = "mManageMobilePlanMessage";
 
-    private SmsListPreference mSmsApplicationPreference;
+    private AppListPreference mSmsApplicationPreference;
 
     public WirelessSettings() {
         super(null);
@@ -174,23 +172,6 @@
         }
     }
 
-    private void updateSmsApplicationSetting() {
-        log("updateSmsApplicationSetting:");
-        ComponentName appName = SmsApplication.getDefaultSmsApplication(getActivity(), true);
-        if (appName != null) {
-            String packageName = appName.getPackageName();
-
-            CharSequence[] values = mSmsApplicationPreference.getEntryValues();
-            for (int i = 0; i < values.length; i++) {
-                if (packageName.contentEquals(values[i])) {
-                    mSmsApplicationPreference.setValueIndex(i);
-                    mSmsApplicationPreference.setSummary(mSmsApplicationPreference.getEntries()[i]);
-                    break;
-                }
-            }
-        }
-    }
-
     private void initSmsApplicationSetting() {
         log("initSmsApplicationSetting:");
         Collection<SmsApplicationData> smsApplications =
@@ -198,25 +179,18 @@
 
         // If the list is empty the dialog will be empty, but we will not crash.
         int count = smsApplications.size();
-        CharSequence[] entries = new CharSequence[count];
-        CharSequence[] entryValues = new CharSequence[count];
-        Drawable[] entryImages = new Drawable[count];
-
+        String[] packageNames = new String[count];
         int i = 0;
         for (SmsApplicationData smsApplicationData : smsApplications) {
-            entries[i] = smsApplicationData.mApplicationName;
-            entryValues[i] = smsApplicationData.mPackageName;
-            try {
-                entryImages[i] = mPm.getApplicationIcon(smsApplicationData.mPackageName);
-            } catch (NameNotFoundException e) {
-                entryImages[i] = mPm.getDefaultActivityIcon();
-            }
+            packageNames[i] = smsApplicationData.mPackageName;
             i++;
         }
-        mSmsApplicationPreference.setEntries(entries);
-        mSmsApplicationPreference.setEntryValues(entryValues);
-        mSmsApplicationPreference.setEntryDrawables(entryImages);
-        updateSmsApplicationSetting();
+        String defaultPackageName = null;
+        ComponentName appName = SmsApplication.getDefaultSmsApplication(getActivity(), true);
+        if (appName != null) {
+            defaultPackageName = appName.getPackageName();
+        }
+        mSmsApplicationPreference.setPackageNames(packageNames, defaultPackageName);
     }
 
     @Override
@@ -284,7 +258,7 @@
         mAirplaneModeEnabler = new AirplaneModeEnabler(activity, mAirplaneModePreference);
         mNfcEnabler = new NfcEnabler(activity, nfc, androidBeam);
 
-        mSmsApplicationPreference = (SmsListPreference) findPreference(KEY_SMS_APPLICATION);
+        mSmsApplicationPreference = (AppListPreference) findPreference(KEY_SMS_APPLICATION);
         mSmsApplicationPreference.setOnPreferenceChangeListener(this);
         initSmsApplicationSetting();
 
@@ -468,7 +442,6 @@
     public boolean onPreferenceChange(Preference preference, Object newValue) {
         if (preference == mSmsApplicationPreference && newValue != null) {
             SmsApplication.setDefaultApplication(newValue.toString(), getActivity());
-            updateSmsApplicationSetting();
             return true;
         }
         return false;
