diff --git a/src/com/android/settings/DevelopmentSettings.java b/src/com/android/settings/DevelopmentSettings.java
index 3e05bd9..9269b27 100644
--- a/src/com/android/settings/DevelopmentSettings.java
+++ b/src/com/android/settings/DevelopmentSettings.java
@@ -1453,7 +1453,7 @@
                         obj.transact(IBinder.SYSPROPS_TRANSACTION, data, null, 0);
                     } catch (RemoteException e) {
                     } catch (Exception e) {
-                        Log.i(TAG, "Somone wrote a bad service '" + service
+                        Log.i(TAG, "Someone wrote a bad service '" + service
                                 + "' that doesn't like to be poked: " + e);
                     }
                     data.recycle();
diff --git a/src/com/android/settings/SmsDefaultDialog.java b/src/com/android/settings/SmsDefaultDialog.java
new file mode 100644
index 0000000..93ac864
--- /dev/null
+++ b/src/com/android/settings/SmsDefaultDialog.java
@@ -0,0 +1,90 @@
+/*
+ * 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.content.ComponentName;
+import android.content.Context;
+import android.content.DialogInterface;
+import android.content.Intent;
+import android.content.pm.ApplicationInfo;
+import android.content.pm.PackageManager;
+import android.os.Bundle;
+import android.provider.Telephony.Sms.Intents;
+
+import com.android.internal.app.AlertActivity;
+import com.android.internal.app.AlertController;
+import com.android.internal.telephony.SmsApplication;
+import com.android.internal.telephony.SmsApplication.SmsApplicationData;
+import com.android.settings.R;
+
+public final class SmsDefaultDialog extends AlertActivity implements
+        DialogInterface.OnClickListener {
+    private ComponentName mNewDefault;
+    private SmsApplicationData mNewSmsApplicationData;
+
+    @Override
+    protected void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+
+        Intent intent = getIntent();
+        String packageName = intent.getStringExtra(Intents.EXTRA_PACKAGE_NAME);
+
+        setResult(RESULT_CANCELED);
+        if (!buildDialog(packageName)) {
+            finish();
+        }
+    }
+
+    @Override
+    public void onClick(DialogInterface dialog, int which) {
+        switch (which) {
+            case BUTTON_POSITIVE:
+                SmsApplication.setDefaultApplication(mNewSmsApplicationData.mPackageName, this);
+                setResult(RESULT_OK);
+                break;
+            case BUTTON_NEGATIVE:
+                break;
+        }
+    }
+
+    private boolean buildDialog(String packageName) {
+        mNewSmsApplicationData = SmsApplication.getSmsApplicationData(packageName, this);
+        if (mNewSmsApplicationData == null) {
+            return false;
+        }
+
+        ComponentName oldSmsComponent = SmsApplication.getDefaultSmsApplication(this, true);
+        SmsApplicationData oldSmsApplicationData =
+                SmsApplication.getSmsApplicationData(oldSmsComponent.getPackageName(), this);
+        if (oldSmsApplicationData.mPackageName.equals(mNewSmsApplicationData.mPackageName)) {
+            return false;
+        }
+
+        // Compose dialog; get
+        final AlertController.AlertParams p = mAlertParams;
+        p.mTitle = getString(R.string.sms_change_default_dialog_title);
+        p.mMessage = getString(R.string.sms_change_default_dialog_text,
+                mNewSmsApplicationData.mApplicationName, oldSmsApplicationData.mApplicationName);
+        p.mPositiveButtonText = getString(R.string.yes);
+        p.mNegativeButtonText = getString(R.string.no);
+        p.mPositiveButtonListener = this;
+        p.mNegativeButtonListener = this;
+        setupAlert();
+
+        return true;
+    }
+}
\ No newline at end of file
diff --git a/src/com/android/settings/SmsListPreference.java b/src/com/android/settings/SmsListPreference.java
new file mode 100644
index 0000000..15df776
--- /dev/null
+++ b/src/com/android/settings/SmsListPreference.java
@@ -0,0 +1,86 @@
+/*
+ * 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 bff9ba7..e9b7419 100644
--- a/src/com/android/settings/WirelessSettings.java
+++ b/src/com/android/settings/WirelessSettings.java
@@ -21,11 +21,14 @@
 import android.app.AlertDialog;
 import android.app.Dialog;
 import android.app.admin.DevicePolicyManager;
+import android.content.ComponentName;
 import android.content.Context;
 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;
@@ -34,17 +37,23 @@
 import android.os.UserHandle;
 import android.preference.CheckBoxPreference;
 import android.preference.Preference;
+import android.preference.Preference.OnPreferenceChangeListener;
 import android.preference.PreferenceScreen;
 import android.provider.Settings;
 import android.telephony.TelephonyManager;
 import android.text.TextUtils;
 import android.util.Log;
+
+import com.android.internal.telephony.SmsApplication;
+import com.android.internal.telephony.SmsApplication.SmsApplicationData;
 import com.android.internal.telephony.TelephonyIntents;
 import com.android.internal.telephony.TelephonyProperties;
 import com.android.settings.nfc.NfcEnabler;
-import com.android.settings.NsdEnabler;
 
-public class WirelessSettings extends RestrictedSettingsFragment {
+import java.util.Collection;
+
+public class WirelessSettings extends RestrictedSettingsFragment
+        implements OnPreferenceChangeListener {
     private static final String TAG = "WirelessSettings";
 
     private static final String KEY_TOGGLE_AIRPLANE = "toggle_airplane";
@@ -56,6 +65,7 @@
     private static final String KEY_PROXY_SETTINGS = "proxy_settings";
     private static final String KEY_MOBILE_NETWORK_SETTINGS = "mobile_network_settings";
     private static final String KEY_MANAGE_MOBILE_PLAN = "manage_mobile_plan";
+    private static final String KEY_SMS_APPLICATION = "sms_application";
     private static final String KEY_TOGGLE_NSD = "toggle_nsd"; //network service discovery
     private static final String KEY_CELL_BROADCAST_SETTINGS = "cell_broadcast_settings";
 
@@ -74,6 +84,8 @@
     private static final int MANAGE_MOBILE_PLAN_DIALOG_ID = 1;
     private static final String SAVED_MANAGE_MOBILE_PLAN_MSG = "mManageMobilePlanMessage";
 
+    private SmsListPreference mSmsApplicationPreference;
+
     public WirelessSettings() {
         super(null);
     }
@@ -152,6 +164,52 @@
         }
     }
 
+    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 =
+                SmsApplication.getApplicationCollection(getActivity());
+
+        // 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];
+
+        PackageManager packageManager = getPackageManager();
+        int i = 0;
+        for (SmsApplicationData smsApplicationData : smsApplications) {
+            entries[i] = smsApplicationData.mApplicationName;
+            entryValues[i] = smsApplicationData.mPackageName;
+            try {
+                entryImages[i] = packageManager.getApplicationIcon(smsApplicationData.mPackageName);
+            } catch (NameNotFoundException e) {
+                entryImages[i] = packageManager.getDefaultActivityIcon();
+            }
+            i++;
+        }
+        mSmsApplicationPreference.setEntries(entries);
+        mSmsApplicationPreference.setEntryValues(entryValues);
+        mSmsApplicationPreference.setEntryDrawables(entryImages);
+        updateSmsApplicationSetting();
+    }
+
     @Override
     public Dialog onCreateDialog(int dialogId) {
         log("onCreateDialog: dialogId=" + dialogId);
@@ -187,6 +245,16 @@
         return toggleable != null && toggleable.contains(type);
     }
 
+    private boolean isSmsSupported() {
+        // Some tablet has sim card but could not do telephony operations. Skip those.
+        if (mTm.getPhoneType() == TelephonyManager.PHONE_TYPE_NONE) {
+            return false;
+        }
+        int simState = mTm.getSimState();
+        return simState != TelephonyManager.SIM_STATE_ABSENT &&
+                simState != TelephonyManager.SIM_STATE_UNKNOWN;
+    }
+
     @Override
     public void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
@@ -211,6 +279,9 @@
         mAirplaneModeEnabler = new AirplaneModeEnabler(activity, mAirplaneModePreference);
         mNfcEnabler = new NfcEnabler(activity, nfc, androidBeam);
 
+        mSmsApplicationPreference = (SmsListPreference) findPreference(KEY_SMS_APPLICATION);
+        mSmsApplicationPreference.setOnPreferenceChangeListener(this);
+
         // Remove NSD checkbox by default
         getPreferenceScreen().removePreference(nsd);
         //mNsdEnabler = new NsdEnabler(activity, nsd);
@@ -269,6 +340,11 @@
         protectByRestrictions(KEY_MOBILE_NETWORK_SETTINGS);
         protectByRestrictions(KEY_MANAGE_MOBILE_PLAN);
 
+        // Remove SMS Application if the device does not support SMS
+        if (!isSmsSupported()) {
+            removePreference(KEY_SMS_APPLICATION);
+        }
+
         // Remove Airplane Mode settings if it's a stationary device such as a TV.
         if (getActivity().getPackageManager().hasSystemFeature(PackageManager.FEATURE_TELEVISION)) {
             removePreference(KEY_TOGGLE_AIRPLANE);
@@ -316,6 +392,13 @@
     }
 
     @Override
+    public void onStart() {
+        super.onStart();
+
+        initSmsApplicationSetting();
+    }
+
+    @Override
     public void onResume() {
         super.onResume();
 
@@ -365,4 +448,14 @@
     protected int getHelpResource() {
         return R.string.help_url_more_networks;
     }
+
+    @Override
+    public boolean onPreferenceChange(Preference preference, Object newValue) {
+        if (preference == mSmsApplicationPreference && newValue != null) {
+            SmsApplication.setDefaultApplication(newValue.toString(), getActivity());
+            updateSmsApplicationSetting();
+            return true;
+        }
+        return false;
+    }
 }
