diff --git a/src/com/android/contacts/CallDetailActivity.java b/src/com/android/contacts/CallDetailActivity.java
index 9fd1b03..d2c193e 100644
--- a/src/com/android/contacts/CallDetailActivity.java
+++ b/src/com/android/contacts/CallDetailActivity.java
@@ -419,7 +419,9 @@
                     numberText = candidateNumberText;
                 }
             }
-            return new PhoneCallDetails(number, numberText, new int[]{ callType }, date, duration,
+            return new PhoneCallDetails(number, numberText,
+                    mPhoneNumberHelper.parsePhoneNumber(number, countryIso),
+                    new int[]{ callType }, date, duration,
                     nameText, numberType, numberLabel, personId, photoUri);
         } finally {
             if (callCursor != null) {
diff --git a/src/com/android/contacts/PhoneCallDetails.java b/src/com/android/contacts/PhoneCallDetails.java
index d4786d9..0672673 100644
--- a/src/com/android/contacts/PhoneCallDetails.java
+++ b/src/com/android/contacts/PhoneCallDetails.java
@@ -16,6 +16,8 @@
 
 package com.android.contacts;
 
+import com.google.i18n.phonenumbers.Phonenumber.PhoneNumber;
+
 import android.net.Uri;
 import android.provider.CallLog.Calls;
 import android.provider.ContactsContract.CommonDataKinds.Phone;
@@ -28,6 +30,8 @@
     public final CharSequence number;
     /** The formatted version of {@link #number}. */
     public final CharSequence formattedNumber;
+    /** The structured phone number corresponding to {@link #number}. */
+    public final PhoneNumber structuredPhoneNumber;
     /**
      * The type of calls, as defined in the call log table, e.g., {@link Calls#INCOMING_TYPE}.
      * <p>
@@ -53,17 +57,20 @@
     public final Uri photoUri;
 
     /** Create the details for a call with a number not associated with a contact. */
-    public PhoneCallDetails(CharSequence number, CharSequence formattedNumber, int[] callTypes,
-            long date, long duration) {
-        this(number, formattedNumber, callTypes, date, duration, "", 0, "", -1L, null);
+    public PhoneCallDetails(CharSequence number, CharSequence formattedNumber,
+            PhoneNumber structuredPhoneNumber, int[] callTypes, long date, long duration) {
+        this(number, formattedNumber, structuredPhoneNumber, callTypes, date, duration,
+                "", 0, "", -1L, null);
     }
 
     /** Create the details for a call with a number associated with a contact. */
-    public PhoneCallDetails(CharSequence number, CharSequence formattedNumber, int[] callTypes,
-            long date, long duration, CharSequence name, int numberType, CharSequence numberLabel,
-            long personId, Uri photoUri) {
+    public PhoneCallDetails(CharSequence number, CharSequence formattedNumber,
+            PhoneNumber structuredPhoneNumber, int[] callTypes, long date, long duration,
+            CharSequence name, int numberType, CharSequence numberLabel, long personId,
+            Uri photoUri) {
         this.number = number;
         this.formattedNumber = formattedNumber;
+        this.structuredPhoneNumber = structuredPhoneNumber;
         this.callTypes = callTypes;
         this.date = date;
         this.duration = duration;
diff --git a/src/com/android/contacts/PhoneCallDetailsHelper.java b/src/com/android/contacts/PhoneCallDetailsHelper.java
index 8369a0c..db3928e 100644
--- a/src/com/android/contacts/PhoneCallDetailsHelper.java
+++ b/src/com/android/contacts/PhoneCallDetailsHelper.java
@@ -118,7 +118,7 @@
             mPhoneNumberHelper.getDisplayNumber(details.number, details.formattedNumber);
         if (TextUtils.isEmpty(details.name)) {
             nameText = displayNumber;
-            numberText = "";
+            numberText = mPhoneNumberHelper.getGeocodeForNumber(details.structuredPhoneNumber);
         } else {
             nameText = details.name;
             if (numberFormattedLabel != null) {
diff --git a/src/com/android/contacts/calllog/CallLogFragment.java b/src/com/android/contacts/calllog/CallLogFragment.java
index 49a6043..5d51713 100644
--- a/src/com/android/contacts/calllog/CallLogFragment.java
+++ b/src/com/android/contacts/calllog/CallLogFragment.java
@@ -29,6 +29,7 @@
 import com.android.contacts.util.ExpirableCache;
 import com.android.internal.telephony.CallerInfo;
 import com.google.common.annotations.VisibleForTesting;
+import com.google.i18n.phonenumbers.Phonenumber.PhoneNumber;
 
 import android.app.ListFragment;
 import android.content.ContentUris;
@@ -267,6 +268,8 @@
         private CharArrayBuffer mBuffer2 = new CharArrayBuffer(128);
         /** Helper to set up contact photos. */
         private final ContactPhotoManager mContactPhotoManager;
+        /** Helper to parse and process phone numbers. */
+        private PhoneNumberHelper mPhoneNumberHelper;
 
         /** Can be set to true by tests to disable processing of requests. */
         private volatile boolean mRequestProcessingDisabled = false;
@@ -321,12 +324,11 @@
                     R.drawable.ic_call_log_list_action_play);
 
             mContactPhotoManager = ContactPhotoManager.getInstance(getActivity());
-            PhoneNumberHelper phoneNumberHelper =
-                    new PhoneNumberHelper(getResources(), mVoiceMailNumber);
+            mPhoneNumberHelper = new PhoneNumberHelper(getResources(), mVoiceMailNumber);
             PhoneCallDetailsHelper phoneCallDetailsHelper = new PhoneCallDetailsHelper(
-                    getActivity(), resources, callTypeHelper, phoneNumberHelper );
+                    getActivity(), resources, callTypeHelper, mPhoneNumberHelper );
             mCallLogViewsHelper = new CallLogListItemHelper(phoneCallDetailsHelper,
-                    phoneNumberHelper, callDrawable, playDrawable);
+                    mPhoneNumberHelper, callDrawable, playDrawable);
         }
 
         /**
@@ -788,11 +790,14 @@
 
             final int[] callTypes = getCallTypes(c, count);
             final PhoneCallDetails details;
+            PhoneNumber structuredPhoneNumber =
+                    mPhoneNumberHelper.parsePhoneNumber(number, countryIso);
             if (TextUtils.isEmpty(name)) {
-                details = new PhoneCallDetails(number, formattedNumber, callTypes, date, duration);
+                details = new PhoneCallDetails(number, formattedNumber, structuredPhoneNumber,
+                        callTypes, date, duration);
             } else {
-                details = new PhoneCallDetails(number, formattedNumber, callTypes, date, duration,
-                        name, ntype, label, personId, thumbnailUri);
+                details = new PhoneCallDetails(number, formattedNumber, structuredPhoneNumber,
+                        callTypes, date, duration, name, ntype, label, personId, thumbnailUri);
             }
 
             final boolean isNew = isNewSection(c);
diff --git a/src/com/android/contacts/calllog/PhoneNumberHelper.java b/src/com/android/contacts/calllog/PhoneNumberHelper.java
index 4d96f4f..c898a09 100644
--- a/src/com/android/contacts/calllog/PhoneNumberHelper.java
+++ b/src/com/android/contacts/calllog/PhoneNumberHelper.java
@@ -18,6 +18,10 @@
 
 import com.android.contacts.R;
 import com.android.internal.telephony.CallerInfo;
+import com.google.i18n.phonenumbers.NumberParseException;
+import com.google.i18n.phonenumbers.PhoneNumberUtil;
+import com.google.i18n.phonenumbers.Phonenumber.PhoneNumber;
+import com.google.i18n.phonenumbers.geocoding.PhoneNumberOfflineGeocoder;
 
 import android.content.res.Resources;
 import android.net.Uri;
@@ -30,10 +34,14 @@
 public class PhoneNumberHelper {
     private final Resources mResources;
     private final String mVoicemailNumber;
+    private final PhoneNumberUtil mPhoneNumberUtil;
+    private final PhoneNumberOfflineGeocoder mPhoneNumberOfflineGeocoder;
 
     public PhoneNumberHelper(Resources resources, String voicemailNumber) {
         mResources = resources;
         mVoicemailNumber = voicemailNumber;
+        mPhoneNumberUtil = PhoneNumberUtil.getInstance();
+        mPhoneNumberOfflineGeocoder = PhoneNumberOfflineGeocoder.getInstance();
     }
 
     /** Returns true if it is possible to place a call to the given number. */
@@ -98,4 +106,26 @@
     public boolean isSipNumber(CharSequence number) {
         return PhoneNumberUtils.isUriNumber(number.toString());
     }
+
+    /**
+     * Returns a structured phone number from the given text representation, or null if the number
+     * cannot be parsed.
+     */
+    public PhoneNumber parsePhoneNumber(String number, String countryIso) {
+        try {
+            return mPhoneNumberUtil.parse(number, countryIso);
+        } catch (NumberParseException e) {
+            return null;
+        }
+    }
+
+    /** Returns the geocode associated with a phone number or the empty string if not available. */
+    public String getGeocodeForNumber(PhoneNumber structuredPhoneNumber) {
+        if (structuredPhoneNumber != null) {
+            return mPhoneNumberOfflineGeocoder.getDescriptionForNumber(
+                    structuredPhoneNumber, mResources.getConfiguration().locale);
+        } else {
+            return "";
+        }
+    }
 }
diff --git a/tests/src/com/android/contacts/PhoneCallDetailsHelperTest.java b/tests/src/com/android/contacts/PhoneCallDetailsHelperTest.java
index b628a5e..e228c3b 100644
--- a/tests/src/com/android/contacts/PhoneCallDetailsHelperTest.java
+++ b/tests/src/com/android/contacts/PhoneCallDetailsHelperTest.java
@@ -20,6 +20,7 @@
 import com.android.contacts.calllog.PhoneNumberHelper;
 import com.android.contacts.util.LocaleTestUtils;
 import com.android.internal.telephony.CallerInfo;
+import com.google.i18n.phonenumbers.Phonenumber.PhoneNumber;
 
 import android.content.Context;
 import android.content.res.Resources;
@@ -58,11 +59,14 @@
     private static final Drawable TEST_MISSED_DRAWABLE = new ColorDrawable(Color.RED);
     /** A drawable to be used for voicemails. */
     private static final Drawable TEST_VOICEMAIL_DRAWABLE = new ColorDrawable(Color.CYAN);
+    /** The country ISO name used in the tests. */
+    private static final String TEST_COUNTRY_ISO = "US";
 
     /** The object under test. */
     private PhoneCallDetailsHelper mHelper;
     /** The views to fill. */
     private PhoneCallDetailsViews mViews;
+    private PhoneNumberHelper mPhoneNumberHelper;
 
     @Override
     protected void setUp() throws Exception {
@@ -71,9 +75,9 @@
         Resources resources = context.getResources();
         CallTypeHelper callTypeHelper = new CallTypeHelper(resources, TEST_INCOMING_DRAWABLE,
                 TEST_OUTGOING_DRAWABLE, TEST_MISSED_DRAWABLE, TEST_VOICEMAIL_DRAWABLE);
-        PhoneNumberHelper phoneNumberHelper =
-                new PhoneNumberHelper(resources, TEST_VOICEMAIL_NUMBER);
-        mHelper = new PhoneCallDetailsHelper(context, resources, callTypeHelper, phoneNumberHelper);
+        mPhoneNumberHelper = new PhoneNumberHelper(resources, TEST_VOICEMAIL_NUMBER);
+        mHelper = new PhoneCallDetailsHelper(
+                context, resources, callTypeHelper, mPhoneNumberHelper);
         mViews = PhoneCallDetailsViews.createForTest(new TextView(context),
                 new LinearLayout(context), new TextView(context), new View(context),
                 new TextView(context), new TextView(context));
@@ -172,6 +176,18 @@
         }
     }
 
+    public void testSetPhoneCallDetails_Geocode() {
+        LocaleTestUtils localeTestUtils = new LocaleTestUtils(getContext());
+        localeTestUtils.setLocale(Locale.US);
+        try {
+            setPhoneCallDetailsWithNumber("+14125555555", "1-412-555-5555");
+            assertNameEquals("1-412-555-5555");  // The phone number is shown as the name.
+            assertNumberEquals("Pennsylvania");  // The geocode is shown as the number.
+        } finally {
+            localeTestUtils.restoreLocale();
+        }
+    }
+
     /** Asserts that the name text field contains the value of the given string resource. */
     private void assertNameEqualsResource(int resId) {
         assertNameEquals(getContext().getString(resId));
@@ -182,6 +198,11 @@
         assertEquals(text, mViews.nameView.getText().toString());
     }
 
+    /** Asserts that the number text field contains the given string value. */
+    private void assertNumberEquals(String text) {
+        assertEquals(text, mViews.numberView.getText().toString());
+    }
+
     /** Asserts that the date text field contains the given string value. */
     private void assertDateEquals(String text) {
         assertEquals(text, mViews.dateView.getText().toString());
@@ -210,16 +231,20 @@
 
     /** Sets the phone call details with default values and the given number. */
     private void setPhoneCallDetailsWithNumber(String number, String formattedNumber) {
+        PhoneNumber structuredPhoneNumber =
+                mPhoneNumberHelper.parsePhoneNumber(number, TEST_COUNTRY_ISO);
         mHelper.setPhoneCallDetails(mViews,
-                new PhoneCallDetails(number, formattedNumber, new int[]{ Calls.INCOMING_TYPE },
-                        TEST_DATE, TEST_DURATION),
+                new PhoneCallDetails(number, formattedNumber, structuredPhoneNumber,
+                        new int[]{ Calls.INCOMING_TYPE }, TEST_DATE, TEST_DURATION),
                 false, false);
     }
 
     /** Sets the phone call details with default values and the given date. */
     private void setPhoneCallDetailsWithDate(long date) {
+        PhoneNumber structuredPhoneNumber =
+                mPhoneNumberHelper.parsePhoneNumber(TEST_NUMBER, TEST_COUNTRY_ISO);
         mHelper.setPhoneCallDetails(mViews,
-                new PhoneCallDetails(TEST_NUMBER, TEST_FORMATTED_NUMBER,
+                new PhoneCallDetails(TEST_NUMBER, TEST_FORMATTED_NUMBER, structuredPhoneNumber,
                         new int[]{ Calls.INCOMING_TYPE }, date, TEST_DURATION),
                 false, false);
     }
@@ -235,9 +260,11 @@
     }
 
     private void setPhoneCallDetailsWithCallTypes(boolean useIcons, int... callTypes) {
+        PhoneNumber structuredPhoneNumber =
+                mPhoneNumberHelper.parsePhoneNumber(TEST_NUMBER, TEST_COUNTRY_ISO);
         mHelper.setPhoneCallDetails(mViews,
-                new PhoneCallDetails(TEST_NUMBER, TEST_FORMATTED_NUMBER, callTypes, TEST_DATE,
-                        TEST_DURATION),
+                new PhoneCallDetails(TEST_NUMBER, TEST_FORMATTED_NUMBER, structuredPhoneNumber,
+                        callTypes, TEST_DATE, TEST_DURATION),
                 useIcons, false);
     }
 }
diff --git a/tests/src/com/android/contacts/activities/CallLogActivityTests.java b/tests/src/com/android/contacts/activities/CallLogActivityTests.java
index e29540b..647db5d 100644
--- a/tests/src/com/android/contacts/activities/CallLogActivityTests.java
+++ b/tests/src/com/android/contacts/activities/CallLogActivityTests.java
@@ -197,7 +197,6 @@
 
         CallLogListItemViews views = (CallLogListItemViews) view.getTag();
         assertNameIs(views, TEST_FORMATTED_NUMBER);
-        assertNumberAndLabelAreGone(views);
     }
 
     @MediumTest
