diff --git a/java/com/android/contacts/common/list/ContactEntry.java b/java/com/android/contacts/common/list/ContactEntry.java
index e33165e..90e6735 100644
--- a/java/com/android/contacts/common/list/ContactEntry.java
+++ b/java/com/android/contacts/common/list/ContactEntry.java
@@ -16,25 +16,19 @@
 
 package com.android.contacts.common.list;
 
+import android.content.Context;
 import android.net.Uri;
 import android.provider.ContactsContract.PinnedPositions;
-import android.text.TextUtils;
-import com.android.contacts.common.preference.ContactsPreferences;
+import com.android.dialer.contacts.ContactsComponent;
 
 /** Class to hold contact information */
 public class ContactEntry {
 
   public static final ContactEntry BLANK_ENTRY = new ContactEntry();
-  private static final int UNSET_DISPLAY_ORDER_PREFERENCE = -1;
   /** Primary name for a Contact */
   public String namePrimary;
   /** Alternative name for a Contact, e.g. last name first */
   public String nameAlternative;
-  /**
-   * The user's preference on name display order, last name first or first time first. {@see
-   * ContactsPreferences}
-   */
-  public int nameDisplayOrder = UNSET_DISPLAY_ORDER_PREFERENCE;
 
   public String phoneLabel;
   public String phoneNumber;
@@ -46,12 +40,9 @@
   public boolean isFavorite = false;
   public boolean isDefaultNumber = false;
 
-  public String getPreferredDisplayName() {
-    if (nameDisplayOrder == UNSET_DISPLAY_ORDER_PREFERENCE
-        || nameDisplayOrder == ContactsPreferences.DISPLAY_ORDER_PRIMARY
-        || TextUtils.isEmpty(nameAlternative)) {
-      return namePrimary;
-    }
-    return nameAlternative;
+  public String getPreferredDisplayName(Context context) {
+    return ContactsComponent.get(context)
+        .contactDisplayPreferences()
+        .getDisplayName(namePrimary, nameAlternative);
   }
 }
diff --git a/java/com/android/contacts/common/preference/ContactsPreferences.java b/java/com/android/contacts/common/preference/ContactsPreferences.java
deleted file mode 100644
index d0adb04..0000000
--- a/java/com/android/contacts/common/preference/ContactsPreferences.java
+++ /dev/null
@@ -1,273 +0,0 @@
-/*
- * Copyright (C) 2010 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.contacts.common.preference;
-
-import android.content.Context;
-import android.content.SharedPreferences;
-import android.content.SharedPreferences.Editor;
-import android.content.SharedPreferences.OnSharedPreferenceChangeListener;
-import android.os.Handler;
-import android.preference.PreferenceManager;
-import android.provider.Settings;
-import android.provider.Settings.SettingNotFoundException;
-import android.text.TextUtils;
-import com.android.contacts.common.R;
-import com.android.contacts.common.model.account.AccountWithDataSet;
-import com.android.dialer.strictmode.StrictModeUtils;
-
-/** Manages user preferences for contacts. */
-public class ContactsPreferences implements OnSharedPreferenceChangeListener {
-
-  /** The value for the DISPLAY_ORDER key to show the given name first. */
-  public static final int DISPLAY_ORDER_PRIMARY = 1;
-
-  /** The value for the DISPLAY_ORDER key to show the family name first. */
-  public static final int DISPLAY_ORDER_ALTERNATIVE = 2;
-
-  public static final String DISPLAY_ORDER_KEY = "android.contacts.DISPLAY_ORDER";
-
-  /** The value for the SORT_ORDER key corresponding to sort by given name first. */
-  public static final int SORT_ORDER_PRIMARY = 1;
-
-  public static final String SORT_ORDER_KEY = "android.contacts.SORT_ORDER";
-
-  /** The value for the SORT_ORDER key corresponding to sort by family name first. */
-  public static final int SORT_ORDER_ALTERNATIVE = 2;
-
-  public static final String PREF_DISPLAY_ONLY_PHONES = "only_phones";
-
-  public static final boolean PREF_DISPLAY_ONLY_PHONES_DEFAULT = false;
-
-  /**
-   * Value to use when a preference is unassigned and needs to be read from the shared preferences
-   */
-  private static final int PREFERENCE_UNASSIGNED = -1;
-
-  private final Context mContext;
-  private final SharedPreferences mPreferences;
-  private int mSortOrder = PREFERENCE_UNASSIGNED;
-  private int mDisplayOrder = PREFERENCE_UNASSIGNED;
-  private String mDefaultAccount = null;
-  private ChangeListener mListener = null;
-  private Handler mHandler;
-  private String mDefaultAccountKey;
-  private String mDefaultAccountSavedKey;
-
-  public ContactsPreferences(Context context) {
-    mContext = context;
-    mHandler = new Handler();
-    mPreferences =
-        mContext
-            .getApplicationContext()
-            .getSharedPreferences(context.getPackageName(), Context.MODE_PRIVATE);
-    mDefaultAccountKey =
-        mContext.getResources().getString(R.string.contact_editor_default_account_key);
-    mDefaultAccountSavedKey =
-        mContext.getResources().getString(R.string.contact_editor_anything_saved_key);
-    maybeMigrateSystemSettings();
-  }
-
-  private boolean isSortOrderUserChangeable() {
-    return mContext.getResources().getBoolean(R.bool.config_sort_order_user_changeable);
-  }
-
-  private int getDefaultSortOrder() {
-    if (mContext.getResources().getBoolean(R.bool.config_default_sort_order_primary)) {
-      return SORT_ORDER_PRIMARY;
-    } else {
-      return SORT_ORDER_ALTERNATIVE;
-    }
-  }
-
-  public int getSortOrder() {
-    if (!isSortOrderUserChangeable()) {
-      return getDefaultSortOrder();
-    }
-    if (mSortOrder == PREFERENCE_UNASSIGNED) {
-      mSortOrder = mPreferences.getInt(SORT_ORDER_KEY, getDefaultSortOrder());
-    }
-    return mSortOrder;
-  }
-
-  public void setSortOrder(int sortOrder) {
-    mSortOrder = sortOrder;
-    final Editor editor = mPreferences.edit();
-    editor.putInt(SORT_ORDER_KEY, sortOrder);
-    StrictModeUtils.bypass(editor::commit);
-  }
-
-  private boolean isDisplayOrderUserChangeable() {
-    return mContext.getResources().getBoolean(R.bool.config_display_order_user_changeable);
-  }
-
-  private int getDefaultDisplayOrder() {
-    if (mContext.getResources().getBoolean(R.bool.config_default_display_order_primary)) {
-      return DISPLAY_ORDER_PRIMARY;
-    } else {
-      return DISPLAY_ORDER_ALTERNATIVE;
-    }
-  }
-
-  public int getDisplayOrder() {
-    if (!isDisplayOrderUserChangeable()) {
-      return getDefaultDisplayOrder();
-    }
-    if (mDisplayOrder == PREFERENCE_UNASSIGNED) {
-      mDisplayOrder = mPreferences.getInt(DISPLAY_ORDER_KEY, getDefaultDisplayOrder());
-    }
-    return mDisplayOrder;
-  }
-
-  public void setDisplayOrder(int displayOrder) {
-    mDisplayOrder = displayOrder;
-    final Editor editor = mPreferences.edit();
-    editor.putInt(DISPLAY_ORDER_KEY, displayOrder);
-    StrictModeUtils.bypass(editor::commit);
-  }
-
-  private boolean isDefaultAccountUserChangeable() {
-    return mContext.getResources().getBoolean(R.bool.config_default_account_user_changeable);
-  }
-
-  private String getDefaultAccount() {
-    if (!isDefaultAccountUserChangeable()) {
-      return mDefaultAccount;
-    }
-    if (TextUtils.isEmpty(mDefaultAccount)) {
-      final String accountString = mPreferences.getString(mDefaultAccountKey, mDefaultAccount);
-      if (!TextUtils.isEmpty(accountString)) {
-        final AccountWithDataSet accountWithDataSet = AccountWithDataSet.unstringify(accountString);
-        mDefaultAccount = accountWithDataSet.name;
-      }
-    }
-    return mDefaultAccount;
-  }
-
-  private void setDefaultAccount(AccountWithDataSet accountWithDataSet) {
-    mDefaultAccount = accountWithDataSet == null ? null : accountWithDataSet.name;
-    final Editor editor = mPreferences.edit();
-    if (TextUtils.isEmpty(mDefaultAccount)) {
-      editor.remove(mDefaultAccountKey);
-    } else {
-      editor.putString(mDefaultAccountKey, accountWithDataSet.stringify());
-    }
-    editor.putBoolean(mDefaultAccountSavedKey, true);
-    StrictModeUtils.bypass(editor::commit);
-  }
-
-  public void registerChangeListener(ChangeListener listener) {
-    if (mListener != null) {
-      unregisterChangeListener();
-    }
-
-    mListener = listener;
-
-    // Reset preferences to "unknown" because they may have changed while the
-    // listener was unregistered.
-    mDisplayOrder = PREFERENCE_UNASSIGNED;
-    mSortOrder = PREFERENCE_UNASSIGNED;
-    mDefaultAccount = null;
-
-    mPreferences.registerOnSharedPreferenceChangeListener(this);
-  }
-
-  public void unregisterChangeListener() {
-    if (mListener != null) {
-      mListener = null;
-    }
-
-    mPreferences.unregisterOnSharedPreferenceChangeListener(this);
-  }
-
-  @Override
-  public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, final String key) {
-    // This notification is not sent on the Ui thread. Use the previously created Handler
-    // to switch to the Ui thread
-    mHandler.post(
-        new Runnable() {
-          @Override
-          public void run() {
-            refreshValue(key);
-          }
-        });
-  }
-
-  /**
-   * Forces the value for the given key to be looked up from shared preferences and notifies the
-   * registered {@link ChangeListener}
-   *
-   * @param key the {@link SharedPreferences} key to look up
-   */
-  public void refreshValue(String key) {
-    if (DISPLAY_ORDER_KEY.equals(key)) {
-      mDisplayOrder = PREFERENCE_UNASSIGNED;
-      mDisplayOrder = getDisplayOrder();
-    } else if (SORT_ORDER_KEY.equals(key)) {
-      mSortOrder = PREFERENCE_UNASSIGNED;
-      mSortOrder = getSortOrder();
-    } else if (mDefaultAccountKey.equals(key)) {
-      mDefaultAccount = null;
-      mDefaultAccount = getDefaultAccount();
-    }
-    if (mListener != null) {
-      mListener.onChange();
-    }
-  }
-
-  /**
-   * If there are currently no preferences (which means this is the first time we are run), For sort
-   * order and display order, check to see if there are any preferences stored in system settings
-   * (pre-L) which can be copied into our own SharedPreferences. For default account setting, check
-   * to see if there are any preferences stored in the previous SharedPreferences which can be
-   * copied into current SharedPreferences.
-   */
-  private void maybeMigrateSystemSettings() {
-    if (!mPreferences.contains(SORT_ORDER_KEY)) {
-      int sortOrder = getDefaultSortOrder();
-      try {
-        sortOrder = Settings.System.getInt(mContext.getContentResolver(), SORT_ORDER_KEY);
-      } catch (SettingNotFoundException e) {
-      }
-      setSortOrder(sortOrder);
-    }
-
-    if (!mPreferences.contains(DISPLAY_ORDER_KEY)) {
-      int displayOrder = getDefaultDisplayOrder();
-      try {
-        displayOrder = Settings.System.getInt(mContext.getContentResolver(), DISPLAY_ORDER_KEY);
-      } catch (SettingNotFoundException e) {
-      }
-      setDisplayOrder(displayOrder);
-    }
-
-    if (!mPreferences.contains(mDefaultAccountKey)) {
-      final SharedPreferences previousPrefs =
-          PreferenceManager.getDefaultSharedPreferences(mContext.getApplicationContext());
-      final String defaultAccount = previousPrefs.getString(mDefaultAccountKey, null);
-      if (!TextUtils.isEmpty(defaultAccount)) {
-        final AccountWithDataSet accountWithDataSet =
-            AccountWithDataSet.unstringify(defaultAccount);
-        setDefaultAccount(accountWithDataSet);
-      }
-    }
-  }
-
-  public interface ChangeListener {
-
-    void onChange();
-  }
-}
diff --git a/java/com/android/contacts/common/preference/DisplayOrderPreference.java b/java/com/android/contacts/common/preference/DisplayOrderPreference.java
deleted file mode 100644
index 8dda57f..0000000
--- a/java/com/android/contacts/common/preference/DisplayOrderPreference.java
+++ /dev/null
@@ -1,89 +0,0 @@
-/*
- * Copyright (C) 2010 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.contacts.common.preference;
-
-import android.app.AlertDialog.Builder;
-import android.content.Context;
-import android.preference.ListPreference;
-import android.util.AttributeSet;
-import com.android.contacts.common.R;
-
-/** Custom preference: view-name-as (first name first or last name first). */
-public final class DisplayOrderPreference extends ListPreference {
-
-  private ContactsPreferences mPreferences;
-  private Context mContext;
-
-  public DisplayOrderPreference(Context context) {
-    super(context);
-    prepare();
-  }
-
-  public DisplayOrderPreference(Context context, AttributeSet attrs) {
-    super(context, attrs);
-    prepare();
-  }
-
-  private void prepare() {
-    mContext = getContext();
-    mPreferences = new ContactsPreferences(mContext);
-    setEntries(
-        new String[] {
-          mContext.getString(R.string.display_options_view_given_name_first),
-          mContext.getString(R.string.display_options_view_family_name_first),
-        });
-    setEntryValues(
-        new String[] {
-          String.valueOf(ContactsPreferences.DISPLAY_ORDER_PRIMARY),
-          String.valueOf(ContactsPreferences.DISPLAY_ORDER_ALTERNATIVE),
-        });
-    setValue(String.valueOf(mPreferences.getDisplayOrder()));
-  }
-
-  @Override
-  protected boolean shouldPersist() {
-    return false; // This preference takes care of its own storage
-  }
-
-  @Override
-  public CharSequence getSummary() {
-    switch (mPreferences.getDisplayOrder()) {
-      case ContactsPreferences.DISPLAY_ORDER_PRIMARY:
-        return mContext.getString(R.string.display_options_view_given_name_first);
-      case ContactsPreferences.DISPLAY_ORDER_ALTERNATIVE:
-        return mContext.getString(R.string.display_options_view_family_name_first);
-    }
-    return null;
-  }
-
-  @Override
-  protected boolean persistString(String value) {
-    int newValue = Integer.parseInt(value);
-    if (newValue != mPreferences.getDisplayOrder()) {
-      mPreferences.setDisplayOrder(newValue);
-      notifyChanged();
-    }
-    return true;
-  }
-
-  @Override
-  // UX recommendation is not to show cancel button on such lists.
-  protected void onPrepareDialogBuilder(Builder builder) {
-    super.onPrepareDialogBuilder(builder);
-    builder.setNegativeButton(null, null);
-  }
-}
diff --git a/java/com/android/contacts/common/preference/SortOrderPreference.java b/java/com/android/contacts/common/preference/SortOrderPreference.java
deleted file mode 100644
index 9b6f578..0000000
--- a/java/com/android/contacts/common/preference/SortOrderPreference.java
+++ /dev/null
@@ -1,89 +0,0 @@
-/*
- * Copyright (C) 2010 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.contacts.common.preference;
-
-import android.app.AlertDialog.Builder;
-import android.content.Context;
-import android.preference.ListPreference;
-import android.util.AttributeSet;
-import com.android.contacts.common.R;
-
-/** Custom preference: sort-by. */
-public final class SortOrderPreference extends ListPreference {
-
-  private ContactsPreferences mPreferences;
-  private Context mContext;
-
-  public SortOrderPreference(Context context) {
-    super(context);
-    prepare();
-  }
-
-  public SortOrderPreference(Context context, AttributeSet attrs) {
-    super(context, attrs);
-    prepare();
-  }
-
-  private void prepare() {
-    mContext = getContext();
-    mPreferences = new ContactsPreferences(mContext);
-    setEntries(
-        new String[] {
-          mContext.getString(R.string.display_options_sort_by_given_name),
-          mContext.getString(R.string.display_options_sort_by_family_name),
-        });
-    setEntryValues(
-        new String[] {
-          String.valueOf(ContactsPreferences.SORT_ORDER_PRIMARY),
-          String.valueOf(ContactsPreferences.SORT_ORDER_ALTERNATIVE),
-        });
-    setValue(String.valueOf(mPreferences.getSortOrder()));
-  }
-
-  @Override
-  protected boolean shouldPersist() {
-    return false; // This preference takes care of its own storage
-  }
-
-  @Override
-  public CharSequence getSummary() {
-    switch (mPreferences.getSortOrder()) {
-      case ContactsPreferences.SORT_ORDER_PRIMARY:
-        return mContext.getString(R.string.display_options_sort_by_given_name);
-      case ContactsPreferences.SORT_ORDER_ALTERNATIVE:
-        return mContext.getString(R.string.display_options_sort_by_family_name);
-    }
-    return null;
-  }
-
-  @Override
-  protected boolean persistString(String value) {
-    int newValue = Integer.parseInt(value);
-    if (newValue != mPreferences.getSortOrder()) {
-      mPreferences.setSortOrder(newValue);
-      notifyChanged();
-    }
-    return true;
-  }
-
-  @Override
-  // UX recommendation is not to show cancel button on such lists.
-  protected void onPrepareDialogBuilder(Builder builder) {
-    super.onPrepareDialogBuilder(builder);
-    builder.setNegativeButton(null, null);
-  }
-}
diff --git a/java/com/android/contacts/common/res/values/strings.xml b/java/com/android/contacts/common/res/values/strings.xml
index cf24a88..2011282 100644
--- a/java/com/android/contacts/common/res/values/strings.xml
+++ b/java/com/android/contacts/common/res/values/strings.xml
@@ -332,26 +332,6 @@
   <!-- Displayed at the top of the contacts showing single contact. [CHAR LIMIT=64] -->
   <string name="listSingleContact">Single contact</string>
 
