diff --git a/res/values/donottranslate_config.xml b/res/values/donottranslate_config.xml
index 5e46f81..f81e01f 100644
--- a/res/values/donottranslate_config.xml
+++ b/res/values/donottranslate_config.xml
@@ -43,6 +43,9 @@
     <!-- If true, the default sort order is primary (i.e. by given name) -->
     <bool name="config_default_display_order_primary">true</bool>
 
+    <!-- If true, phonetic name fields are not visible when empty -->
+    <bool name="config_default_hide_phonetic_name_if_empty">true</bool>
+
     <!-- If true, the order of name fields in the editor is primary (i.e. given name first) -->
     <bool name="config_editor_field_order_primary">true</bool>
 
diff --git a/res/values/strings.xml b/res/values/strings.xml
index 4fca68b..538336c 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -1318,6 +1318,17 @@
     <!-- Label of the "sort by" display option -->
     <string name="display_options_sort_list_by">Sort by</string>
 
+    <!-- Label of the "phonetic name fields" display option. [CHAR LIMIT=50] -->
+    <string name="display_options_phonetic_name_fields">Phonetic name</string>
+
+    <!-- Option to initially show the phonetic name input fields on the contact editor even if the
+    contact does not have a phonetic name. [CHAR LIMIT=25]  -->
+    <string name="editor_options_always_show_phonetic_names">Always show</string>
+
+    <!-- Option to initially hide the phonetic name input fields on the contact editor if the
+    contact being edited doesn't have a phonetic name. [CHAR LIMIT=25]  -->
+    <string name="editor_options_hide_phonetic_names_if_empty">Hide if empty</string>
+
     <!-- An allowable value for the "sort list by" contact display option  -->
     <string name="display_options_sort_by_given_name">First name</string>
 
diff --git a/res/xml/preference_display_options.xml b/res/xml/preference_display_options.xml
index ca9365c..c969cd2 100644
--- a/res/xml/preference_display_options.xml
+++ b/res/xml/preference_display_options.xml
@@ -49,6 +49,12 @@
         android:title="@string/display_options_view_names_as"
         android:dialogTitle="@string/display_options_view_names_as" />
 
+    <com.android.contacts.preference.PhoneticNameDisplayPreference
+        android:icon="@null"
+        android:key="phoneticNameDisplay"
+        android:title="@string/display_options_phonetic_name_fields"
+        android:dialogTitle="@string/display_options_phonetic_name_fields"/>
+
     <Preference
         android:icon="@null"
         android:key="import"
diff --git a/src/com/android/contacts/editor/KindSectionView.java b/src/com/android/contacts/editor/KindSectionView.java
index 7e9d53e..94f8a32 100644
--- a/src/com/android/contacts/editor/KindSectionView.java
+++ b/src/com/android/contacts/editor/KindSectionView.java
@@ -36,6 +36,7 @@
 import com.android.contacts.model.ValuesDelta;
 import com.android.contacts.model.account.AccountType;
 import com.android.contacts.model.dataitem.DataKind;
+import com.android.contacts.preference.ContactsPreferences;
 
 import java.util.ArrayList;
 import java.util.List;
@@ -348,8 +349,7 @@
                     nameValuesDelta, rawContactDelta.getRawContactId(), mListener));
         }
         nameView.setDeletable(false);
-        nameView.setValues(
-                accountType.getKindForMimetype(DataKind.PSEUDO_MIME_TYPE_NAME),
+        nameView.setValues(accountType.getKindForMimetype(DataKind.PSEUDO_MIME_TYPE_NAME),
                 nameValuesDelta, rawContactDelta, /* readOnly =*/ false, mViewIdGenerator);
 
         // Correct start margin since there is a second icon in the structured name layout
@@ -376,6 +376,8 @@
         layoutParams.setMargins(0, 0, 0, 0);
         phoneticNameView.setLayoutParams(layoutParams);
         mEditors.addView(phoneticNameView);
+        // Display of phonetic name fields is controlled from settings preferences.
+        mHideIfEmpty = new ContactsPreferences(getContext()).shouldHidePhoneticNamesIfEmpty();
     }
 
     private void addGroupEditorView(RawContactDelta rawContactDelta, DataKind dataKind) {
diff --git a/src/com/android/contacts/preference/ContactsPreferences.java b/src/com/android/contacts/preference/ContactsPreferences.java
index 48fb205..ab52b1b 100644
--- a/src/com/android/contacts/preference/ContactsPreferences.java
+++ b/src/com/android/contacts/preference/ContactsPreferences.java
@@ -69,6 +69,8 @@
 
     public static final boolean PREF_DISPLAY_ONLY_PHONES_DEFAULT = false;
 
+    public static final String PHONETIC_NAME_DISPLAY_KEY = "Phonetic_name_display";
+
     /**
      * Value to use when a preference is unassigned and needs to be read from the shared preferences
      */
@@ -77,6 +79,8 @@
     private final Context mContext;
     private int mSortOrder = PREFERENCE_UNASSIGNED;
     private int mDisplayOrder = PREFERENCE_UNASSIGNED;
+    private int mPhoneticNameDisplayPreference = PREFERENCE_UNASSIGNED;
+
     private AccountWithDataSet mDefaultAccount = null;
     private ChangeListener mListener = null;
     private Handler mHandler;
@@ -165,6 +169,34 @@
         mBackupManager.dataChanged();
     }
 