@@ -521,9 +520,4 @@
         }
         assertEquals(expectedText, views.phoneCallDetailsViews.numberView.getText().toString());
     }
-
-    /** Asserts that the number and label text view is gone. */
-    private void assertNumberAndLabelAreGone(CallLogListItemViews views) {
-        assertEquals(View.GONE, views.phoneCallDetailsViews.numberView.getVisibility());
-    }
 }
diff --git a/tests/src/com/android/contacts/calllog/CallLogListItemHelperTest.java b/tests/src/com/android/contacts/calllog/CallLogListItemHelperTest.java
index ae8906f..74a0b1b 100644
--- a/tests/src/com/android/contacts/calllog/CallLogListItemHelperTest.java
+++ b/tests/src/com/android/contacts/calllog/CallLogListItemHelperTest.java
@@ -21,6 +21,7 @@
 import com.android.contacts.PhoneCallDetailsViews;
 import com.android.contacts.R;
 import com.android.internal.telephony.CallerInfo;
+import com.google.i18n.phonenumbers.Phonenumber.PhoneNumber;
 
 import android.content.Context;
 import android.content.res.Resources;
@@ -49,24 +50,19 @@
     private static final long TEST_DURATION = 62300;
     /** A test voicemail number. */
     private static final String TEST_VOICEMAIL_NUMBER = "123";