-  <!-- Contact preferences related strings -->
-
-  <!-- Label of the "sort by" display option -->
-  <string name="display_options_sort_list_by">Sort by</string>
-
-  <!-- An allowable value for the "sort list by" contact display option  -->
-  <string name="display_options_sort_by_given_name">First name</string>
-
-  <!-- An allowable value for the "sort list by" contact display option  -->
-  <string name="display_options_sort_by_family_name">Last name</string>
-
-  <!-- Label of the "name format" display option [CHAR LIMIT=64]-->
-  <string name="display_options_view_names_as">Name format</string>
-
-  <!-- An allowable value for the "view names as" contact display option  -->
-  <string name="display_options_view_given_name_first">First name first</string>
-
-  <!-- An allowable value for the "view names as" contact display option  -->
-  <string name="display_options_view_family_name_first">Last name first</string>
-
   <!--  The menu item to clear frequents [CHAR LIMIT=30] -->
   <string name="menu_clear_frequents">Clear frequents</string>
 
diff --git a/java/com/android/contacts/common/util/ContactDisplayUtils.java b/java/com/android/contacts/common/util/ContactDisplayUtils.java
index 7d428e1..967395a 100644
--- a/java/com/android/contacts/common/util/ContactDisplayUtils.java
+++ b/java/com/android/contacts/common/util/ContactDisplayUtils.java
@@ -28,7 +28,6 @@
 import android.text.style.TtsSpan;
 import android.util.Patterns;
 import com.android.contacts.common.R;
-import com.android.contacts.common.preference.ContactsPreferences;
 import com.android.dialer.common.LogUtil;
 import java.util.Objects;
 
@@ -244,62 +243,4 @@
     String msg = resources.getString(stringId, number);
     return ContactDisplayUtils.getTelephoneTtsSpannable(msg, number);
   }
