diff --git a/res/values-zh-rCN/strings.xml b/res/values-zh-rCN/strings.xml
index 567f985..7d93ad6 100644
--- a/res/values-zh-rCN/strings.xml
+++ b/res/values-zh-rCN/strings.xml
@@ -510,7 +510,7 @@
     <string name="voicemail_fetching_timout" msgid="6691792377574905201">"无法抓取语音邮件。"</string>
     <string name="call_log_new_header" msgid="846546437517724715">"新记录"</string>
     <string name="call_log_old_header" msgid="6262205894314263629">"旧记录"</string>
-    <string name="call_log_voicemail_header" msgid="4484032064803446806">"通过语音信箱接听的电话"</string>
+    <string name="call_log_voicemail_header" msgid="4484032064803446806">"通过语音信箱接到的电话"</string>
     <string name="call_log_incoming_header" msgid="297542827180501480">"来电"</string>
     <string name="call_log_outgoing_header" msgid="9017138725495067284">"外拨电话"</string>
     <string name="call_log_missed_header" msgid="2168865291934970151">"未接来电"</string>
diff --git a/res/values/donottranslate_config.xml b/res/values/donottranslate_config.xml
index dd94097..2110a8b 100644
--- a/res/values/donottranslate_config.xml
+++ b/res/values/donottranslate_config.xml
@@ -55,9 +55,6 @@
     specific to some vendor (like DoCoMo), specify this type (e.g. "docomo") -->
     <string name="config_export_vcard_type" translatable="false">default</string>
 
-    <!-- Directory in which exported VCard file is stored -->
-    <string name="config_export_dir" translatable="false">/mnt/sdcard</string>
-
     <!-- Prefix of exported VCard file -->
     <string name="config_export_file_prefix" translatable="false"></string>
 
diff --git a/src/com/android/contacts/detail/ContactDetailFragment.java b/src/com/android/contacts/detail/ContactDetailFragment.java
index f66466d..87c321e 100644
--- a/src/com/android/contacts/detail/ContactDetailFragment.java
+++ b/src/com/android/contacts/detail/ContactDetailFragment.java
@@ -42,7 +42,6 @@
 import android.provider.ContactsContract.Directory;
 import android.provider.ContactsContract.DisplayNameSources;
 import android.provider.ContactsContract.StatusUpdates;
-import android.telephony.PhoneNumberUtils;
 import android.text.TextUtils;
 import android.util.Log;
 import android.view.ContextMenu;
@@ -573,9 +572,7 @@
                 } else if (dataItem instanceof PhoneDataItem && hasData) {
                     PhoneDataItem phone = (PhoneDataItem) dataItem;
                     // Build phone entries
-                    String phoneNumberE164 = phone.getNormalizedNumber();
-                    entry.data = PhoneNumberUtils.formatNumber(
-                            entry.data, phoneNumberE164, mDefaultCountryIso);
+                    entry.data = phone.getFormattedPhoneNumber();
                     final Intent phoneIntent = mHasPhone ?
                             ContactsUtils.getCallIntent(entry.data) : null;
                     final Intent smsIntent = mHasSms ? new Intent(Intent.ACTION_SENDTO,
diff --git a/src/com/android/contacts/detail/ContactLoaderFragment.java b/src/com/android/contacts/detail/ContactLoaderFragment.java
index 6a69744..37fabb0 100644
--- a/src/com/android/contacts/detail/ContactLoaderFragment.java
+++ b/src/com/android/contacts/detail/ContactLoaderFragment.java
@@ -187,7 +187,7 @@
             Uri lookupUri = args.getParcelable(LOADER_ARG_CONTACT_URI);
             return new ContactLoader(mContext, lookupUri, true /* loadGroupMetaData */,
                     true /* loadStreamItems */, true /* load invitable account types */,
-                    true /* postViewNotification */);
+                    true /* postViewNotification */, true /* computeFormattedPhoneNumber */);
         }
 
         @Override