-    /** A drawable to be used for incoming calls. */
-    private static final Drawable TEST_INCOMING_DRAWABLE = new ColorDrawable(Color.BLACK);
-    /** A drawable to be used for outgoing calls. */
-    private static final Drawable TEST_OUTGOING_DRAWABLE = new ColorDrawable(Color.BLUE);
-    /** A drawable to be used for missed calls. */
-    private static final Drawable TEST_MISSED_DRAWABLE = new ColorDrawable(Color.RED);
-    /** A drawable to be used for voicemails. */
-    private static final Drawable TEST_VOICEMAIL_DRAWABLE = new ColorDrawable(Color.RED);
     /** A drawable to be used for the call action. */
     private static final Drawable TEST_CALL_DRAWABLE = new ColorDrawable(Color.RED);
     /** A drawable to be used for the play action. */
     private static final Drawable TEST_PLAY_DRAWABLE = new ColorDrawable(Color.RED);
+    /** The country ISO name used in the tests. */
+    private static final String TEST_COUNTRY_ISO = "US";
 
     /** The object under test. */
     private CallLogListItemHelper mHelper;
 
     /** The views used in the tests. */
     private CallLogListItemViews mViews;
+    private PhoneNumberHelper mPhoneNumberHelper;
 
     @Override
     protected void setUp() throws Exception {
@@ -78,11 +74,10 @@
                 resources.getDrawable(R.drawable.ic_call_outgoing_holo_dark),
                 resources.getDrawable(R.drawable.ic_call_missed_holo_dark),
                 resources.getDrawable(R.drawable.ic_call_voicemail_holo_dark));