-
-  /**
-   * Returns either namePrimary or nameAlternative based on the {@link ContactsPreferences}.
-   * Defaults to the name that is non-null.
-   *
-   * @param namePrimary the primary name.
-   * @param nameAlternative the alternative name.
-   * @param contactsPreferences the ContactsPreferences used to determine the preferred display
-   *     name.
-   * @return namePrimary or nameAlternative depending on the value of displayOrderPreference.
-   */
-  public static String getPreferredDisplayName(
-      String namePrimary,
-      String nameAlternative,
-      @Nullable ContactsPreferences contactsPreferences) {
-    if (contactsPreferences == null) {
-      return namePrimary != null ? namePrimary : nameAlternative;
-    }
-    if (contactsPreferences.getDisplayOrder() == ContactsPreferences.DISPLAY_ORDER_PRIMARY) {
-      return namePrimary;
-    }
-
-    if (contactsPreferences.getDisplayOrder() == ContactsPreferences.DISPLAY_ORDER_ALTERNATIVE
-        && !TextUtils.isEmpty(nameAlternative)) {
-      return nameAlternative;
-    }
-
-    return namePrimary;
-  }
-
-  /**
-   * Returns either namePrimary or nameAlternative based on the {@link ContactsPreferences}.
-   * Defaults to the name that is non-null.
-   *
-   * @param namePrimary the primary name.
-   * @param nameAlternative the alternative name.
-   * @param contactsPreferences the ContactsPreferences used to determine the preferred sort order.
-   * @return namePrimary or nameAlternative depending on the value of displayOrderPreference.
-   */
-  public static String getPreferredSortName(
-      String namePrimary,
-      String nameAlternative,
-      @Nullable ContactsPreferences contactsPreferences) {
-    if (contactsPreferences == null) {
-      return namePrimary != null ? namePrimary : nameAlternative;
-    }
-
-    if (contactsPreferences.getSortOrder() == ContactsPreferences.SORT_ORDER_PRIMARY) {
-      return namePrimary;
-    }
-
-    if (contactsPreferences.getSortOrder() == ContactsPreferences.SORT_ORDER_ALTERNATIVE
-        && !TextUtils.isEmpty(nameAlternative)) {
-      return nameAlternative;
-    }
-
-    return namePrimary;
-  }
 }
diff --git a/java/com/android/dialer/app/calllog/CallLogAdapter.java b/java/com/android/dialer/app/calllog/CallLogAdapter.java
index d3fd365..f5474ee 100644
--- a/java/com/android/dialer/app/calllog/CallLogAdapter.java
+++ b/java/com/android/dialer/app/calllog/CallLogAdapter.java
@@ -53,7 +53,6 @@
 import android.view.View;
 import android.view.ViewGroup;
 import com.android.contacts.common.ContactsUtils;
-import com.android.contacts.common.preference.ContactsPreferences;
 import com.android.dialer.app.R;
 import com.android.dialer.app.calllog.CallLogFragment.CallLogFragmentListener;
 import com.android.dialer.app.calllog.CallLogGroupBuilder.GroupCreator;
@@ -73,6 +72,7 @@
 import com.android.dialer.common.concurrent.AsyncTaskExecutors;
 import com.android.dialer.compat.android.provider.VoicemailCompat;
 import com.android.dialer.configprovider.ConfigProviderComponent;
+import com.android.dialer.contacts.ContactsComponent;
 import com.android.dialer.duo.Duo;
 import com.android.dialer.duo.DuoComponent;
 import com.android.dialer.duo.DuoListener;
@@ -506,7 +506,6 @@
   private final Map<Long, Integer> dayGroups = new ArrayMap<>();
 
   private boolean loading = true;
-  private ContactsPreferences contactsPreferences;
 
   private boolean isSpamEnabled;
 
@@ -551,8 +550,6 @@
     callLogGroupBuilder = new CallLogGroupBuilder(activity.getApplicationContext(), this);
     this.filteredNumberAsyncQueryHandler = Assert.isNotNull(filteredNumberAsyncQueryHandler);
 