diff --git a/src/com/android/contacts/model/ContactLoader.java b/src/com/android/contacts/model/ContactLoader.java
index 28000a6..0b7e40d 100644
--- a/src/com/android/contacts/model/ContactLoader.java
+++ b/src/com/android/contacts/model/ContactLoader.java
@@ -41,10 +41,12 @@
 import android.util.Log;
 import android.util.LongSparseArray;
 
+import com.android.contacts.ContactsUtils;
 import com.android.contacts.GroupMetaData;
 import com.android.contacts.model.account.AccountType;
 import com.android.contacts.model.account.AccountTypeWithDataSet;
 import com.android.contacts.model.dataitem.DataItem;
+import com.android.contacts.model.dataitem.PhoneDataItem;
 import com.android.contacts.model.dataitem.PhotoDataItem;
 import com.android.contacts.util.ContactLoaderUtils;
 import com.android.contacts.util.DataStatus;
@@ -81,17 +83,18 @@
     private boolean mLoadStreamItems;
     private boolean mLoadInvitableAccountTypes;
     private boolean mPostViewNotification;
+    private boolean mComputeFormattedPhoneNumber;
     private Contact mContact;
     private ForceLoadContentObserver mObserver;
     private final Set<Long> mNotifiedRawContactIds = Sets.newHashSet();
 
     public ContactLoader(Context context, Uri lookupUri, boolean postViewNotification) {
-        this(context, lookupUri, false, false, false, postViewNotification);
+        this(context, lookupUri, false, false, false, postViewNotification, false);
     }
 
     public ContactLoader(Context context, Uri lookupUri, boolean loadGroupMetaData,
             boolean loadStreamItems, boolean loadInvitableAccountTypes,
-            boolean postViewNotification) {
+            boolean postViewNotification, boolean computeFormattedPhoneNumber) {
         super(context);
         mLookupUri = lookupUri;
         mRequestedUri = lookupUri;
@@ -99,6 +102,7 @@
         mLoadStreamItems = loadStreamItems;
         mLoadInvitableAccountTypes = loadInvitableAccountTypes;
         mPostViewNotification = postViewNotification;
+        mComputeFormattedPhoneNumber = computeFormattedPhoneNumber;
     }
 
     /**
@@ -379,7 +383,8 @@
                 }
                 if (!cursor.isNull(ContactQuery.DATA_ID)) {
                     ContentValues data = loadDataValues(cursor);
-                    rawContact.addDataItemValues(data);
+                    final DataItem item = rawContact.addDataItemValues(data);
+                    processDataItem(item);
 
                     if (!cursor.isNull(ContactQuery.PRESENCE)
                             || !cursor.isNull(ContactQuery.STATUS)) {
@@ -400,6 +405,19 @@
     }
 
     /**
+     * Performs any further computations on the data item
+     */
+    private void processDataItem(DataItem dataItem) {
+        if (dataItem instanceof PhoneDataItem) {
+            if (mComputeFormattedPhoneNumber) {
+                final PhoneDataItem phoneDataItem = (PhoneDataItem) dataItem;
+                final String defaultCountryIso = ContactsUtils.getCurrentCountryIso(getContext());
+                phoneDataItem.computeFormattedPhoneNumber(defaultCountryIso);
+            }
+        }
+    }
+
+    /**
      * Looks for the photo data item in entities. If found, creates a new Bitmap instance. If
      * not found, returns null
      */
diff --git a/src/com/android/contacts/model/RawContact.java b/src/com/android/contacts/model/RawContact.java
index d884198..6d4a881 100644
--- a/src/com/android/contacts/model/RawContact.java
+++ b/src/com/android/contacts/model/RawContact.java
@@ -228,12 +228,18 @@
         setAccount(null, null, null);
     }
 