-        PhoneNumberHelper phoneNumberHelper =
-                new PhoneNumberHelper(resources, TEST_VOICEMAIL_NUMBER);
+        mPhoneNumberHelper = new PhoneNumberHelper(resources, TEST_VOICEMAIL_NUMBER);
         PhoneCallDetailsHelper phoneCallDetailsHelper = new PhoneCallDetailsHelper(context,
-                resources, callTypeHelper, phoneNumberHelper);
-        mHelper = new CallLogListItemHelper(phoneCallDetailsHelper, phoneNumberHelper,
+                resources, callTypeHelper, mPhoneNumberHelper);
+        mHelper = new CallLogListItemHelper(phoneCallDetailsHelper, mPhoneNumberHelper,
                 TEST_CALL_DRAWABLE, TEST_PLAY_DRAWABLE);
         mViews = CallLogListItemViews.createForTest(new QuickContactBadge(context),
                 new ImageView(context), PhoneCallDetailsViews.createForTest(new TextView(context),
@@ -133,17 +128,21 @@
 
     /** Sets the details of a phone call using the specified phone number. */
     private void setPhoneCallDetailsWithNumber(String number, String formattedNumber) {
+        PhoneNumber structuredPhoneNumber =
+                mPhoneNumberHelper.parsePhoneNumber(number, TEST_COUNTRY_ISO);
         mHelper.setPhoneCallDetails(mViews,
-                new PhoneCallDetails(number, formattedNumber, new int[]{ Calls.INCOMING_TYPE },
-                        TEST_DATE, TEST_DURATION),
+                new PhoneCallDetails(number, formattedNumber, structuredPhoneNumber,
+                        new int[]{ Calls.INCOMING_TYPE }, TEST_DATE, TEST_DURATION),
                 true, false);
     }
 
     /** Sets the details of a phone call using the specified call type. */
     private void setPhoneCallDetailsWithTypes(int... types) {
+        PhoneNumber structuredPhoneNumber =
+                mPhoneNumberHelper.parsePhoneNumber(TEST_NUMBER, TEST_COUNTRY_ISO);
         mHelper.setPhoneCallDetails(mViews,
-                new PhoneCallDetails(
-                        TEST_NUMBER, TEST_FORMATTED_NUMBER, types, TEST_DATE, TEST_DURATION),
+                new PhoneCallDetails(TEST_NUMBER, TEST_FORMATTED_NUMBER, structuredPhoneNumber,
+                        types, TEST_DATE, TEST_DURATION),
                 true, false);
     }
 }
