diff --git a/src/com/android/dialer/CallDetailActivity.java b/src/com/android/dialer/CallDetailActivity.java
index 284a578..2aff61c 100644
--- a/src/com/android/dialer/CallDetailActivity.java
+++ b/src/com/android/dialer/CallDetailActivity.java
@@ -24,7 +24,6 @@
 import android.os.Bundle;
 import android.provider.ContactsContract.CommonDataKinds.Phone;
 import android.support.v7.app.AppCompatActivity;
-import android.telecom.PhoneAccountHandle;
 import android.text.BidiFormatter;
 import android.text.TextDirectionHeuristics;
 import android.text.TextUtils;
@@ -45,6 +44,7 @@
 import com.android.contacts.common.ContactPhotoManager;
 import com.android.contacts.common.GeoUtil;
 import com.android.contacts.common.interactions.TouchPointManager;
+import com.android.contacts.common.preference.ContactsPreferences;
 import com.android.contacts.common.testing.NeededForTesting;
 import com.android.contacts.common.util.UriUtils;
 import com.android.dialer.calllog.CallDetailHistoryAdapter;
@@ -109,7 +109,6 @@
             mDetails = details[0];
             mNumber = TextUtils.isEmpty(mDetails.number) ? null : mDetails.number.toString();
             mDisplayNumber = mDetails.displayNumber;
-            final int numberPresentation = mDetails.numberPresentation;
 
             final CharSequence callLocationOrType = getNumberTypeOrLocation(mDetails);
 
@@ -117,8 +116,10 @@
             final String displayNumberStr = mBidiFormatter.unicodeWrap(
                     displayNumber.toString(), TextDirectionHeuristics.LTR);
 
-            if (!TextUtils.isEmpty(mDetails.name)) {
-                mCallerName.setText(mDetails.name);
+            mDetails.nameDisplayOrder = mContactsPreferences.getDisplayOrder();
+
+            if (!TextUtils.isEmpty(mDetails.getPreferredName())) {
+                mCallerName.setText(mDetails.getPreferredName());
                 mCallerNumber.setText(callLocationOrType + " " + displayNumberStr);
             } else {
                 mCallerName.setText(displayNumberStr);
@@ -174,7 +175,7 @@
          * @return The phone number type or location.
          */
         private CharSequence getNumberTypeOrLocation(PhoneCallDetails details) {
-            if (!TextUtils.isEmpty(details.name)) {
+            if (!TextUtils.isEmpty(details.namePrimary)) {
                 return Phone.getTypeLabel(mResources, details.numberType,
                         details.numberLabel);
             } else {
@@ -185,6 +186,7 @@
 
     private Context mContext;
     private ContactInfoHelper mContactInfoHelper;
+    private ContactsPreferences mContactsPreferences;
     private CallTypeHelper mCallTypeHelper;
     private ContactPhotoManager mContactPhotoManager;
     private FilteredNumberAsyncQueryHandler mFilteredNumberAsyncQueryHandler;
@@ -223,6 +225,7 @@
         mContext = this;
         mResources = getResources();
         mContactInfoHelper = new ContactInfoHelper(this, GeoUtil.getCurrentCountryIso(this));
+        mContactsPreferences = new ContactsPreferences(mContext);
         mCallTypeHelper = new CallTypeHelper(getResources());
         mFilteredNumberAsyncQueryHandler =
                 new FilteredNumberAsyncQueryHandler(getContentResolver());
@@ -280,6 +283,7 @@
     @Override
     public void onResume() {
         super.onResume();
+        mContactsPreferences.refreshValue(ContactsPreferences.DISPLAY_ORDER_KEY);
         getCallDetails();
     }
 
@@ -436,8 +440,8 @@
             contactType = ContactPhotoManager.TYPE_BUSINESS;
         }
 
-        final String displayName = TextUtils.isEmpty(mDetails.name)
-                ? mDetails.displayNumber : mDetails.name.toString();
+        final String displayName = TextUtils.isEmpty(mDetails.namePrimary)
+                ? mDetails.displayNumber : mDetails.namePrimary.toString();
         final String lookupKey = mDetails.contactUri == null
                 ? null : UriUtils.getLookupKeyFromUri(mDetails.contactUri);
 
diff --git a/src/com/android/dialer/PhoneCallDetails.java b/src/com/android/dialer/PhoneCallDetails.java
index 403c4e8..fb1827d 100644
--- a/src/com/android/dialer/PhoneCallDetails.java
+++ b/src/com/android/dialer/PhoneCallDetails.java
@@ -16,12 +16,14 @@
 
 package com.android.dialer;
 
+import com.android.contacts.common.preference.ContactsPreferences;
 import com.android.dialer.calllog.PhoneNumberDisplayUtil;
 
 import android.content.Context;
 import android.net.Uri;
 import android.provider.CallLog.Calls;
 import android.telecom.PhoneAccountHandle;
+import android.text.TextUtils;
 
 /**
  * The details of a phone call to be shown in the UI.
@@ -50,7 +52,14 @@
     // The duration of the call in milliseconds, or 0 for missed calls.
     public long duration;
     // The name of the contact, or the empty string.
-    public CharSequence name;
+    public CharSequence namePrimary;
+    // The alternative name of the contact, e.g. last name first, or the empty string
+    public CharSequence nameAlternative;
+    /**
+     * The user's preference on name display order, last name first or first time first.
+     * {@see ContactsPreferences}
+     */
+    public int nameDisplayOrder;
     // The type of phone, e.g., {@link Phone#TYPE_HOME}, 0 if not available.
     public int numberType;
     // The custom label associated with the phone number in the contact, or the empty string.
@@ -117,4 +126,18 @@
                 this.formattedNumber,
                 this.isVoicemail).toString();
     }
+
+    /**
+     * Returns the preferred name for the call details as specified by the
+     * {@link #nameDisplayOrder}
+     *
+     * @return the preferred name
+     */
+    public CharSequence getPreferredName() {
+        if (nameDisplayOrder == ContactsPreferences.DISPLAY_ORDER_PRIMARY
+                || TextUtils.isEmpty(nameAlternative)) {
+            return namePrimary;
+        }
+        return nameAlternative;
+    }
 }
diff --git a/src/com/android/dialer/calllog/CallLogAdapter.java b/src/com/android/dialer/calllog/CallLogAdapter.java
index ca07fba..b395723 100644
--- a/src/com/android/dialer/calllog/CallLogAdapter.java
+++ b/src/com/android/dialer/calllog/CallLogAdapter.java
@@ -466,10 +466,11 @@
             details.dataUsage = c.getLong(CallLogQuery.DATA_USAGE);
         }
 
