diff --git a/res/values/strings.xml b/res/values/strings.xml
index a1f7ddb..e21942a 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -1376,11 +1376,17 @@
     <string name="import_from_sim">Import from SIM card</string>
 
     <!-- Action string for selecting a SIM subscription for importing contacts -->
-    <string name="import_from_sim_summary">Import from SIM <xliff:g id="sim_name">^1</xliff:g> - <xliff:g id="sim_number">^2</xliff:g></string>
+    <string name="import_from_sim_summary">Import from SIM <xliff:g id="sim_name">^1</xliff:g>\n<xliff:g id="sim_number">^2</xliff:g></string>
 
     <!-- Action string for selecting a SIM subscription for importing contacts, without a phone number -->
     <string name="import_from_sim_summary_no_number">Import from SIM <xliff:g id="sim_name">%1$s</xliff:g></string>
 
+    <!-- Action string for selecting a SIM subscription for importing contacts -->
+    <string name="import_from_sim_summary_by_carrier">Import from <xliff:g id="carrier_name">^1</xliff:g> SIM\n<xliff:g id="sim_number">^2</xliff:g></string>
+
+    <!-- Action string for selecting a SIM subscription for importing contacts -->
+    <string name="import_from_sim_summary_by_carrier_no_number">Import from <xliff:g id="carrier_name">%1$s</xliff:g> SIM</string>
+
     <!-- Action string for selecting a .vcf file to import contacts from [CHAR LIMIT=30] -->
     <string name="import_from_vcf_file" product="default">Import from .vcf file</string>
 
diff --git a/src/com/android/contacts/common/interactions/ImportDialogFragment.java b/src/com/android/contacts/common/interactions/ImportDialogFragment.java
index 991a9c2..30c6603 100644
--- a/src/com/android/contacts/common/interactions/ImportDialogFragment.java
+++ b/src/com/android/contacts/common/interactions/ImportDialogFragment.java
@@ -24,8 +24,11 @@
 import android.content.Context;
 import android.content.DialogInterface;
 import android.content.res.Resources;
+import android.os.Build;
 import android.os.Bundle;
 import android.provider.ContactsContract.Contacts;
+import android.support.annotation.RequiresApi;
+import android.support.v4.util.ArraySet;
 import android.telephony.SubscriptionInfo;
 import android.telephony.SubscriptionManager;
 import android.telephony.TelephonyManager;
@@ -45,10 +48,11 @@
 import com.android.contacts.common.model.account.AccountWithDataSet;
 import com.android.contacts.common.util.AccountSelectionUtil;
 import com.android.contacts.common.util.AccountsListAdapter.AccountListFilter;
-import com.android.contacts.common.vcard.VCardCommonArguments;
 import com.android.contacts.editor.SelectAccountDialogFragment;
 
 import java.util.List;
+import java.util.Locale;
+import java.util.Set;
 
 /**
  * An dialog invoked to import/export contacts.
@@ -60,6 +64,9 @@
     private static final String KEY_RES_ID = "resourceId";
     private static final String KEY_SUBSCRIPTION_ID = "subscriptionId";
 
+    public static final String EXTRA_SIM_ONLY = "extraSimOnly";
+
+    private boolean mSimOnly = false;
 
     private final String[] LOOKUP_PROJECTION = new String[] {
             Contacts.LOOKUP_KEY
@@ -68,15 +75,31 @@
     private SubscriptionManager mSubscriptionManager;
 
     /** Preferred way to show this dialog */
-    public static void show(FragmentManager fragmentManager, Class callingActivity) {
+    public static void show(FragmentManager fragmentManager) {
+        final ImportDialogFragment fragment = new ImportDialogFragment();
+        fragment.show(fragmentManager, TAG);
+    }
+
+    /**
+     * Create an instance that will only have items for the SIM cards (VCF will not be included).
+     */
+    public static void showForSimOnly(FragmentManager fragmentManager) {
         final ImportDialogFragment fragment = new ImportDialogFragment();
         Bundle args = new Bundle();
-        args.putString(VCardCommonArguments.ARG_CALLING_ACTIVITY, callingActivity.getName());
+        args.putBoolean(EXTRA_SIM_ONLY, true);
         fragment.setArguments(args);
         fragment.show(fragmentManager, TAG);
     }
 
     @Override
+    public void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+
+        final Bundle args = getArguments();
+        mSimOnly = args != null && args.getBoolean(EXTRA_SIM_ONLY, false);
+    }
+
+    @Override
     public Context getContext() {
         return getActivity();
     }
@@ -92,8 +115,6 @@
         final Resources res = getActivity().getResources();
         final LayoutInflater dialogInflater = (LayoutInflater)getActivity()
                 .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
