diff --git a/src/com/android/contacts/common/interactions/ImportExportDialogFragment.java b/src/com/android/contacts/common/interactions/ImportExportDialogFragment.java
index c6483cc..41bf304 100644
--- a/src/com/android/contacts/common/interactions/ImportExportDialogFragment.java
+++ b/src/com/android/contacts/common/interactions/ImportExportDialogFragment.java
@@ -120,11 +120,11 @@
             final List<SubInfoRecord> subInfoRecords = getAllSubInfoList();
             if (subInfoRecords.size() == 1) {
                 adapter.add(new AdapterEntry(getString(R.string.import_from_sim),
-                        R.string.import_from_sim, subInfoRecords.get(0).subId));
+                        R.string.import_from_sim, subInfoRecords.get(0).getSubscriptionId()));
             } else {
                 for (SubInfoRecord record : subInfoRecords) {
                     adapter.add(new AdapterEntry(getSubDescription(record),
-                            R.string.import_from_sim, record.subId));
+                            R.string.import_from_sim, record.getSubscriptionId()));
                 }
             }
         }
@@ -294,11 +294,12 @@
     }
 
     private String getSubDescription(SubInfoRecord record) {
-        if (TextUtils.isEmpty(record.number)) {
+        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.
-            return getString(R.string.import_from_sim_summary_no_number, record.displayName);
+            return getString(R.string.import_from_sim_summary_no_number, name);
         }
-        return getString(R.string.import_from_sim_summary, record.displayName, record.number);
+        return getString(R.string.import_from_sim_summary, name, record.getNumber());
     }
 
     private static class AdapterEntry {
diff --git a/src/com/android/contacts/common/location/UpdateCountryService.java b/src/com/android/contacts/common/location/UpdateCountryService.java
index e339306..9403187 100644
--- a/src/com/android/contacts/common/location/UpdateCountryService.java
+++ b/src/com/android/contacts/common/location/UpdateCountryService.java
@@ -38,6 +38,10 @@
 
     @Override
     protected void onHandleIntent(Intent intent) {
+        if (intent == null) {
+            Log.d(TAG, "onHandleIntent: could not handle null intent");
+            return;
+        }
         if (ACTION_UPDATE_COUNTRY.equals(intent.getAction())) {
             final Location location = (Location) intent.getParcelableExtra(KEY_INTENT_LOCATION);
             final String country = getCountryFromLocation(getApplicationContext(), location);
diff --git a/src/com/android/contacts/common/util/ContactDisplayUtils.java b/src/com/android/contacts/common/util/ContactDisplayUtils.java
index 24bb6ef..bb91b53 100644
--- a/src/com/android/contacts/common/util/ContactDisplayUtils.java
+++ b/src/com/android/contacts/common/util/ContactDisplayUtils.java
@@ -210,6 +210,9 @@
      * the entire length of the given phone number.
      */
     public static Spannable getTelephoneTtsSpannable(String phoneNumber) {
+        if (phoneNumber == null) {
+            return null;
+        }
         final Spannable spannable = new SpannableString(phoneNumber);
         final TtsSpan ttsSpan = getTelephoneTtsSpan(phoneNumber);
         spannable.setSpan(ttsSpan, 0, phoneNumber.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
@@ -221,8 +224,11 @@
      * the given phone number text wherever it is found within the message.
      */
     public static Spannable getTelephoneTtsSpannable(String message, String phoneNumber) {
+        if (message == null) {
+            return null;
+        }
         final Spannable spannable = new SpannableString(message);
-        int start = message.indexOf(phoneNumber);
+        int start = phoneNumber == null ? -1 : message.indexOf(phoneNumber);
         while (start >= 0) {
             final int end = start + phoneNumber.length();
             final TtsSpan ttsSpan = getTelephoneTtsSpan(phoneNumber);
diff --git a/src/com/android/contacts/common/vcard/ExportVCardActivity.java b/src/com/android/contacts/common/vcard/ExportVCardActivity.java
index 008beb6..b86845e 100644
--- a/src/com/android/contacts/common/vcard/ExportVCardActivity.java
+++ b/src/com/android/contacts/common/vcard/ExportVCardActivity.java
@@ -216,6 +216,9 @@
      * appearance in bidirectional text.
      */
     private String getTargetFileForDisplay() {
+        if (mTargetFileName == null) {
+            return null;
+        }
         return mBidiFormatter.unicodeWrap(mTargetFileName, TextDirectionHeuristics.LTR);
     }
 