-        String preferredName = getPreferredDisplayName(info);
-        if (!TextUtils.isEmpty(preferredName)) {
+        if (!TextUtils.isEmpty(info.name) || !TextUtils.isEmpty(info.nameAlternative)) {
             details.contactUri = info.lookupUri;
-            details.name = preferredName;
+            details.namePrimary = info.name;
+            details.nameAlternative = info.nameAlternative;
+            details.nameDisplayOrder = mContactsPreferences.getDisplayOrder();
             details.numberType = info.type;
             details.numberLabel = info.label;
             details.photoUri = info.photoUri;
diff --git a/src/com/android/dialer/calllog/CallLogAsyncTaskUtil.java b/src/com/android/dialer/calllog/CallLogAsyncTaskUtil.java
index 89932ff..2fffaff 100644
--- a/src/com/android/dialer/calllog/CallLogAsyncTaskUtil.java
+++ b/src/com/android/dialer/calllog/CallLogAsyncTaskUtil.java
@@ -189,7 +189,8 @@
 
             details.accountHandle = accountHandle;
             details.contactUri = info.lookupUri;
-            details.name = info.name;
+            details.namePrimary = info.name;
+            details.nameAlternative = info.nameAlternative;
             details.numberType = info.type;
             details.numberLabel = info.label;
             details.photoUri = info.photoUri;
diff --git a/src/com/android/dialer/calllog/CallLogListItemHelper.java b/src/com/android/dialer/calllog/CallLogListItemHelper.java
index 57a83e6..be0e146 100644
--- a/src/com/android/dialer/calllog/CallLogListItemHelper.java
+++ b/src/com/android/dialer/calllog/CallLogListItemHelper.java
@@ -260,8 +260,8 @@
      */
     private CharSequence getNameOrNumber(PhoneCallDetails details) {
         final CharSequence recipient;
-        if (!TextUtils.isEmpty(details.name)) {
-            recipient = details.name;
+        if (!TextUtils.isEmpty(details.getPreferredName())) {
+            recipient = details.getPreferredName();
         } else {
             recipient = details.displayNumber;
         }
diff --git a/src/com/android/dialer/calllog/PhoneCallDetailsHelper.java b/src/com/android/dialer/calllog/PhoneCallDetailsHelper.java
index b16079a..96dbf82 100644
--- a/src/com/android/dialer/calllog/PhoneCallDetailsHelper.java
+++ b/src/com/android/dialer/calllog/PhoneCallDetailsHelper.java
@@ -132,12 +132,12 @@
 
         final CharSequence nameText;
         final CharSequence displayNumber = details.displayNumber;
-        if (TextUtils.isEmpty(details.name)) {
+        if (TextUtils.isEmpty(details.getPreferredName())) {
             nameText = displayNumber;
             // We have a real phone number as "nameView" so make it always LTR
             views.nameView.setTextDirection(View.TEXT_DIRECTION_LTR);
         } else {
-            nameText = details.name;
+            nameText = details.getPreferredName();
         }
 
         views.nameView.setText(nameText);
@@ -200,7 +200,7 @@
                 && !PhoneNumberHelper.isUriNumber(details.number.toString())
                 && !mTelecomCallLogCache.isVoicemailNumber(details.accountHandle, details.number)) {
 
-            if (TextUtils.isEmpty(details.name) && !TextUtils.isEmpty(details.geocode)) {
+            if (TextUtils.isEmpty(details.namePrimary) && !TextUtils.isEmpty(details.geocode)) {
                 numberFormattedLabel = details.geocode;
             } else if (!(details.numberType == Phone.TYPE_CUSTOM
                     && TextUtils.isEmpty(details.numberLabel))) {
@@ -210,7 +210,7 @@
             }
         }
 
-        if (!TextUtils.isEmpty(details.name) && TextUtils.isEmpty(numberFormattedLabel)) {
+        if (!TextUtils.isEmpty(details.namePrimary) && TextUtils.isEmpty(numberFormattedLabel)) {
             numberFormattedLabel = details.displayNumber;
         }
         return numberFormattedLabel;
@@ -284,8 +284,8 @@
     @NeededForTesting
     public void setCallDetailsHeader(TextView nameView, PhoneCallDetails details) {
         final CharSequence nameText;
-        if (!TextUtils.isEmpty(details.name)) {
-            nameText = details.name;
+        if (!TextUtils.isEmpty(details.namePrimary)) {
+            nameText = details.namePrimary;
         } else if (!TextUtils.isEmpty(details.displayNumber)) {
             nameText = details.displayNumber;
         } else {
diff --git a/tests/src/com/android/dialer/calllog/CallLogAdapterTest.java b/tests/src/com/android/dialer/calllog/CallLogAdapterTest.java
index bdd5dc5..a5a61ad 100644
--- a/tests/src/com/android/dialer/calllog/CallLogAdapterTest.java
+++ b/tests/src/com/android/dialer/calllog/CallLogAdapterTest.java
@@ -24,17 +24,13 @@
 import android.provider.CallLog.Calls;
 import android.provider.ContactsContract.CommonDataKinds.Phone;
 import android.provider.VoicemailContract;
-import android.support.v7.widget.RecyclerView.ViewHolder;
-import android.telephony.PhoneNumberUtils;
 import android.test.AndroidTestCase;
-import android.test.suitebuilder.annotation.SmallTest;
 import android.test.suitebuilder.annotation.MediumTest;
-import android.test.suitebuilder.annotation.LargeTest;
 import android.text.TextUtils;
 import android.view.View;
 
+import com.android.contacts.common.preference.ContactsPreferences;
 import com.android.dialer.contactinfo.ContactInfoCache;
-import com.android.dialer.contactinfo.ContactInfoCache.OnContactInfoChangedListener;
 import com.android.dialer.util.AppCompatConstants;
 import com.android.dialer.util.TestConstants;
 import com.google.common.collect.Lists;
@@ -54,7 +50,10 @@
     private static final String EMPTY_STRING = "";
     private static final int NO_VALUE_SET = -1;
 
-    private static final String TEST_CACHED_NAME = "name";
+    private static final String TEST_CACHED_NAME_PRIMARY = "Cached Name";
+    private static final String TEST_CACHED_NAME_ALTERNATIVE = "Name Cached";
+    private static final String CONTACT_NAME_PRIMARY = "Contact Name";
+    private static final String CONTACT_NAME_ALTERNATIVE = "Name, Contact";
     private static final String TEST_CACHED_NUMBER_LABEL = "label";
     private static final int TEST_CACHED_NUMBER_TYPE = 1;
     private static final String TEST_COUNTRY_ISO = "US";
@@ -177,6 +176,63 @@
     }
 
     @MediumTest
+    public void testBindView_FirstNameFirstOrder() {
+        createCallLogEntry();
+
+        mAdapter.getContactInfoCache()
+                .mockGetValue(createContactInfo(CONTACT_NAME_PRIMARY, CONTACT_NAME_ALTERNATIVE));
+
+        setNameDisplayOrder(getContext(), ContactsPreferences.DISPLAY_ORDER_PRIMARY);
+
+        mAdapter.changeCursor(mCursor);
+        mAdapter.onBindViewHolder(mViewHolder, 0);
+        assertEquals(CONTACT_NAME_PRIMARY, mViewHolder.phoneCallDetailsViews.nameView.getText());
+    }
+
+    @MediumTest
+    public void testBindView_LastNameFirstOrder() {
+        createCallLogEntry();
+
+        mAdapter.getContactInfoCache()
+                .mockGetValue(createContactInfo(CONTACT_NAME_PRIMARY, CONTACT_NAME_ALTERNATIVE));
+
+        setNameDisplayOrder(getContext(), ContactsPreferences.DISPLAY_ORDER_ALTERNATIVE);
+
+        mAdapter.changeCursor(mCursor);
+        mAdapter.onBindViewHolder(mViewHolder, 0);
+        assertEquals(CONTACT_NAME_ALTERNATIVE,
+                mViewHolder.phoneCallDetailsViews.nameView.getText());
+    }
+
+    @MediumTest
+    public void testBindView_NameOrderCorrectOnChange() {
+        createCallLogEntry();
+
+        mAdapter.getContactInfoCache()
+                .mockGetValue(createContactInfo(CONTACT_NAME_PRIMARY, CONTACT_NAME_ALTERNATIVE));
+
+        Context context = getContext();
+        setNameDisplayOrder(context, ContactsPreferences.DISPLAY_ORDER_PRIMARY);
+
+        mAdapter.changeCursor(mCursor);
+        mAdapter.onBindViewHolder(mViewHolder, 0);
+        assertEquals(CONTACT_NAME_PRIMARY,
+                mViewHolder.phoneCallDetailsViews.nameView.getText());
+
+        setNameDisplayOrder(context, ContactsPreferences.DISPLAY_ORDER_ALTERNATIVE);
+        mAdapter.onResume();
+
+        mAdapter.onBindViewHolder(mViewHolder, 0);
+        assertEquals(CONTACT_NAME_ALTERNATIVE,
+                mViewHolder.phoneCallDetailsViews.nameView.getText());
+    }
+
+    private void setNameDisplayOrder(Context context, int displayOrder) {
+        context.getSharedPreferences(context.getPackageName(), Context.MODE_PRIVATE).edit().putInt(
+                ContactsPreferences.DISPLAY_ORDER_KEY, displayOrder).commit();
+    }
+
+    @MediumTest
     public void testBindView_VoicemailUri() {
         createVoicemailCallLogEntry();
 
@@ -278,7 +334,7 @@
         TestContactInfoCache.Request request = mAdapter.getContactInfoCache().requests.get(0);
 
         // The values passed to the request, match the ones in the call log cache.
-        assertEquals(TEST_CACHED_NAME, request.callLogInfo.name);
+        assertEquals(TEST_CACHED_NAME_PRIMARY, request.callLogInfo.name);
         assertEquals(TEST_CACHED_NUMBER_TYPE, request.callLogInfo.type);
         assertEquals(TEST_CACHED_NUMBER_LABEL, request.callLogInfo.label);
     }
@@ -487,7 +543,7 @@
         createCallLogEntryWithCachedValues(
                 TEST_NUMBER,
                 NO_VALUE_SET,
-                TEST_CACHED_NAME,
+                TEST_CACHED_NAME_PRIMARY,
                 TEST_CACHED_NUMBER_TYPE,
                 TEST_CACHED_NUMBER_LABEL,
                 EMPTY_STRING,
@@ -537,7 +593,7 @@
 
         if (inject) {
             ContactInfo contactInfo =
-                    createContactInfo(cachedName, cachedNumberType, cachedNumberLabel);
+                    createContactInfo(cachedName, cachedName, cachedNumberType, cachedNumberLabel);
             mAdapter.injectContactInfoForTest(number, TEST_COUNTRY_ISO, contactInfo);
         }
     }
@@ -578,16 +634,24 @@
 
     private ContactInfo createContactInfo() {
         return createContactInfo(
-                TEST_CACHED_NAME,
+                TEST_CACHED_NAME_PRIMARY,
+                TEST_CACHED_NAME_ALTERNATIVE);
+    }
+
+    private ContactInfo createContactInfo(String namePrimary, String nameAlternative) {
+        return createContactInfo(
+                namePrimary,
+                nameAlternative,
                 TEST_CACHED_NUMBER_TYPE,
                 TEST_CACHED_NUMBER_LABEL);
     }
 
     /** Returns a contact info with default values. */
-    private ContactInfo createContactInfo(String name, int type, String label) {
+    private ContactInfo createContactInfo(String namePrimary, String nameAlternative, int type, String label) {
         ContactInfo info = new ContactInfo();
         info.number = TEST_NUMBER;
-        info.name = name;
+        info.name = namePrimary;
+        info.nameAlternative = nameAlternative;
         info.type = type;
         info.label = label;
         info.formattedNumber = TEST_FORMATTED_NUMBER;
@@ -663,11 +727,35 @@
 
         public final List<Request> requests = Lists.newArrayList();
 
+        /**
+         * Dummy contactInfo to return in the even that the getValue method has been mocked
+         */
+        private ContactInfo mContactInfo;
+
         public TestContactInfoCache(
                 ContactInfoHelper contactInfoHelper, OnContactInfoChangedListener listener) {
             super(contactInfoHelper, listener);
         }
 
+        /**
+         * Sets the given value to be returned by all calls to
+         * {@link #getValue(String, String, ContactInfo)}
+         *
+         * @param contactInfo the contactInfo
+         */
+        public void mockGetValue(ContactInfo contactInfo) {
+            this.mContactInfo = contactInfo;
+        }
+
+        @Override
+        public ContactInfo getValue(String number, String countryIso,
+                ContactInfo cachedContactInfo) {
+            if (mContactInfo != null) {
+                return mContactInfo;
+            }
+            return super.getValue(number, countryIso, cachedContactInfo);
+        }
+
         @Override
         protected void enqueueRequest(String number, String countryIso, ContactInfo callLogInfo,
                 boolean immediate) {
diff --git a/tests/src/com/android/dialer/calllog/ContactInfoHelperTest.java b/tests/src/com/android/dialer/calllog/ContactInfoHelperTest.java
index 6d3e860..6db7384 100644
--- a/tests/src/com/android/dialer/calllog/ContactInfoHelperTest.java
+++ b/tests/src/com/android/dialer/calllog/ContactInfoHelperTest.java
@@ -33,7 +33,7 @@
     private static final String TEST_COUNTRY_ISO = "US";
     private static final String TEST_DISPLAY_NAME = "Display Name";
     private static final String TEST_DISPLAY_NAME_ALTERNATIVE = "Name, Display";
-    private static final String[] TEST_DISPLAY_NAME_ALTERNATIVE_ROW = new String[]{null,
+    private static final String[] TEST_DISPLAY_NAME_ALTERNATIVE_ROW = new String[]{
             TEST_DISPLAY_NAME_ALTERNATIVE};
     private static final String TEST_LOOKUP_KEY = "lookupKey";
     private static final String[] TEST_LOOKUP_ROW = new String[]{null, TEST_DISPLAY_NAME,
diff --git a/tests/src/com/android/dialer/calllog/PhoneCallDetailsHelperTest.java b/tests/src/com/android/dialer/calllog/PhoneCallDetailsHelperTest.java
index ecbb898..c30861c 100644
--- a/tests/src/com/android/dialer/calllog/PhoneCallDetailsHelperTest.java
+++ b/tests/src/com/android/dialer/calllog/PhoneCallDetailsHelperTest.java
@@ -319,7 +319,7 @@
     public void testGetCallTypeOrLocation_DisplayNumber() {
         PhoneCallDetails details = getPhoneCallDetails("", Calls.PRESENTATION_ALLOWED,
                 TEST_FORMATTED_NUMBER);
-        details.name = "name";
+        details.namePrimary = "name";
         assertEquals(TEST_FORMATTED_NUMBER, mHelper.getCallTypeOrLocation(details));
     }
 
@@ -418,7 +418,7 @@
 
     private void setCallDetailsHeader(String name) {
         PhoneCallDetails details = getPhoneCallDetails();
-        details.name = name;
+        details.namePrimary = name;
         mHelper.setCallDetailsHeader(mNameView, details);
     }
 