-        final String callingActivity = getArguments().getString(
-                VCardCommonArguments.ARG_CALLING_ACTIVITY);
 
         // Adapter that shows a list of string resources
         final ArrayAdapter<AdapterEntry> adapter = new ArrayAdapter<AdapterEntry>(getActivity(),
@@ -110,7 +131,7 @@
 
         final TelephonyManager manager =
                 (TelephonyManager) getActivity().getSystemService(Context.TELEPHONY_SERVICE);
-        if (res.getBoolean(R.bool.config_allow_import_from_vcf_file)) {
+        if (res.getBoolean(R.bool.config_allow_import_from_vcf_file) && !mSimOnly) {
             adapter.add(new AdapterEntry(getString(R.string.import_from_vcf_file),
                     R.string.import_from_vcf_file));
         }
@@ -129,6 +150,11 @@
                     if (subInfoRecords.size() == 1) {
                         adapter.add(new AdapterEntry(getString(R.string.import_from_sim),
                                 R.string.import_from_sim, subInfoRecords.get(0).getSubscriptionId()));
+                    } else if (hasUniqueNonNullCarrierNames(subInfoRecords)) {
+                        for (SubscriptionInfo record : subInfoRecords) {
+                            adapter.add(new AdapterEntry(getSubDescriptionForCarrier(record),
+                                    R.string.import_from_sim, record.getSubscriptionId()));
+                        }
                     } else {
                         for (SubscriptionInfo record : subInfoRecords) {
                             adapter.add(new AdapterEntry(getSubDescription(record),
@@ -234,18 +260,62 @@
         dismiss();
     }
 
+    @RequiresApi(api = Build.VERSION_CODES.LOLLIPOP_MR1)
+    private boolean hasUniqueNonNullCarrierNames(List<SubscriptionInfo> subscriptions) {
+        final Set<CharSequence> names = new ArraySet<>();
+        for (SubscriptionInfo subscription : subscriptions) {
+            final CharSequence name = subscription.getCarrierName();
+            if (name == null) {
+                return false;
+            }
+            if (!names.add(name)) {
+                return false;
+            }
+        }
+        return true;
+    }
+
     private CharSequence getSubDescription(SubscriptionInfo record) {
-        CharSequence name = record.getDisplayName();
-        if (TextUtils.isEmpty(record.getNumber())) {
-            // Don't include the phone number in the description, since we don't know the number.
+        final CharSequence name = record.getDisplayName();
+        final CharSequence number = getFormattedNumber(record);
+
+        if (TextUtils.isEmpty(number)) {
             return getString(R.string.import_from_sim_summary_no_number, name);
         }
-        return TextUtils.expandTemplate(
-                getString(R.string.import_from_sim_summary),
-                name,
-                PhoneNumberUtilsCompat.createTtsSpannable(record.getNumber()));
+
+        return TextUtils.expandTemplate(getString(R.string.import_from_sim_summary), name, number);
     }
 
+    private CharSequence getSubDescriptionForCarrier(SubscriptionInfo record) {
+        final CharSequence carrierName = record.getCarrierName();
+        final CharSequence number = getFormattedNumber(record);
+
+        if (TextUtils.isEmpty(number)) {
+            return getString(R.string.import_from_sim_summary_by_carrier_no_number, carrierName);
+        }
+
+        return TextUtils.expandTemplate(
+                getString(R.string.import_from_sim_summary_by_carrier), carrierName, number);
+    }
+
+    private CharSequence getFormattedNumber(SubscriptionInfo subscription) {
+        final String rawNumber = subscription.getNumber();
+        if (rawNumber == null) {
+            return null;
+        }
+        final String country = subscription.getCountryIso();
+        final String number;
+        if (country != null) {
+            number = PhoneNumberUtilsCompat.formatNumber(rawNumber, null,
+                    country.toUpperCase(Locale.US));
+        } else {
+            number = rawNumber;
+        }
+        return PhoneNumberUtilsCompat.createTtsSpannable(number);
+    }
+
+
+
     private static class AdapterEntry {
         public final CharSequence mLabel;
         public final int mChoiceResourceId;
diff --git a/src/com/android/contacts/common/preference/DisplayOptionsPreferenceFragment.java b/src/com/android/contacts/common/preference/DisplayOptionsPreferenceFragment.java
index a6881ed..1b9818f 100644
--- a/src/com/android/contacts/common/preference/DisplayOptionsPreferenceFragment.java
+++ b/src/com/android/contacts/common/preference/DisplayOptionsPreferenceFragment.java
@@ -324,7 +324,7 @@
             ((ContactsPreferenceActivity) getActivity()).showAboutFragment();
             return true;
         } else if (KEY_IMPORT.equals(prefKey)) {
-            ImportDialogFragment.show(getFragmentManager(), ContactsPreferenceActivity.class);
+            ImportDialogFragment.show(getFragmentManager());
             return true;
         } else if (KEY_EXPORT.equals(prefKey)) {
             ExportDialogFragment.show(getFragmentManager(), ContactsPreferenceActivity.class,
diff --git a/src/com/android/contacts/list/ContactsUnavailableFragment.java b/src/com/android/contacts/list/ContactsUnavailableFragment.java
index 518447c..72e6718 100644
--- a/src/com/android/contacts/list/ContactsUnavailableFragment.java
+++ b/src/com/android/contacts/list/ContactsUnavailableFragment.java
@@ -148,7 +148,7 @@
                 ImplicitIntentsUtil.startActivityOutsideApp(getActivity(), intent);
                 break;
             case R.id.import_contacts_button:
-                ImportDialogFragment.show(getFragmentManager(), getActivity().getClass());
+                ImportDialogFragment.show(getFragmentManager());
                 break;
         }
     }