-    public void addDataItemValues(ContentValues values) {
-        addNamedDataItemValues(Data.CONTENT_URI, values);
+    /**
+     * Creates and inserts a DataItem object that wraps the content values, and returns it.
+     */
+    public DataItem addDataItemValues(ContentValues values) {
+        final NamedDataItem namedItem = addNamedDataItemValues(Data.CONTENT_URI, values);
+        return namedItem.dataItem;
     }
 
-    public void addNamedDataItemValues(Uri uri, ContentValues values) {
-        mDataItems.add(new NamedDataItem(uri, DataItem.createFrom(this, values)));
+    public NamedDataItem addNamedDataItemValues(Uri uri, ContentValues values) {
+        final NamedDataItem namedItem = new NamedDataItem(uri, DataItem.createFrom(this, values));
+        mDataItems.add(namedItem);
+        return namedItem;
     }
 
     public List<DataItem> getDataItems() {
diff --git a/src/com/android/contacts/model/dataitem/PhoneDataItem.java b/src/com/android/contacts/model/dataitem/PhoneDataItem.java
index 94a0054..61d62c1 100644
--- a/src/com/android/contacts/model/dataitem/PhoneDataItem.java
+++ b/src/com/android/contacts/model/dataitem/PhoneDataItem.java
@@ -19,6 +19,7 @@
 import android.content.ContentValues;
 import android.provider.ContactsContract;
 import android.provider.ContactsContract.CommonDataKinds.Phone;
+import android.telephony.PhoneNumberUtils;
 
 import com.android.contacts.model.RawContact;
 
@@ -28,6 +29,8 @@
  */
 public class PhoneDataItem extends DataItem {
 
+    public static final String KEY_FORMATTED_PHONE_NUMBER = "formattedPhoneNumber";
+
     /* package */ PhoneDataItem(RawContact rawContact, ContentValues values) {
         super(rawContact, values);
     }
@@ -43,6 +46,10 @@
         return getContentValues().getAsString(Phone.NORMALIZED_NUMBER);
     }
 
+    public String getFormattedPhoneNumber() {
+        return getContentValues().getAsString(KEY_FORMATTED_PHONE_NUMBER);
+    }
+
     /**
      * Values are Phone.TYPE_*
      */
@@ -54,4 +61,13 @@
         return getContentValues().getAsString(Phone.LABEL);
     }
 
+    public void computeFormattedPhoneNumber(String defaultCountryIso) {
+        final String phoneNumber = getNumber();
+        if (phoneNumber != null) {
+            final String formattedPhoneNumber = PhoneNumberUtils.formatNumber(phoneNumber,
+                    getNormalizedNumber(), defaultCountryIso);
+            getContentValues().put(KEY_FORMATTED_PHONE_NUMBER, formattedPhoneNumber);
+        }
+    }
+
 }
diff --git a/src/com/android/contacts/socialwidget/SocialWidgetProvider.java b/src/com/android/contacts/socialwidget/SocialWidgetProvider.java
index 03517d4..259f38d 100644
--- a/src/com/android/contacts/socialwidget/SocialWidgetProvider.java
+++ b/src/com/android/contacts/socialwidget/SocialWidgetProvider.java
@@ -114,7 +114,7 @@
             return;
         }
         final ContactLoader contactLoader = new ContactLoader(context, contactUri, false, true,
-                false, true);
+                false, true, false);
         contactLoader.registerListener(0,
                 new ContactLoader.OnLoadCompleteListener<Contact>() {
                     @Override
diff --git a/src/com/android/contacts/vcard/ExportVCardActivity.java b/src/com/android/contacts/vcard/ExportVCardActivity.java
index ac0850f..6bed577 100644
--- a/src/com/android/contacts/vcard/ExportVCardActivity.java
+++ b/src/com/android/contacts/vcard/ExportVCardActivity.java
@@ -25,6 +25,7 @@
 import android.content.ServiceConnection;
 import android.net.Uri;
 import android.os.Bundle;
+import android.os.Environment;
 import android.os.Handler;
 import android.os.IBinder;
 import android.os.Message;
@@ -148,7 +149,14 @@
         super.onCreate(bundle);
 
         // Check directory is available.
-        final File targetDirectory = new File(getString(R.string.config_export_dir));
+        if (!Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {
+            Log.w(LOG_TAG, "External storage is in state " + Environment.getExternalStorageState() +
+                    ". Cancelling export");
+            showDialog(R.id.dialog_sdcard_not_found);
+            return;
+        }
+
+        final File targetDirectory = Environment.getExternalStorageDirectory();
         if (!(targetDirectory.exists() &&
                 targetDirectory.isDirectory() &&
                 targetDirectory.canRead()) &&
diff --git a/src/com/android/contacts/vcard/VCardService.java b/src/com/android/contacts/vcard/VCardService.java
index 4ef1bcb..74ce69c 100644
--- a/src/com/android/contacts/vcard/VCardService.java
+++ b/src/com/android/contacts/vcard/VCardService.java
@@ -22,6 +22,7 @@
 import android.media.MediaScannerConnection.MediaScannerConnectionClient;
 import android.net.Uri;
 import android.os.Binder;
+import android.os.Environment;
 import android.os.IBinder;
 import android.os.Message;
 import android.os.Messenger;
@@ -117,7 +118,7 @@
     // If true, VCardExporter is able to emits files longer than 8.3 format.
     private static final boolean ALLOW_LONG_FILE_NAME = false;
 
-    private String mTargetDirectory;
+    private File mTargetDirectory;
     private String mFileNamePrefix;
     private String mFileNameSuffix;
     private int mFileIndexMinimum;
@@ -146,7 +147,7 @@
     }
 
     private void initExporterParams() {
-        mTargetDirectory = getString(R.string.config_export_dir);
+        mTargetDirectory = Environment.getExternalStorageDirectory();
         mFileNamePrefix = getString(R.string.config_export_file_prefix);
         mFileNameSuffix = getString(R.string.config_export_file_suffix);
         mFileNameExtension = getString(R.string.config_export_file_extension);
@@ -453,7 +454,7 @@
      * @return destination path for a vCard file to be exported. null on error and mErrorReason
      * is correctly set.
      */
-    private String getAppropriateDestination(final String destDirectory) {
+    private String getAppropriateDestination(final File destDirectory) {
         /*
          * Here, file names have 5 parts: directory, prefix, index, suffix, and extension.
          * e.g. "/mnt/sdcard/prfx00001sfx.vcf" -> "/mnt/sdcard", "prfx", "00001", "sfx", and ".vcf"
@@ -498,28 +499,30 @@
 
         for (int i = mFileIndexMinimum; i <= mFileIndexMaximum; i++) {
             boolean numberIsAvailable = true;
-            String body = null;
+            final String body = String.format(bodyFormat, mFileNamePrefix, i, mFileNameSuffix);
+            // Make sure that none of the extensions of mExtensionsToConsider matches. If this
+            // number is free, we'll go ahead with mFileNameExtension (which is included in
+            // mExtensionsToConsider)
             for (String possibleExtension : mExtensionsToConsider) {
-                body = String.format(bodyFormat, mFileNamePrefix, i, mFileNameSuffix);
-                final String path =
-                        String.format("%s/%s.%s", destDirectory, body, possibleExtension);
+                final File file = new File(destDirectory, body + "." + possibleExtension);
+                final String path = file.getAbsolutePath();
                 synchronized (this) {
+                    // Is this being exported right now? Skip this number
                     if (mReservedDestination.contains(path)) {
                         if (DEBUG) {
-                            Log.d(LOG_TAG, String.format("The path %s is reserved.", path));
+                            Log.d(LOG_TAG, String.format("%s is already being exported.", path));
                         }
                         numberIsAvailable = false;
                         break;
                     }
                 }
-                final File file = new File(path);
                 if (file.exists()) {
                     numberIsAvailable = false;
                     break;
                 }
             }
             if (numberIsAvailable) {
-                return String.format("%s/%s.%s", destDirectory, body, mFileNameExtension);
+                return new File(destDirectory, body + "." + mFileNameExtension).getAbsolutePath();
             }
         }
 