+    public int getDefaultPhoneticNameDisplayPreference() {
+        if (mContext.getResources().getBoolean(R.bool.config_default_hide_phonetic_name_if_empty)) {
+            return PhoneticNameDisplayPreference.HIDE_IF_EMPTY;
+        } else {
+            return PhoneticNameDisplayPreference.SHOW_ALWAYS;
+        }
+    }
+
+    public void setPhoneticNameDisplayPreference(int phoneticNameDisplayPreference) {
+        mPhoneticNameDisplayPreference = phoneticNameDisplayPreference;
+        final Editor editor = mPreferences.edit();
+        editor.putInt(PHONETIC_NAME_DISPLAY_KEY, phoneticNameDisplayPreference);
+        editor.commit();
+        mBackupManager.dataChanged();
+    }
+
+    public int getPhoneticNameDisplayPreference() {
+        if (mPhoneticNameDisplayPreference == PREFERENCE_UNASSIGNED) {
+            mPhoneticNameDisplayPreference = mPreferences.getInt(PHONETIC_NAME_DISPLAY_KEY,
+                    getDefaultPhoneticNameDisplayPreference());
+        }
+        return mPhoneticNameDisplayPreference;
+    }
+
+    public boolean shouldHidePhoneticNamesIfEmpty() {
+        return getPhoneticNameDisplayPreference() == PhoneticNameDisplayPreference.HIDE_IF_EMPTY;
+    }
+
     public boolean isDefaultAccountUserChangeable() {
         return mIsDefaultAccountUserChangeable;
     }
@@ -326,6 +358,16 @@
             setDisplayOrder(displayOrder);
         }
 
+        if (!mPreferences.contains(PHONETIC_NAME_DISPLAY_KEY)) {
+            int phoneticNameFieldsDisplay = getDefaultPhoneticNameDisplayPreference();
+            try {
+                phoneticNameFieldsDisplay = Settings.System.getInt(mContext.getContentResolver(),
+                        PHONETIC_NAME_DISPLAY_KEY);
+            } catch (SettingNotFoundException e) {
+            }
+            setPhoneticNameDisplayPreference(phoneticNameFieldsDisplay);
+        }
+
         if (!mPreferences.contains(mDefaultAccountKey)) {
             final SharedPreferences previousPrefs =
                     PreferenceManager.getDefaultSharedPreferences(mContext);
diff --git a/src/com/android/contacts/preference/PhoneticNameDisplayPreference.java b/src/com/android/contacts/preference/PhoneticNameDisplayPreference.java
new file mode 100644
index 0000000..42bbcc3
--- /dev/null
+++ b/src/com/android/contacts/preference/PhoneticNameDisplayPreference.java
@@ -0,0 +1,93 @@
+/*
+ * Copyright (C) 2017 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.preference;
+
+import android.app.AlertDialog.Builder;
+import android.content.Context;
+import android.preference.ListPreference;
+import android.util.AttributeSet;
+
+import com.android.contacts.R;
+
+/**
+ * Custom preference: phonetic name fields.
+ */
+public final class PhoneticNameDisplayPreference extends ListPreference {
+
+    public static final int SHOW_ALWAYS = 0;
+    public static final int HIDE_IF_EMPTY = 1;
+
+    private Context mContext;
+    private ContactsPreferences mPreferences;
+
+    public PhoneticNameDisplayPreference(Context context) {
+        super(context);
+        prepare();
+    }
+
+    public PhoneticNameDisplayPreference(Context context, AttributeSet attrs) {
+        super(context, attrs);
+        prepare();
+    }
+
+    private void prepare() {
+        mContext = getContext();
+        mPreferences = new ContactsPreferences(mContext);
+        setEntries(new String[]{
+                mContext.getString(R.string.editor_options_always_show_phonetic_names),
+                mContext.getString(R.string.editor_options_hide_phonetic_names_if_empty)
+        });
+        setEntryValues(new String[]{
+                String.valueOf(SHOW_ALWAYS),
+                String.valueOf(HIDE_IF_EMPTY),
+        });
+        setValue(String.valueOf(mPreferences.getPhoneticNameDisplayPreference()));
+    }
+
+    @Override
+    protected boolean shouldPersist() {
+        return false;   // This preference takes care of its own storage
+    }
+
+    @Override
+    public CharSequence getSummary() {
+        switch (mPreferences.getPhoneticNameDisplayPreference()) {
+            case SHOW_ALWAYS:
+                return mContext.getString(R.string.editor_options_always_show_phonetic_names);
+            case HIDE_IF_EMPTY:
+                return mContext.getString(R.string.editor_options_hide_phonetic_names_if_empty);
+        }
+        return null;
+    }
+
+    @Override
+    protected boolean persistString(String value) {
+        final int newValue = Integer.parseInt(value);
+        if (newValue != mPreferences.getPhoneticNameDisplayPreference()) {
+            mPreferences.setPhoneticNameDisplayPreference(newValue);
+            notifyChanged();
+        }
+        return true;
+    }
+
+    // UX recommendation is not to show cancel button on such lists.
+    @Override
+    protected void onPrepareDialogBuilder(Builder builder) {
+        super.onPrepareDialogBuilder(builder);
+        builder.setNegativeButton(null, null);
+    }
+}