-    contactsPreferences = new ContactsPreferences(this.activity);
-
     blockReportSpamListener =
         new BlockReportSpamListener(
             this.activity,
@@ -674,7 +671,6 @@
     if (PermissionsUtil.hasPermission(activity, android.Manifest.permission.READ_CONTACTS)) {
       contactInfoCache.start();
     }
-    contactsPreferences.refreshValue(ContactsPreferences.DISPLAY_ORDER_KEY);
     isSpamEnabled = SpamComponent.get(activity).spamSettings().isSpamEnabled();
     getDuo().registerListener(this);
     notifyDataSetChanged();
@@ -1078,7 +1074,8 @@
       details.contactUri = info.lookupUri;
       details.namePrimary = info.name;
       details.nameAlternative = info.nameAlternative;
-      details.nameDisplayOrder = contactsPreferences.getDisplayOrder();
+      details.nameDisplayOrder =
+          ContactsComponent.get(activity).contactDisplayPreferences().getDisplayOrder();
       details.numberType = info.type;
       details.numberLabel = info.label;
       details.photoUri = info.photoUri;
diff --git a/java/com/android/dialer/app/list/OldSpeedDialFragment.java b/java/com/android/dialer/app/list/OldSpeedDialFragment.java
index 9b83d54..9922ee2 100644
--- a/java/com/android/dialer/app/list/OldSpeedDialFragment.java
+++ b/java/com/android/dialer/app/list/OldSpeedDialFragment.java
@@ -113,9 +113,6 @@
   public void onResume() {
     Trace.beginSection(TAG + " onResume");
     super.onResume();
-    if (contactTileAdapter != null) {
-      contactTileAdapter.refreshContactsPreferences();
-    }
     if (PermissionsUtil.hasContactsReadPermissions(getContext())) {
       if (getLoaderManager().getLoader(LOADER_ID_CONTACT_TILE) == null) {
         getLoaderManager().initLoader(LOADER_ID_CONTACT_TILE, null, contactTileLoaderListener);
diff --git a/java/com/android/dialer/app/list/PhoneFavoriteSquareTileView.java b/java/com/android/dialer/app/list/PhoneFavoriteSquareTileView.java
index 6b41547..8fe67f4 100644
--- a/java/com/android/dialer/app/list/PhoneFavoriteSquareTileView.java
+++ b/java/com/android/dialer/app/list/PhoneFavoriteSquareTileView.java
@@ -104,7 +104,7 @@
 
   @Override
   protected String getNameForView(ContactEntry contactEntry) {
-    return contactEntry.getPreferredDisplayName();
+    return contactEntry.getPreferredDisplayName(getContext());
   }
 
   public ContactEntry getContactEntry() {
diff --git a/java/com/android/dialer/app/list/PhoneFavoritesTileAdapter.java b/java/com/android/dialer/app/list/PhoneFavoritesTileAdapter.java
index a201859..4cc48a6 100644
--- a/java/com/android/dialer/app/list/PhoneFavoritesTileAdapter.java
+++ b/java/com/android/dialer/app/list/PhoneFavoritesTileAdapter.java
@@ -37,10 +37,10 @@
 import com.android.contacts.common.ContactTileLoaderFactory;
 import com.android.contacts.common.list.ContactEntry;
 import com.android.contacts.common.list.ContactTileView;
-import com.android.contacts.common.preference.ContactsPreferences;
 import com.android.dialer.app.R;
 import com.android.dialer.common.LogUtil;
 import com.android.dialer.contactphoto.ContactPhotoManager;
+import com.android.dialer.contacts.ContactsComponent;
 import com.android.dialer.duo.Duo;
 import com.android.dialer.duo.DuoComponent;
 import com.android.dialer.logging.InteractionEvent;
@@ -78,11 +78,11 @@
   private OnDataSetChangedForAnimationListener dataSetChangedListener;
   private Context context;
   private Resources resources;
-  private ContactsPreferences contactsPreferences;
   private final Comparator<ContactEntry> contactEntryComparator =
       new Comparator<ContactEntry>() {
         @Override
         public int compare(ContactEntry lhs, ContactEntry rhs) {
+
           return ComparisonChain.start()
               .compare(lhs.pinned, rhs.pinned)
               .compare(getPreferredSortName(lhs), getPreferredSortName(rhs))
@@ -90,11 +90,9 @@
         }
 
         private String getPreferredSortName(ContactEntry contactEntry) {
-          if (contactsPreferences.getSortOrder() == ContactsPreferences.SORT_ORDER_PRIMARY
-              || TextUtils.isEmpty(contactEntry.nameAlternative)) {
-            return contactEntry.namePrimary;
-          }
-          return contactEntry.nameAlternative;
+          return ContactsComponent.get(context)
+              .contactDisplayPreferences()
+              .getSortName(contactEntry.namePrimary, contactEntry.nameAlternative);
         }
       };
   /** Back up of the temporarily removed Contact during dragging. */
@@ -121,7 +119,6 @@
     this.listener = listener;
     this.context = context;
     resources = context.getResources();
-    contactsPreferences = new ContactsPreferences(this.context);
     numFrequents = 0;
     contactEntries = new ArrayList<>();
   }
@@ -140,11 +137,6 @@
     this.inDragging = inDragging;
   }
 
-  void refreshContactsPreferences() {
-    contactsPreferences.refreshValue(ContactsPreferences.DISPLAY_ORDER_KEY);
-    contactsPreferences.refreshValue(ContactsPreferences.SORT_ORDER_KEY);
-  }
-
   /**
    * Gets the number of frequents from the passed in cursor.
    *
@@ -256,7 +248,6 @@
             (!TextUtils.isEmpty(nameAlternative))
                 ? nameAlternative
                 : resources.getString(R.string.missing_name);
-        contact.nameDisplayOrder = contactsPreferences.getDisplayOrder();
         contact.photoUri = (photoUri != null ? Uri.parse(photoUri) : null);
         contact.lookupKey = lookupKey;
         contact.lookupUri =
diff --git a/java/com/android/dialer/app/res/xml/display_options_settings.xml b/java/com/android/dialer/app/res/xml/display_options_settings.xml
index 0b4e11d..60301db 100644
--- a/java/com/android/dialer/app/res/xml/display_options_settings.xml
+++ b/java/com/android/dialer/app/res/xml/display_options_settings.xml
@@ -18,14 +18,22 @@
 
 <PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">
 
-  <com.android.contacts.common.preference.SortOrderPreference
-    android:dialogTitle="@string/display_options_sort_list_by"
-    android:key="sortOrder"
-    android:title="@string/display_options_sort_list_by"/>
+  <ListPreference
+      android:dialogTitle="@string/display_options_sort_list_by"
+      android:key="@string/display_options_sort_list_by_key"
+      android:summary="%s"
+      android:entries="@array/contact_sort_order_entries"
+      android:entryValues="@array/contact_sort_order_values"
+      android:title="@string/display_options_sort_list_by"
+      android:defaultValue="1"/>
 
-  <com.android.contacts.common.preference.DisplayOrderPreference
-    android:dialogTitle="@string/display_options_view_names_as"
-    android:key="displayOrder"
-    android:title="@string/display_options_view_names_as"/>
+  <ListPreference
+      android:dialogTitle="@string/display_options_view_names_as"
+      android:key="@string/display_options_view_names_as_key"
+      android:summary="%s"
+      android:entries="@array/contact_display_order_entries"
+      android:entryValues="@array/contact_display_order_values"
+      android:title="@string/display_options_view_names_as"
+      android:defaultValue="1"/>
 
 </PreferenceScreen>
diff --git a/java/com/android/dialer/binary/aosp/AospDialerRootComponent.java b/java/com/android/dialer/binary/aosp/AospDialerRootComponent.java
index ae068ac..8181e21 100644
--- a/java/com/android/dialer/binary/aosp/AospDialerRootComponent.java
+++ b/java/com/android/dialer/binary/aosp/AospDialerRootComponent.java
@@ -24,6 +24,7 @@
 import com.android.dialer.commandline.CommandLineModule;
 import com.android.dialer.common.concurrent.DialerExecutorModule;
 import com.android.dialer.configprovider.SharedPrefConfigProviderModule;
+import com.android.dialer.contacts.ContactsModule;
 import com.android.dialer.duo.stub.StubDuoModule;
 import com.android.dialer.enrichedcall.stub.StubEnrichedCallModule;
 import com.android.dialer.feedback.stub.StubFeedbackModule;
@@ -57,6 +58,7 @@
       CallLogModule.class,
       CallLogConfigModule.class,
       CommandLineModule.class,
+      ContactsModule.class,
       ContextModule.class,
       DialerExecutorModule.class,
       GlidePhotoManagerModule.class,
diff --git a/java/com/android/dialer/binary/basecomponent/BaseDialerRootComponent.java b/java/com/android/dialer/binary/basecomponent/BaseDialerRootComponent.java
index 666a0be..acf14b1 100644
--- a/java/com/android/dialer/binary/basecomponent/BaseDialerRootComponent.java
+++ b/java/com/android/dialer/binary/basecomponent/BaseDialerRootComponent.java
@@ -25,6 +25,7 @@
 import com.android.dialer.commandline.CommandLineComponent;
 import com.android.dialer.common.concurrent.DialerExecutorComponent;
 import com.android.dialer.configprovider.ConfigProviderComponent;
+import com.android.dialer.contacts.ContactsComponent;
 import com.android.dialer.duo.DuoComponent;
 import com.android.dialer.enrichedcall.EnrichedCallComponent;
 import com.android.dialer.feedback.FeedbackComponent;
@@ -62,6 +63,7 @@
         CallLogUiComponent.HasComponent,
         ConfigProviderComponent.HasComponent,
         CommandLineComponent.HasComponent,
+        ContactsComponent.HasComponent,
         DialerExecutorComponent.HasComponent,
         DuoComponent.HasComponent,
         EnrichedCallComponent.HasComponent,
diff --git a/java/com/android/dialer/binary/google/GoogleStubDialerRootComponent.java b/java/com/android/dialer/binary/google/GoogleStubDialerRootComponent.java
index 622bd5d..35e7809 100644
--- a/java/com/android/dialer/binary/google/GoogleStubDialerRootComponent.java
+++ b/java/com/android/dialer/binary/google/GoogleStubDialerRootComponent.java
@@ -24,6 +24,7 @@
 import com.android.dialer.commandline.CommandLineModule;
 import com.android.dialer.common.concurrent.DialerExecutorModule;
 import com.android.dialer.configprovider.SharedPrefConfigProviderModule;
+import com.android.dialer.contacts.ContactsModule;
 import com.android.dialer.duo.stub.StubDuoModule;
 import com.android.dialer.enrichedcall.stub.StubEnrichedCallModule;
 import com.android.dialer.feedback.stub.StubFeedbackModule;
@@ -62,6 +63,7 @@
       CallLogConfigModule.class,
       CommandLineModule.class,
       ContextModule.class,
+      ContactsModule.class,
       DialerExecutorModule.class,
       GlidePhotoManagerModule.class,
       MapsModule.class,
diff --git a/java/com/android/dialer/calllogutils/PhoneCallDetails.java b/java/com/android/dialer/calllogutils/PhoneCallDetails.java
index fe8bfde..7212fa9 100644
--- a/java/com/android/dialer/calllogutils/PhoneCallDetails.java
+++ b/java/com/android/dialer/calllogutils/PhoneCallDetails.java
@@ -25,8 +25,8 @@
 import android.telecom.PhoneAccountHandle;
 import android.text.TextUtils;
 import com.android.contacts.common.ContactsUtils.UserType;
-import com.android.contacts.common.preference.ContactsPreferences;
 import com.android.contacts.common.util.ContactDisplayUtils;
+import com.android.dialer.contacts.displaypreference.ContactDisplayPreferences.DisplayOrder;
 import com.android.dialer.logging.ContactSource;
 import com.android.dialer.phonenumbercache.ContactInfo;
 
@@ -65,7 +65,7 @@
    * The user's preference on name display order, last name first or first time first. {@see
    * ContactsPreferences}
    */
-  public int nameDisplayOrder;
+  public DisplayOrder 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.
@@ -183,8 +183,7 @@
    * @return the preferred name
    */
   public CharSequence getPreferredName() {
-    if (nameDisplayOrder == ContactsPreferences.DISPLAY_ORDER_PRIMARY
-        || TextUtils.isEmpty(nameAlternative)) {
+    if (nameDisplayOrder == DisplayOrder.PRIMARY || TextUtils.isEmpty(nameAlternative)) {
       return namePrimary;
     }
     return nameAlternative;
diff --git a/java/com/android/dialer/contacts/ContactsComponent.java b/java/com/android/dialer/contacts/ContactsComponent.java
new file mode 100644
index 0000000..5c4097a
--- /dev/null
+++ b/java/com/android/dialer/contacts/ContactsComponent.java
@@ -0,0 +1,39 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License
+ */
+
+package com.android.dialer.contacts;
+
+import android.content.Context;
+import com.android.dialer.contacts.displaypreference.ContactDisplayPreferences;
+import com.android.dialer.inject.HasRootComponent;
+import dagger.Subcomponent;
+
+/** Component for contacts related utilities */
+@Subcomponent
+public abstract class ContactsComponent {
+
+  public abstract ContactDisplayPreferences contactDisplayPreferences();
+
+  public static ContactsComponent get(Context context) {
+    return ((HasComponent) ((HasRootComponent) context.getApplicationContext()).component())
+        .contactsComponent();
+  }
+
+  /** Used to refer to the root application component. */
+  public interface HasComponent {
+    ContactsComponent contactsComponent();
+  }
+}
diff --git a/java/com/android/dialer/contacts/ContactsModule.java b/java/com/android/dialer/contacts/ContactsModule.java
new file mode 100644
index 0000000..979c525
--- /dev/null
+++ b/java/com/android/dialer/contacts/ContactsModule.java
@@ -0,0 +1,32 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License
+ */
+
+package com.android.dialer.contacts;
+
+import com.android.dialer.contacts.displaypreference.ContactDisplayPreferences;
+import com.android.dialer.contacts.displaypreference.ContactDisplayPreferencesImpl;
+import com.android.dialer.inject.DialerVariant;
+import com.android.dialer.inject.InstallIn;
+import dagger.Binds;
+import dagger.Module;
+
+/** Module for standard {@link ContactsComponent} */
+@InstallIn(variants = {DialerVariant.DIALER_TEST})
+@Module
+public abstract class ContactsModule {
+  @Binds
+  public abstract ContactDisplayPreferences to(ContactDisplayPreferencesImpl impl);
+}
diff --git a/java/com/android/dialer/contacts/displaypreference/AndroidManifest.xml b/java/com/android/dialer/contacts/displaypreference/AndroidManifest.xml
new file mode 100644
index 0000000..2751461
--- /dev/null
+++ b/java/com/android/dialer/contacts/displaypreference/AndroidManifest.xml
@@ -0,0 +1,18 @@
+<!--
+  ~ Copyright (C) 2018 The Android Open Source Project
+  ~
+  ~ Licensed under the Apache License, Version 2.0 (the "License");
+  ~ you may not use this file except in compliance with the License.
+  ~ You may obtain a copy of the License at
+  ~
+  ~      http://www.apache.org/licenses/LICENSE-2.0
+  ~
+  ~ Unless required by applicable law or agreed to in writing, software
+  ~ distributed under the License is distributed on an "AS IS" BASIS,
+  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  ~ See the License for the specific language governing permissions and
+  ~ limitations under the License
+  -->
+<manifest
+    package="com.android.dialer.contacts.displaypreference">
+</manifest>
\ No newline at end of file
diff --git a/java/com/android/dialer/contacts/displaypreference/ContactDisplayPreferences.java b/java/com/android/dialer/contacts/displaypreference/ContactDisplayPreferences.java
new file mode 100644
index 0000000..dca466e
--- /dev/null
+++ b/java/com/android/dialer/contacts/displaypreference/ContactDisplayPreferences.java
@@ -0,0 +1,162 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License
+ */
+
+package com.android.dialer.contacts.displaypreference;
+
+import android.content.Context;
+import android.support.annotation.Nullable;
+import android.support.annotation.StringRes;
+import android.text.TextUtils;
+import java.util.Arrays;
+
+/** Handles name ordering of a contact (Given name first or family name first.) */
+public interface ContactDisplayPreferences {
+
+  /**
+   * A enum whose value is a String from a Android string resource which can only be resolved at run
+   * time.
+   */
+  interface StringResEnum {
+
+    @StringRes
+    int getStringRes();
+
+    default String getValue(Context context) {
+      return context.getString(getStringRes());
+    }
+
+    static <T extends Enum<T> & StringResEnum> T fromValue(
+        Context context, T[] values, String value) {
+      return Arrays.stream(values)
+          .filter(enumValue -> TextUtils.equals(enumValue.getValue(context), value))
+          // MoreCollectors.onlyElement() is not available to android guava.
+          .reduce(
+              (a, b) -> {
+                throw new AssertionError("multiple result");
+              })
+          .get();
+    }
+  }
+
+  /** Order when displaying the name; */
+  enum DisplayOrder implements StringResEnum {
+
+    /**
+     * The default display order of a name. For western names it will be "Given Family". For
+     * unstructured names like east asian this will be the only order.
+     *
+     * @see android.provider.ContactsContract.Contacts#DISPLAY_NAME_PRIMARY
+     */
+    PRIMARY(R.string.display_options_view_given_name_first_value),
+    /**
+     * The alternative display order of a name. For western names it will be "Family, Given". For
+     * unstructured names like east asian this order will be ignored and treated as primary.
+     *
+     * @see android.provider.ContactsContract.Contacts#DISPLAY_NAME_ALTERNATIVE
+     */
+    ALTERNATIVE(R.string.display_options_view_family_name_first_value);
+
+    @StringRes private final int value;
+
+    DisplayOrder(@StringRes int value) {
+      this.value = value;
+    }
+
+    @Override
+    @StringRes
+    public int getStringRes() {
+      return value;
+    }
+
+    static DisplayOrder fromValue(Context context, String value) {
+      return StringResEnum.fromValue(context, DisplayOrder.values(), value);
+    }
+  }
+
+  /**
+   * Order when sorting the name. In some conventions, names are displayed as given name first, but
+   * sorted by family name.
+   */
+  enum SortOrder implements StringResEnum {
+    /**
+     * Sort by the default display order of a name. For western names it will be "Given Family". For
+     * unstructured names like east asian this will be the only order.
+     *
+     * @see android.provider.ContactsContract.Contacts#DISPLAY_NAME_PRIMARY
+     */
+    BY_PRIMARY(R.string.display_options_sort_by_given_name_value),
+    /**
+     * Sort by the alternative display order of a name. For western names it will be "Family,
+     * Given". For unstructured names like east asian this order will be ignored and treated as
+     * primary.
+     *
+     * @see android.provider.ContactsContract.Contacts#DISPLAY_NAME_ALTERNATIVE
+     */
+    BY_ALTERNATIVE(R.string.display_options_sort_by_family_name_value);
+
+    @StringRes private final int value;
+
+    SortOrder(@StringRes int value) {
+      this.value = value;
+    }
+
+    @Override
+    @StringRes
+    public int getStringRes() {
+      return value;
+    }
+
+    static SortOrder fromValue(Context context, String value) {
+      return StringResEnum.fromValue(context, SortOrder.values(), value);
+    }
+  }
+
+  DisplayOrder getDisplayOrder();
+
+  void setDisplayOrder(DisplayOrder displayOrder);
+
+  SortOrder getSortOrder();
+
+  void setSortOrder(SortOrder sortOrder);
+
+  /** Selects display name based on {@link DisplayOrder} */
+  default String getDisplayName(@Nullable String primaryName, @Nullable String alternativeName) {
+    if (TextUtils.isEmpty(alternativeName)) {
+      return primaryName;
+    }
+    switch (getDisplayOrder()) {
+      case PRIMARY:
+        return primaryName;
+      case ALTERNATIVE:
+        return alternativeName;
+    }
+    throw new AssertionError("exhaustive switch");
+  }
+
+  /** Selects sort name based on {@link SortOrder} */
+  default String getSortName(@Nullable String primaryName, @Nullable String alternativeName) {
+    if (TextUtils.isEmpty(alternativeName)) {
+      return primaryName;
+    }
+    switch (getSortOrder()) {
+      case BY_PRIMARY:
+        return primaryName;
+      case BY_ALTERNATIVE:
+        return alternativeName;
+    }
+    throw new AssertionError("exhaustive switch");
+  }
+}
diff --git a/java/com/android/dialer/contacts/displaypreference/ContactDisplayPreferencesImpl.java b/java/com/android/dialer/contacts/displaypreference/ContactDisplayPreferencesImpl.java
new file mode 100644
index 0000000..6072cc1
--- /dev/null
+++ b/java/com/android/dialer/contacts/displaypreference/ContactDisplayPreferencesImpl.java
@@ -0,0 +1,115 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License
+ */
+
+package com.android.dialer.contacts.displaypreference;
+
+import android.content.Context;
+import android.content.SharedPreferences;
+import android.os.UserManager;
+import android.preference.PreferenceManager;
+import com.android.dialer.inject.ApplicationContext;
+import javax.inject.Inject;
+
+/** Implementation of {@link ContactDisplayPreferences} backed by a {@link SharedPreferences} */
+public final class ContactDisplayPreferencesImpl implements ContactDisplayPreferences {
+
+  private final Context appContext;
+  private final SharedPreferences sharedPreferences;
+  private final String displayOrderKey;
+  private final String sortOrderKey;
+
+  @Inject
+  ContactDisplayPreferencesImpl(@ApplicationContext Context appContext) {
+    this.appContext = appContext;
+    // @Unencrypted preference would be a better choice, but Android Preference only supports the
+    // default file. Names cannot be shown on @Unencrypted anyway.
+    this.sharedPreferences = PreferenceManager.getDefaultSharedPreferences(appContext);
+    displayOrderKey = appContext.getString(R.string.display_options_view_names_as_key);
+    sortOrderKey = appContext.getString(R.string.display_options_sort_list_by_key);
+  }
+
+  @Override
+  public DisplayOrder getDisplayOrder() {
+    migrate();
+    if (!sharedPreferences.contains(displayOrderKey)) {
+      return DisplayOrder.PRIMARY;
+    }
+    return DisplayOrder.fromValue(appContext, sharedPreferences.getString(displayOrderKey, null));
+  }
+
+  @Override
+  public void setDisplayOrder(DisplayOrder displayOrder) {
+    sharedPreferences.edit().putString(displayOrderKey, displayOrder.getValue(appContext)).apply();
+  }
+
+  @Override
+  public SortOrder getSortOrder() {
+    migrate();
+    if (!sharedPreferences.contains(sortOrderKey)) {
+      return SortOrder.BY_PRIMARY;
+    }
+    return SortOrder.fromValue(appContext, sharedPreferences.getString(sortOrderKey, null));
+  }
+
+  @Override
+  public void setSortOrder(SortOrder sortOrder) {
+    sharedPreferences.edit().putString(sortOrderKey, sortOrder.getValue(appContext)).apply();
+  }
+
+  /**
+   * Moves the stored values to the standard location.
+   *
+   * <p>Usually preferences are stored in {@code package.name_preferences.xml}. However the old
+   * com.android.contacts.common.preference.ContactsPreferences stored it in {@code
+   * package.name.xml} which is incompatible with the regular {@link android.preference.Preference}
+   * widgets.
+   */
+  private void migrate() {
+    if (!appContext.getSystemService(UserManager.class).isUserUnlocked()) {
+      return;
+    }
+    SharedPreferences oldPreference =
+        appContext.getSharedPreferences(appContext.getPackageName(), Context.MODE_PRIVATE);
+    if (oldPreference.contains(displayOrderKey) || oldPreference.contains(sortOrderKey)) {
+      sharedPreferences
+          .edit()
+          .putString(
+              displayOrderKey,
+              translateLegacyDisplayOrder(oldPreference.getInt(displayOrderKey, 1)))
+          .putString(sortOrderKey, translateLegacySortOrder(oldPreference.getInt(sortOrderKey, 1)))
+          .apply();
+      oldPreference.edit().remove(displayOrderKey).remove(sortOrderKey).apply();
+    }
+  }
+
+  private String translateLegacyDisplayOrder(int legacyValue) {
+    switch (legacyValue) {
+      case 2:
+        return DisplayOrder.ALTERNATIVE.getValue(appContext);
+      default:
+        return DisplayOrder.PRIMARY.getValue(appContext);
+    }
+  }
+
+  private String translateLegacySortOrder(int legacyValue) {
+    switch (legacyValue) {
+      case 2:
+        return SortOrder.BY_ALTERNATIVE.getValue(appContext);
+      default:
+        return SortOrder.BY_PRIMARY.getValue(appContext);
+    }
+  }
+}
diff --git a/java/com/android/dialer/contacts/displaypreference/res/values/display_preference.xml b/java/com/android/dialer/contacts/displaypreference/res/values/display_preference.xml
new file mode 100644
index 0000000..b74b8b9
--- /dev/null
+++ b/java/com/android/dialer/contacts/displaypreference/res/values/display_preference.xml
@@ -0,0 +1,37 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+  Copyright (C) 2018 The Android Open Source Project
+
+  Licensed under the Apache License, Version 2.0 (the "License");
+  you may not use this file except in compliance with the License.
+  You may obtain a copy of the License at
+
+       http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+  -->
+<resources>
+  <string-array name="contact_display_order_entries">
+    <item>@string/display_options_view_given_name_first</item>
+    <item>@string/display_options_view_family_name_first</item>
+  </string-array>
+
+  <string-array name="contact_display_order_values">
+    <item>@string/display_options_view_given_name_first_value</item>
+    <item>@string/display_options_view_family_name_first_value</item>
+  </string-array>
+
+  <string-array name="contact_sort_order_entries">
+    <item>@string/display_options_sort_by_given_name</item>
+    <item>@string/display_options_sort_by_family_name</item>
+  </string-array>
+
+  <string-array name="contact_sort_order_values">
+    <item>@string/display_options_sort_by_given_name_value</item>
+    <item>@string/display_options_sort_by_family_name_value</item>
+  </string-array>
+</resources>
\ No newline at end of file
diff --git a/java/com/android/dialer/contacts/displaypreference/res/values/strings.xml b/java/com/android/dialer/contacts/displaypreference/res/values/strings.xml
new file mode 100644
index 0000000..8914ddf
--- /dev/null
+++ b/java/com/android/dialer/contacts/displaypreference/res/values/strings.xml
@@ -0,0 +1,48 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+  ~ Copyright (C) 2018 The Android Open Source Project
+  ~
+  ~ Licensed under the Apache License, Version 2.0 (the "License");
+  ~ you may not use this file except in compliance with the License.
+  ~ You may obtain a copy of the License at
+  ~
+  ~      http://www.apache.org/licenses/LICENSE-2.0
+  ~
+  ~ Unless required by applicable law or agreed to in writing, software
+  ~ distributed under the License is distributed on an "AS IS" BASIS,
+  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  ~ See the License for the specific language governing permissions and
+  ~ limitations under the License
+  -->
+<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+  <!-- Contact preferences related strings -->
+
+  <!-- Label of the "sort by" display option -->
+  <string name="display_options_sort_list_by">Sort by</string>
+
+  <string translatable="false" name="display_options_sort_list_by_key">android.contacts.SORT_ORDER</string>
+
+  <!-- An allowable value for the "sort list by" contact display option  -->
+  <string name="display_options_sort_by_given_name">First name</string>
+
+  <string translatable="false" name="display_options_sort_by_given_name_value">sort_by_given_name</string>
+
+  <!-- An allowable value for the "sort list by" contact display option  -->
+  <string name="display_options_sort_by_family_name">Last name</string>
+
+  <string translatable="false" name="display_options_sort_by_family_name_value">sort_by_family_name</string>
+
+  <!-- Label of the "name format" display option [CHAR LIMIT=64]-->
+  <string name="display_options_view_names_as">Name format</string>
+  <string translatable="false" name="display_options_view_names_as_key">android.contacts.DISPLAY_ORDER</string>
+
+  <!-- An allowable value for the "view names as" contact display option  -->
+  <string name="display_options_view_given_name_first">First name first</string>
+
+  <string translatable="false" name="display_options_view_given_name_first_value">view_given_name_first</string>
+
+  <!-- An allowable value for the "view names as" contact display option  -->
+  <string name="display_options_view_family_name_first">Last name first</string>
+
+  <string translatable="false" name="display_options_view_family_name_first_value">view_family_name_first</string>
+</resources>
diff --git a/java/com/android/dialer/contactsfragment/ContactsCursorLoader.java b/java/com/android/dialer/contactsfragment/ContactsCursorLoader.java
index e55f951..d74afe5 100644
--- a/java/com/android/dialer/contactsfragment/ContactsCursorLoader.java
+++ b/java/com/android/dialer/contactsfragment/ContactsCursorLoader.java
@@ -21,7 +21,7 @@
 import android.net.Uri;
 import android.provider.ContactsContract.Contacts;
 import android.text.TextUtils;
-import com.android.contacts.common.preference.ContactsPreferences;
+import com.android.dialer.contacts.ContactsComponent;
 
 /** Cursor Loader for {@link ContactsFragment}. */
 final class ContactsCursorLoader extends CursorLoader {
@@ -61,12 +61,13 @@
   }
 
   private static String[] getProjection(Context context) {
-    ContactsPreferences contactsPrefs = new ContactsPreferences(context);
-    boolean displayOrderPrimary =
-        (contactsPrefs.getDisplayOrder() == ContactsPreferences.DISPLAY_ORDER_PRIMARY);
-    return displayOrderPrimary
-        ? CONTACTS_PROJECTION_DISPLAY_NAME_PRIMARY
-        : CONTACTS_PROJECTION_DISPLAY_NAME_ALTERNATIVE;
+    switch (ContactsComponent.get(context).contactDisplayPreferences().getDisplayOrder()) {
+      case PRIMARY:
+        return CONTACTS_PROJECTION_DISPLAY_NAME_PRIMARY;
+      case ALTERNATIVE:
+        return CONTACTS_PROJECTION_DISPLAY_NAME_ALTERNATIVE;
+    }
+    throw new AssertionError("exhaustive switch");
   }
 
   private static String getWhere(Context context, boolean hasPhoneNumbers) {
@@ -78,10 +79,14 @@
   }
 
   private static String getSortKey(Context context) {
-    ContactsPreferences contactsPrefs = new ContactsPreferences(context);
-    boolean sortOrderPrimary =
-        (contactsPrefs.getSortOrder() == ContactsPreferences.SORT_ORDER_PRIMARY);
-    return sortOrderPrimary ? Contacts.SORT_KEY_PRIMARY : Contacts.SORT_KEY_ALTERNATIVE;
+
+    switch (ContactsComponent.get(context).contactDisplayPreferences().getSortOrder()) {
+      case BY_PRIMARY:
+        return Contacts.SORT_KEY_PRIMARY;
+      case BY_ALTERNATIVE:
+        return Contacts.SORT_KEY_ALTERNATIVE;
+    }
+    throw new AssertionError("exhaustive switch");
   }
 
   /** Update cursor loader to filter contacts based on the provided query. */
diff --git a/java/com/android/dialer/contactsfragment/ContactsFragment.java b/java/com/android/dialer/contactsfragment/ContactsFragment.java
index 794a5b9..f40abec 100644
--- a/java/com/android/dialer/contactsfragment/ContactsFragment.java
+++ b/java/com/android/dialer/contactsfragment/ContactsFragment.java
@@ -41,8 +41,6 @@
 import android.view.ViewGroup;
 import android.widget.ImageView;
 import android.widget.TextView;
-import com.android.contacts.common.preference.ContactsPreferences;
-import com.android.contacts.common.preference.ContactsPreferences.ChangeListener;
 import com.android.dialer.common.Assert;
 import com.android.dialer.common.FragmentUtils;
 import com.android.dialer.common.LogUtil;
@@ -60,8 +58,7 @@
 public class ContactsFragment extends Fragment
     implements LoaderCallbacks<Cursor>,
         OnScrollChangeListener,
-        OnEmptyViewActionButtonClickedListener,
-        ChangeListener {
+        OnEmptyViewActionButtonClickedListener {
 
   /** An enum for the different types of headers that be inserted at position 0 in the list. */
   @Retention(RetentionPolicy.SOURCE)
@@ -98,7 +95,6 @@
 
   private @Header int header;
 
-  private ContactsPreferences contactsPrefs;
   private boolean hasPhoneNumbers;
   private String query;
 
@@ -154,8 +150,6 @@
   @Override
   public void onCreate(@Nullable Bundle savedInstanceState) {
     super.onCreate(savedInstanceState);
-    contactsPrefs = new ContactsPreferences(getContext());
-    contactsPrefs.registerChangeListener(this);
     header = getArguments().getInt(EXTRA_HEADER);
     hasPhoneNumbers = getArguments().getBoolean(EXTRA_HAS_PHONE_NUMBERS);
     if (savedInstanceState == null) {
@@ -224,7 +218,8 @@
   }
 
   @Override
-  public void onChange() {
+  public void onResume() {
+    super.onResume();
     if (getActivity() != null
         && isAdded()
         && PermissionsUtil.hasContactsReadPermissions(getContext())) {
@@ -268,7 +263,6 @@
     recyclerView.setAdapter(null);
     recyclerView.setOnScrollChangeListener(null);
     adapter = null;
-    contactsPrefs.unregisterChangeListener();
   }
 
   /*
diff --git a/java/com/android/dialer/searchfragment/cp2/SearchContactsCursorLoader.java b/java/com/android/dialer/searchfragment/cp2/SearchContactsCursorLoader.java
index 7caa314..f4ed21e 100644
--- a/java/com/android/dialer/searchfragment/cp2/SearchContactsCursorLoader.java
+++ b/java/com/android/dialer/searchfragment/cp2/SearchContactsCursorLoader.java
@@ -27,8 +27,10 @@
 import android.support.annotation.NonNull;
 import android.support.annotation.Nullable;
 import android.text.TextUtils;
-import com.android.contacts.common.preference.ContactsPreferences;
 import com.android.dialer.common.LogUtil;
+import com.android.dialer.contacts.ContactsComponent;
+import com.android.dialer.contacts.displaypreference.ContactDisplayPreferences.DisplayOrder;
+import com.android.dialer.contacts.displaypreference.ContactDisplayPreferences.SortOrder;
 import com.android.dialer.searchfragment.common.Projections;
 import com.android.dialer.searchfragment.common.SearchCursor;
 import com.android.dialer.smartdial.SmartDialCursorLoader;
@@ -55,9 +57,9 @@
   }
 
   private static String[] getProjection(Context context) {
-    ContactsPreferences contactsPrefs = new ContactsPreferences(context);
     boolean displayOrderPrimary =
-        (contactsPrefs.getDisplayOrder() == ContactsPreferences.DISPLAY_ORDER_PRIMARY);
+        (ContactsComponent.get(context).contactDisplayPreferences().getDisplayOrder()
+            == DisplayOrder.PRIMARY);
     return displayOrderPrimary
         ? Projections.CP2_PROJECTION
         : Projections.CP2_PROJECTION_ALTERNATIVE;
@@ -70,9 +72,9 @@
   }
 
   private static String getSortKey(Context context) {
-    ContactsPreferences contactsPrefs = new ContactsPreferences(context);
     boolean sortOrderPrimary =
-        (contactsPrefs.getSortOrder() == ContactsPreferences.SORT_ORDER_PRIMARY);
+        (ContactsComponent.get(context).contactDisplayPreferences().getSortOrder()
+            == SortOrder.BY_PRIMARY);
     return sortOrderPrimary ? Phone.SORT_KEY_PRIMARY : Phone.SORT_KEY_ALTERNATIVE;
   }
 
diff --git a/java/com/android/dialer/shortcuts/DynamicShortcuts.java b/java/com/android/dialer/shortcuts/DynamicShortcuts.java
index be9e088..e39dc27 100644
--- a/java/com/android/dialer/shortcuts/DynamicShortcuts.java
+++ b/java/com/android/dialer/shortcuts/DynamicShortcuts.java
@@ -124,7 +124,7 @@
           DialerShortcut.builder()
               .setContactId(entry.id)
               .setLookupKey(entry.lookupKey)
-              .setDisplayName(entry.getPreferredDisplayName())
+              .setDisplayName(entry.getPreferredDisplayName(context))
               .setRank(rank++)
               .build();
       newDynamicShortcutsById.put(shortcut.getShortcutId(), shortcut);
diff --git a/java/com/android/dialer/speeddial/loader/SpeedDialUiItemMutator.java b/java/com/android/dialer/speeddial/loader/SpeedDialUiItemMutator.java
index 72f0a68..b0b83ac 100644
--- a/java/com/android/dialer/speeddial/loader/SpeedDialUiItemMutator.java
+++ b/java/com/android/dialer/speeddial/loader/SpeedDialUiItemMutator.java
@@ -31,13 +31,14 @@
 import android.support.annotation.WorkerThread;
 import android.util.ArrayMap;
 import android.util.ArraySet;
-import com.android.contacts.common.preference.ContactsPreferences;
 import com.android.dialer.common.Assert;
 import com.android.dialer.common.LogUtil;
 import com.android.dialer.common.concurrent.Annotations.BackgroundExecutor;
 import com.android.dialer.common.concurrent.DialerExecutor.SuccessListener;
 import com.android.dialer.common.concurrent.DialerFutureSerializer;
 import com.android.dialer.common.database.Selection;
+import com.android.dialer.contacts.displaypreference.ContactDisplayPreferences;
+import com.android.dialer.contacts.displaypreference.ContactDisplayPreferences.DisplayOrder;
 import com.android.dialer.duo.DuoComponent;
 import com.android.dialer.inject.ApplicationContext;
 import com.android.dialer.speeddial.database.SpeedDialEntry;
@@ -84,15 +85,16 @@
   private final ListeningExecutorService backgroundExecutor;
   // Used to ensure that only one refresh flow runs at a time.
   private final DialerFutureSerializer dialerFutureSerializer = new DialerFutureSerializer();
-  private final ContactsPreferences contactsPreferences;
+  private final ContactDisplayPreferences contactDisplayPreferences;
 
   @Inject
   public SpeedDialUiItemMutator(
       @ApplicationContext Context appContext,
-      @BackgroundExecutor ListeningExecutorService backgroundExecutor) {
+      @BackgroundExecutor ListeningExecutorService backgroundExecutor,
+      ContactDisplayPreferences contactDisplayPreferences) {
     this.appContext = appContext;
     this.backgroundExecutor = backgroundExecutor;
-    this.contactsPreferences = new ContactsPreferences(appContext);
+    this.contactDisplayPreferences = contactDisplayPreferences;
   }
 
   /**
@@ -183,7 +185,6 @@
   @WorkerThread
   private ImmutableList<SpeedDialUiItem> insertNewContactEntry(Uri contactUri) {
     Assert.isWorkerThread();
-    contactsPreferences.refreshValue(ContactsPreferences.DISPLAY_ORDER_KEY);
     try (Cursor cursor =
         appContext
             .getContentResolver()
@@ -225,7 +226,6 @@
   private ImmutableList<SpeedDialUiItem> loadSpeedDialUiItemsInternal() {
     Trace.beginSection("loadSpeedDialUiItemsInternal");
     Assert.isWorkerThread();
-    contactsPreferences.refreshValue(ContactsPreferences.DISPLAY_ORDER_KEY);
     Trace.beginSection("getAllEntries");
     SpeedDialEntryDao db = getSpeedDialEntryDao();
     Trace.endSection(); // getAllEntries
@@ -663,6 +663,6 @@
   }
 
   private boolean isPrimaryDisplayNameOrder() {
-    return contactsPreferences.getDisplayOrder() == ContactsPreferences.DISPLAY_ORDER_PRIMARY;
+    return contactDisplayPreferences.getDisplayOrder() == DisplayOrder.PRIMARY;
   }
 }
diff --git a/java/com/android/incallui/CallCardPresenter.java b/java/com/android/incallui/CallCardPresenter.java
index 91255cc..b9e6744 100644
--- a/java/com/android/incallui/CallCardPresenter.java
+++ b/java/com/android/incallui/CallCardPresenter.java
@@ -44,11 +44,10 @@
 import android.view.accessibility.AccessibilityEvent;
 import android.view.accessibility.AccessibilityManager;
 import com.android.contacts.common.ContactsUtils;
-import com.android.contacts.common.preference.ContactsPreferences;
-import com.android.contacts.common.util.ContactDisplayUtils;
 import com.android.dialer.common.Assert;
 import com.android.dialer.common.LogUtil;
 import com.android.dialer.configprovider.ConfigProviderComponent;
+import com.android.dialer.contacts.ContactsComponent;
 import com.android.dialer.logging.DialerImpression;
 import com.android.dialer.logging.Logger;
 import com.android.dialer.multimedia.MultimediaData;
@@ -123,7 +122,6 @@
   private String secondaryNumber;
   private ContactCacheEntry primaryContactInfo;
   private ContactCacheEntry secondaryContactInfo;
-  @Nullable private ContactsPreferences contactsPreferences;
   private boolean isFullscreen = false;
   private InCallScreen inCallScreen;
   private boolean isInCallScreenReady;
@@ -159,7 +157,6 @@
   public void onInCallScreenDelegateInit(InCallScreen inCallScreen) {
     Assert.isNotNull(inCallScreen);
     this.inCallScreen = inCallScreen;
-    contactsPreferences = ContactsPreferencesFactory.newContactsPreferences(context);
 
     // Call may be null if disconnect happened already.
     DialerCall call = CallList.getInstance().getFirstCall();
@@ -184,9 +181,6 @@
   public void onInCallScreenReady() {
     LogUtil.i("CallCardPresenter.onInCallScreenReady", null);
     Assert.checkState(!isInCallScreenReady);
-    if (contactsPreferences != null) {
-      contactsPreferences.refreshValue(ContactsPreferences.DISPLAY_ORDER_KEY);
-    }
 
     // Contact search may have completed before ui is ready.
     if (primaryContactInfo != null) {
@@ -985,8 +979,9 @@
   /** Gets the name to display for the call. */
   private String getNameForCall(ContactCacheEntry contactInfo) {
     String preferredName =
-        ContactDisplayUtils.getPreferredDisplayName(
-            contactInfo.namePrimary, contactInfo.nameAlternative, contactsPreferences);
+        ContactsComponent.get(context)
+            .contactDisplayPreferences()
+            .getDisplayName(contactInfo.namePrimary, contactInfo.nameAlternative);
     if (TextUtils.isEmpty(preferredName)) {
       return TextUtils.isEmpty(contactInfo.number)
           ? null
diff --git a/java/com/android/incallui/ConferenceParticipantListAdapter.java b/java/com/android/incallui/ConferenceParticipantListAdapter.java
index c71bf59..d13bd3d 100644
--- a/java/com/android/incallui/ConferenceParticipantListAdapter.java
+++ b/java/com/android/incallui/ConferenceParticipantListAdapter.java
@@ -18,7 +18,6 @@
 
 import android.content.Context;
 import android.net.Uri;
-import android.support.annotation.Nullable;
 import android.support.v4.util.ArrayMap;
 import android.telephony.PhoneNumberUtils;
 import android.text.BidiFormatter;
@@ -33,11 +32,10 @@
 import android.widget.ImageView;
 import android.widget.ListView;
 import android.widget.TextView;
-import com.android.contacts.common.preference.ContactsPreferences;
-import com.android.contacts.common.util.ContactDisplayUtils;
 import com.android.dialer.common.LogUtil;
 import com.android.dialer.contactphoto.ContactPhotoManager;
 import com.android.dialer.contactphoto.ContactPhotoManager.DefaultImageRequest;
+import com.android.dialer.contacts.ContactsComponent;
 import com.android.incallui.ContactInfoCache.ContactCacheEntry;
 import com.android.incallui.call.CallList;
 import com.android.incallui.call.DialerCall;
@@ -59,8 +57,6 @@
   private final ListView listView;
   /** Hashmap to make accessing participant info by call Id faster. */
   private final Map<String, ParticipantInfo> participantsByCallId = new ArrayMap<>();
-  /** ContactsPreferences used to lookup displayName preferences */
-  @Nullable private final ContactsPreferences contactsPreferences;
   /** Contact photo manager to retrieve cached contact photo information. */
   private final ContactPhotoManager contactPhotoManager;
   /** Listener used to handle tap of the "disconnect' button for a participant. */
@@ -103,7 +99,6 @@
       ListView listView, ContactPhotoManager contactPhotoManager) {
 
     this.listView = listView;
-    contactsPreferences = ContactsPreferencesFactory.newContactsPreferences(getContext());
     this.contactPhotoManager = contactPhotoManager;
   }
 
@@ -116,10 +111,6 @@
    */
   public void updateParticipants(
       List<DialerCall> conferenceParticipants, boolean parentCanSeparate) {
-    if (contactsPreferences != null) {
-      contactsPreferences.refreshValue(ContactsPreferences.DISPLAY_ORDER_KEY);
-      contactsPreferences.refreshValue(ContactsPreferences.SORT_ORDER_KEY);
-    }
     this.parentCanSeparate = parentCanSeparate;
     updateParticipantInfo(conferenceParticipants);
   }
@@ -235,8 +226,9 @@
         call.can(android.telecom.Call.Details.CAPABILITY_DISCONNECT_FROM_CONFERENCE);
 
     String name =
-        ContactDisplayUtils.getPreferredDisplayName(
-            contactCache.namePrimary, contactCache.nameAlternative, contactsPreferences);
+        ContactsComponent.get(getContext())
+            .contactDisplayPreferences()
+            .getDisplayName(contactCache.namePrimary, contactCache.nameAlternative);
 
     setCallerInfoForRow(
         result,
@@ -441,14 +433,16 @@
             // Contact names might be null, so replace with empty string.
             ContactCacheEntry c1 = p1.getContactCacheEntry();
             String p1Name =
-                ContactDisplayUtils.getPreferredSortName(
-                    c1.namePrimary, c1.nameAlternative, contactsPreferences);
+                ContactsComponent.get(getContext())
+                    .contactDisplayPreferences()
+                    .getSortName(c1.namePrimary, c1.nameAlternative);
             p1Name = p1Name != null ? p1Name : "";
 
             ContactCacheEntry c2 = p2.getContactCacheEntry();
             String p2Name =
-                ContactDisplayUtils.getPreferredSortName(
-                    c2.namePrimary, c2.nameAlternative, contactsPreferences);
+                ContactsComponent.get(getContext())
+                    .contactDisplayPreferences()
+                    .getSortName(c2.namePrimary, c2.nameAlternative);
             p2Name = p2Name != null ? p2Name : "";
 
             return p1Name.compareToIgnoreCase(p2Name);
diff --git a/java/com/android/incallui/ContactsPreferencesFactory.java b/java/com/android/incallui/ContactsPreferencesFactory.java
deleted file mode 100644
index a9a2109..0000000
--- a/java/com/android/incallui/ContactsPreferencesFactory.java
+++ /dev/null
@@ -1,56 +0,0 @@
-/*
- * Copyright (C) 2016 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License
- */
-
-package com.android.incallui;
-
-import android.content.Context;
-import android.support.annotation.Nullable;
-import android.support.v4.os.UserManagerCompat;
-import com.android.contacts.common.preference.ContactsPreferences;
-
-/** Factory class for {@link ContactsPreferences}. */
-public class ContactsPreferencesFactory {
-
-  private static boolean useTestInstance;
-  private static ContactsPreferences testInstance;
-
-  /**
-   * Creates a new {@link ContactsPreferences} object if possible.
-   *
-   * @param context the context to use when creating the ContactsPreferences.
-   * @return a new ContactsPreferences object or {@code null} if the user is locked.
-   */
-  @Nullable
-  public static ContactsPreferences newContactsPreferences(Context context) {
-    if (useTestInstance) {
-      return testInstance;
-    }
-    if (UserManagerCompat.isUserUnlocked(context)) {
-      return new ContactsPreferences(context);
-    }
-    return null;
-  }
-
-  /**
-   * Sets the instance to be returned by all calls to {@link #newContactsPreferences(Context)}.
-   *
-   * @param testInstance the instance to return.
-   */
-  static void setTestInstance(ContactsPreferences testInstance) {
-    useTestInstance = true;
-    ContactsPreferencesFactory.testInstance = testInstance;
-  }
-}
diff --git a/java/com/android/incallui/ExternalCallNotifier.java b/java/com/android/incallui/ExternalCallNotifier.java
index 10c4a64..160e250 100644
--- a/java/com/android/incallui/ExternalCallNotifier.java
+++ b/java/com/android/incallui/ExternalCallNotifier.java
@@ -38,10 +38,9 @@
 import android.util.ArrayMap;
 import com.android.contacts.common.ContactsUtils;
 import com.android.contacts.common.compat.CallCompat;
-import com.android.contacts.common.preference.ContactsPreferences;
-import com.android.contacts.common.util.ContactDisplayUtils;
 import com.android.dialer.common.Assert;
 import com.android.dialer.contactphoto.BitmapUtil;
+import com.android.dialer.contacts.ContactsComponent;
 import com.android.dialer.notification.DialerNotificationManager;
 import com.android.dialer.notification.NotificationChannelId;
 import com.android.dialer.telecom.TelecomCallUtil;
@@ -78,13 +77,11 @@
   private final ContactInfoCache contactInfoCache;
   private Map<Call, NotificationInfo> notifications = new ArrayMap<>();
   private int nextUniqueNotificationId;
-  private ContactsPreferences contactsPreferences;
 
   /** Initializes a new instance of the external call notifier. */
   public ExternalCallNotifier(
       @NonNull Context context, @NonNull ContactInfoCache contactInfoCache) {
     this.context = context;
-    contactsPreferences = ContactsPreferencesFactory.newContactsPreferences(this.context);
     this.contactInfoCache = contactInfoCache;
   }
 
@@ -216,7 +213,7 @@
    * notification to the notification manager.
    */
   private void saveContactInfo(NotificationInfo info, ContactInfoCache.ContactCacheEntry entry) {
-    info.setContentTitle(getContentTitle(context, contactsPreferences, entry, info.getCall()));
+    info.setContentTitle(getContentTitle(context, entry, info.getCall()));
     info.setPersonReference(getPersonReference(entry, info.getCall()));
     postNotification(info);
   }
@@ -342,17 +339,12 @@
    * number.
    *
    * @param context The context.
-   * @param contactsPreferences Contacts preferences, used to determine the preferred formatting for
-   *     contact names.
    * @param contactInfo The contact info which was looked up in the contact cache.
    * @param call The call to generate a title for.
    * @return The content title.
    */
   private @Nullable String getContentTitle(
-      Context context,
-      @Nullable ContactsPreferences contactsPreferences,
-      ContactInfoCache.ContactCacheEntry contactInfo,
-      android.telecom.Call call) {
+      Context context, ContactInfoCache.ContactCacheEntry contactInfo, android.telecom.Call call) {
 
     if (call.getDetails().hasProperty(android.telecom.Call.Details.PROPERTY_CONFERENCE)) {
       return CallerInfoUtils.getConferenceString(
@@ -361,8 +353,9 @@
     }
 
     String preferredName =
-        ContactDisplayUtils.getPreferredDisplayName(
-            contactInfo.namePrimary, contactInfo.nameAlternative, contactsPreferences);
+        ContactsComponent.get(context)
+            .contactDisplayPreferences()
+            .getDisplayName(contactInfo.namePrimary, contactInfo.nameAlternative);
     if (TextUtils.isEmpty(preferredName)) {
       return TextUtils.isEmpty(contactInfo.number)
           ? null
diff --git a/java/com/android/incallui/ReturnToCallController.java b/java/com/android/incallui/ReturnToCallController.java
index 94ce8d7..addde55 100644
--- a/java/com/android/incallui/ReturnToCallController.java
+++ b/java/com/android/incallui/ReturnToCallController.java
@@ -30,9 +30,9 @@
 import com.android.bubble.BubbleComponent;
 import com.android.bubble.BubbleInfo;
 import com.android.bubble.BubbleInfo.Action;
-import com.android.contacts.common.util.ContactDisplayUtils;
 import com.android.dialer.common.LogUtil;
 import com.android.dialer.configprovider.ConfigProviderComponent;
+import com.android.dialer.contacts.ContactsComponent;
 import com.android.dialer.lettertile.LetterTileDrawable;
 import com.android.dialer.telecom.TelecomUtil;
 import com.android.dialer.theme.base.ThemeComponent;
@@ -369,10 +369,9 @@
   private LetterTileDrawable createLettleTileDrawable(
       DialerCall dialerCall, ContactCacheEntry entry) {
     String preferredName =
-        ContactDisplayUtils.getPreferredDisplayName(
-            entry.namePrimary,
-            entry.nameAlternative,
-            ContactsPreferencesFactory.newContactsPreferences(context));
+        ContactsComponent.get(context)
+            .contactDisplayPreferences()
+            .getDisplayName(entry.namePrimary, entry.nameAlternative);
     if (TextUtils.isEmpty(preferredName)) {
       preferredName = entry.number;
     }
diff --git a/java/com/android/incallui/RttRequestDialogFragment.java b/java/com/android/incallui/RttRequestDialogFragment.java
index 5437cc6..589625b 100644
--- a/java/com/android/incallui/RttRequestDialogFragment.java
+++ b/java/com/android/incallui/RttRequestDialogFragment.java
@@ -28,9 +28,9 @@
 import android.text.TextUtils;
 import android.view.View;
 import android.widget.TextView;
-import com.android.contacts.common.util.ContactDisplayUtils;
 import com.android.dialer.common.Assert;
 import com.android.dialer.common.LogUtil;
+import com.android.dialer.contacts.ContactsComponent;
 import com.android.incallui.ContactInfoCache.ContactCacheEntry;
 import com.android.incallui.ContactInfoCache.ContactInfoCacheCallback;
 import com.android.incallui.call.CallList;
@@ -130,10 +130,9 @@
 
     private CharSequence getNameOrNumber(ContactCacheEntry entry, Context context) {
       String preferredName =
-          ContactDisplayUtils.getPreferredDisplayName(
-              entry.namePrimary,
-              entry.nameAlternative,
-              ContactsPreferencesFactory.newContactsPreferences(context));
+          ContactsComponent.get(context)
+              .contactDisplayPreferences()
+              .getDisplayName(entry.namePrimary, entry.nameAlternative);
       if (TextUtils.isEmpty(preferredName)) {
         return TextUtils.isEmpty(entry.number)
             ? null
diff --git a/java/com/android/incallui/StatusBarNotifier.java b/java/com/android/incallui/StatusBarNotifier.java
index 1d73fe8..8316d76 100644
--- a/java/com/android/incallui/StatusBarNotifier.java
+++ b/java/com/android/incallui/StatusBarNotifier.java
@@ -64,12 +64,11 @@
 import android.text.style.ForegroundColorSpan;
 import com.android.contacts.common.ContactsUtils;
 import com.android.contacts.common.ContactsUtils.UserType;
-import com.android.contacts.common.preference.ContactsPreferences;
-import com.android.contacts.common.util.ContactDisplayUtils;
 import com.android.dialer.common.Assert;
 import com.android.dialer.common.LogUtil;
 import com.android.dialer.configprovider.ConfigProviderComponent;
 import com.android.dialer.contactphoto.BitmapUtil;
+import com.android.dialer.contacts.ContactsComponent;
 import com.android.dialer.enrichedcall.EnrichedCallManager;
 import com.android.dialer.enrichedcall.Session;
 import com.android.dialer.lettertile.LetterTileDrawable;
@@ -121,7 +120,6 @@
   private final Context context;
   private final ContactInfoCache contactInfoCache;
   private final DialerRingtoneManager dialerRingtoneManager;
-  @Nullable private ContactsPreferences contactsPreferences;
   private int currentNotification = NOTIFICATION_NONE;
   private int callState = DialerCallState.INVALID;
   private int videoState = VideoProfile.STATE_AUDIO_ONLY;
@@ -136,7 +134,6 @@
   public StatusBarNotifier(@NonNull Context context, @NonNull ContactInfoCache contactInfoCache) {
     Trace.beginSection("StatusBarNotifier.Constructor");
     this.context = Assert.isNotNull(context);
-    contactsPreferences = ContactsPreferencesFactory.newContactsPreferences(this.context);
     this.contactInfoCache = contactInfoCache;
     dialerRingtoneManager =
         new DialerRingtoneManager(
@@ -565,8 +562,9 @@
     }
 
     String preferredName =
-        ContactDisplayUtils.getPreferredDisplayName(
-            contactInfo.namePrimary, contactInfo.nameAlternative, contactsPreferences);
+        ContactsComponent.get(context)
+            .contactDisplayPreferences()
+            .getDisplayName(contactInfo.namePrimary, contactInfo.nameAlternative);
     if (TextUtils.isEmpty(preferredName)) {
       return TextUtils.isEmpty(contactInfo.number)
           ? null
diff --git a/packages.mk b/packages.mk
index f2b1c7e..1be1f83 100644
--- a/packages.mk
+++ b/packages.mk
@@ -30,6 +30,7 @@
 	com.android.dialer.common.concurrent.testing \
 	com.android.dialer.common.preference \
 	com.android.dialer.configprovider \
+	com.android.dialer.contacts.displaypreference \
 	com.android.dialer.contactphoto \
 	com.android.dialer.contactsfragment \
 	com.android.dialer.databasepopulator \
