diff --git a/res/layout-xlarge/raw_contact_editor_view.xml b/res/layout-xlarge/raw_contact_editor_view.xml
index 02c0314..3c3b9d0 100644
--- a/res/layout-xlarge/raw_contact_editor_view.xml
+++ b/res/layout-xlarge/raw_contact_editor_view.xml
@@ -77,6 +77,16 @@
                     android:layout_marginTop="6dip"
                     android:layout_marginBottom="4dip" />
 
+                <com.android.contacts.editor.PhoneticNameEditorView
+                    android:id="@+id/edit_phonetic_name"
+                    android:layout_width="match_parent"
+                    android:layout_height="wrap_content"
+                    android:paddingRight="?android:attr/scrollbarSize"
+                    android:layout_marginLeft="52dip"
+                    android:layout_marginRight="48dip"
+                    android:layout_marginTop="6dip"
+                    android:layout_marginBottom="4dip" />
+
                 <FrameLayout
                     android:layout_width="match_parent"
                     android:layout_height="wrap_content"
diff --git a/res/layout/raw_contact_editor_view.xml b/res/layout/raw_contact_editor_view.xml
index 022d0b4..ac30a6b 100644
--- a/res/layout/raw_contact_editor_view.xml
+++ b/res/layout/raw_contact_editor_view.xml
@@ -101,7 +101,14 @@
             android:layout_width="match_parent"
             android:layout_height="wrap_content"
             android:paddingRight="?android:attr/scrollbarSize"
-            android:layout_below="@id/stub_photo"
+            android:layout_marginTop="6dip"
+            android:layout_marginBottom="4dip" />
+
+        <com.android.contacts.editor.PhoneticNameEditorView
+            android:id="@+id/edit_phonetic_name"
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:paddingRight="?android:attr/scrollbarSize"
             android:layout_marginTop="6dip"
             android:layout_marginBottom="4dip" />
 
diff --git a/res/values-ja/donottranslate_config.xml b/res/values-ja/donottranslate_config.xml
index c5d3aea..7f53722 100644
--- a/res/values-ja/donottranslate_config.xml
+++ b/res/values-ja/donottranslate_config.xml
@@ -32,4 +32,7 @@
     
     <!-- If true, the order of name fields in the editor is primary (i.e. given name first) -->
     <bool name="config_editor_field_order_primary">false</bool>
+
+    <!-- If true, phonetic name is included in the contact editor by default -->
+    <bool name="config_editor_include_phonetic_name">true</bool>
 </resources>
diff --git a/res/values/donottranslate_config.xml b/res/values/donottranslate_config.xml
index cad2a63..f5efa13 100644
--- a/res/values/donottranslate_config.xml
+++ b/res/values/donottranslate_config.xml
@@ -96,4 +96,7 @@
 
     <!-- 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>
+
+    <!-- If true, phonetic name is included in the contact editor by default -->
+    <bool name="config_editor_include_phonetic_name">false</bool>
 </resources>
diff --git a/res/values/strings.xml b/res/values/strings.xml
index 4c75705..ff69899 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -1216,6 +1216,8 @@
     <string name="name_phonetic_middle">Phonetic middle name</string>
     <!-- Field title for the phonetic family name of a contact -->
     <string name="name_phonetic_family">Phonetic family name</string>
+    <!-- Field title for the phonetic name of a contact [CHAR LIMIT=64]-->
+    <string name="name_phonetic">Phonetic name</string>
 
     <!-- String describing which account type a contact came from when editing it -->
     <string name="account_type_format"><xliff:g id="source" example="Gmail">%1$s</xliff:g> contact</string>
diff --git a/src/com/android/contacts/editor/ContactEditorFragment.java b/src/com/android/contacts/editor/ContactEditorFragment.java
index 67eb564..aeec123 100644
--- a/src/com/android/contacts/editor/ContactEditorFragment.java
+++ b/src/com/android/contacts/editor/ContactEditorFragment.java
@@ -553,12 +553,7 @@
                     new PhotoEditorListener(editor, type.readOnly));
             if (editor instanceof RawContactEditorView) {
                 final RawContactEditorView rawContactEditor = (RawContactEditorView) editor;
-                final TextFieldsEditorView nameEditor = rawContactEditor.getNameEditor();
-                if (mRequestFocus) {
-                    nameEditor.requestFocus();
-                    mRequestFocus = false;
-                }
-                nameEditor.setEditorListener(new EditorListener() {
+                EditorListener listener = new EditorListener() {
 
                     @Override
                     public void onRequest(int request) {
@@ -570,8 +565,18 @@
                     @Override
                     public void onDeleted(Editor removedEditor) {
                     }
-                });
+                };
 
+                final TextFieldsEditorView nameEditor = rawContactEditor.getNameEditor();
+                if (mRequestFocus) {
+                    nameEditor.requestFocus();
+                    mRequestFocus = false;
+                }
+                nameEditor.setEditorListener(listener);
+
+                final TextFieldsEditorView phoneticNameEditor =
+                        rawContactEditor.getPhoneticNameEditor();
+                phoneticNameEditor.setEditorListener(listener);
                 rawContactEditor.setAutoAddToDefaultGroup(mAutoAddToDefaultGroup);
 
                 if (rawContactId == mAggregationSuggestionsRawContactId) {
diff --git a/src/com/android/contacts/editor/PhoneticNameEditorView.java b/src/com/android/contacts/editor/PhoneticNameEditorView.java
new file mode 100644
index 0000000..d3aa00d
--- /dev/null
+++ b/src/com/android/contacts/editor/PhoneticNameEditorView.java
@@ -0,0 +1,156 @@
+/*
+ * 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.editor;
+
+import com.android.contacts.model.AccountType.DataKind;
+import com.android.contacts.model.EntityDelta;
+import com.android.contacts.model.EntityDelta.ValuesDelta;
+
+import android.content.Context;
+import android.provider.ContactsContract.CommonDataKinds.StructuredName;
+import android.text.TextUtils;
+import android.util.AttributeSet;
+
+/**
+ * A dedicated editor for phonetic name. It is similar to {@link StructuredNameEditorView}.
+ */
+public class PhoneticNameEditorView extends TextFieldsEditorView {
+
+    private static class PhoneticValuesDelta extends ValuesDelta {
+        private ValuesDelta mValues;
+        private String mPhoneticName;
+
+        public PhoneticValuesDelta(ValuesDelta values) {
+            mValues = values;
+            buildPhoneticName();
+        }
+
+        @Override
+        public void put(String key, String value) {
+            if (key.equals(DataKind.PSEUDO_COLUMN_PHONETIC_NAME)) {
+                mPhoneticName = value;
+                parsePhoneticName(value);
+            } else {
+                mValues.put(key, value);
+                buildPhoneticName();
+            }
+        }
+
+        @Override
+        public String getAsString(String key) {
+            if (key.equals(DataKind.PSEUDO_COLUMN_PHONETIC_NAME)) {
+                return mPhoneticName;
+            } else {
+                return mValues.getAsString(key);
+            }
+        }
+
+        private void parsePhoneticName(String value) {
+            String family = null;
+            String middle = null;
+            String given = null;
+
+            if (!TextUtils.isEmpty(value)) {
+                String[] strings = value.split(" ", 3);
+                switch (strings.length) {
+                    case 1:
+                        family = strings[0];
+                        break;
+                    case 2:
+                        family = strings[0];
+                        given = strings[1];
+                        break;
+                    case 3:
+                        family = strings[0];
+                        middle = strings[1];
+                        given = strings[2];
+                        break;
+                }
+            }
+
+            mValues.put(StructuredName.PHONETIC_FAMILY_NAME, family);
+            mValues.put(StructuredName.PHONETIC_MIDDLE_NAME, middle);
+            mValues.put(StructuredName.PHONETIC_GIVEN_NAME, given);
+        }
+
+        private void buildPhoneticName() {
+            String family = mValues.getAsString(StructuredName.PHONETIC_FAMILY_NAME);
+            String middle = mValues.getAsString(StructuredName.PHONETIC_MIDDLE_NAME);
+            String given = mValues.getAsString(StructuredName.PHONETIC_GIVEN_NAME);
+
+            if (!TextUtils.isEmpty(family) || !TextUtils.isEmpty(middle)
+                    || !TextUtils.isEmpty(given)) {
+                StringBuilder sb = new StringBuilder();
+                if (!TextUtils.isEmpty(family)) {
+                    sb.append(family.trim()).append(' ');
+                }
+                if (!TextUtils.isEmpty(middle)) {
+                    sb.append(middle.trim()).append(' ');
+                }
+                if (!TextUtils.isEmpty(given)) {
+                    sb.append(given.trim()).append(' ');
+                }
+                sb.setLength(sb.length() - 1);  // Yank the last space
+                mPhoneticName = sb.toString();
+            } else {
+                mPhoneticName = null;
+            }
+        }
+
+        @Override
+        public Long getId() {
+            return mValues.getId();
+        }
+
+        @Override
+        public boolean isVisible() {
+            return mValues.isVisible();
+        }
+    }
+
+    public PhoneticNameEditorView(Context context) {
+        super(context);
+    }
+
+    public PhoneticNameEditorView(Context context, AttributeSet attrs) {
+        super(context, attrs);
+    }
+
+    public PhoneticNameEditorView(Context context, AttributeSet attrs, int defStyle) {
+        super(context, attrs, defStyle);
+    }
+
+    @Override
+    public void setValues(DataKind kind, ValuesDelta entry, EntityDelta state, boolean readOnly,
+            ViewIdGenerator vig) {
+        if (!(entry instanceof PhoneticValuesDelta)) {
+            entry = new PhoneticValuesDelta(entry);
+        }
+        super.setValues(kind, entry, state, readOnly, vig);
+    }
+
+    public boolean hasData() {
+        ValuesDelta entry = getEntry();
+
+        String family = entry.getAsString(StructuredName.PHONETIC_FAMILY_NAME);
+        String middle = entry.getAsString(StructuredName.PHONETIC_MIDDLE_NAME);
+        String given = entry.getAsString(StructuredName.PHONETIC_GIVEN_NAME);
+
+        return !TextUtils.isEmpty(family) || !TextUtils.isEmpty(middle)
+                || !TextUtils.isEmpty(given);
+    }
+}
diff --git a/src/com/android/contacts/editor/RawContactEditorView.java b/src/com/android/contacts/editor/RawContactEditorView.java
index 496144b..633b343 100644
--- a/src/com/android/contacts/editor/RawContactEditorView.java
+++ b/src/com/android/contacts/editor/RawContactEditorView.java
@@ -62,7 +62,8 @@
 public class RawContactEditorView extends BaseRawContactEditorView {
     private LayoutInflater mInflater;
 
-    private TextFieldsEditorView mName;
+    private StructuredNameEditorView mName;
+    private PhoneticNameEditorView mPhoneticName;
     private GroupMembershipView mGroupMembershipView;
 
     private ViewGroup mFields;
@@ -79,6 +80,8 @@
     private DataKind mGroupMembershipKind;
     private EntityDelta mState;
 
+    private boolean mPhoneticNameAdded;
+
     public RawContactEditorView(Context context) {
         super(context);
     }
@@ -93,11 +96,15 @@
 
         View view = getPhotoEditor();
         if (view != null) {
-            view.setEnabled(isEnabled());
+            view.setEnabled(enabled);
         }
 
         if (mName != null) {
-            mName.setEnabled(isEnabled());
+            mName.setEnabled(enabled);
+        }
+
+        if (mPhoneticName != null) {
+            mPhoneticName.setEnabled(enabled);
         }
 
         if (mFields != null) {
@@ -111,7 +118,7 @@
             mGroupMembershipView.setEnabled(enabled);
         }
 
-        mAddFieldButton.setEnabled(isEnabled());
+        mAddFieldButton.setEnabled(enabled);
     }
 
     @Override
@@ -122,10 +129,12 @@
 
         final int photoSize = getResources().getDimensionPixelSize(R.dimen.edit_photo_size);
 
-        mName = (TextFieldsEditorView)findViewById(R.id.edit_name);
+        mName = (StructuredNameEditorView)findViewById(R.id.edit_name);
         mName.setMinimumHeight(photoSize);
         mName.setDeletable(false);
 
+        mPhoneticName = (PhoneticNameEditorView)findViewById(R.id.edit_phonetic_name);
+
         mFields = (ViewGroup)findViewById(R.id.sect_fields);
 
         mHeaderIcon = (ImageView) findViewById(R.id.header_icon);
@@ -185,9 +194,12 @@
         mName.setEditorTextSize(
                 mContext.getResources().getDimensionPixelSize(R.dimen.contact_name_text_size));
 
+        mPhoneticName.setEnabled(isEnabled());
+
         // Show and hide the appropriate views
         mFields.setVisibility(View.VISIBLE);
         mName.setVisibility(View.VISIBLE);
+        mPhoneticName.setVisibility(View.VISIBLE);
 
         mGroupMembershipKind = type.getKindForMimetype(GroupMembership.CONTENT_ITEM_TYPE);
         if (mGroupMembershipKind != null) {
@@ -206,7 +218,12 @@
             if (StructuredName.CONTENT_ITEM_TYPE.equals(mimeType)) {
                 // Handle special case editor for structured name
                 final ValuesDelta primary = state.getPrimaryEntry(mimeType);
-                mName.setValues(kind, primary, state, false, vig);
+                mName.setValues(
+                        type.getKindForMimetype(DataKind.PSEUDO_MIME_TYPE_DISPLAY_NAME),
+                        primary, state, false, vig);
+                mPhoneticName.setValues(
+                        type.getKindForMimetype(DataKind.PSEUDO_MIME_TYPE_PHONETIC_NAME),
+                        primary, state, false, vig);
             } else if (Photo.CONTENT_ITEM_TYPE.equals(mimeType)) {
                 // Handle special case editor for photos
                 final ValuesDelta primary = state.getPrimaryEntry(mimeType);
@@ -230,6 +247,8 @@
             mFields.addView(mGroupMembershipView);
         }
 
+        updatePhoneticNameVisibility();
+
         addToDefaultGroupIfNeeded();
 
         mAddFieldButton.setEnabled(isEnabled());
@@ -307,6 +326,21 @@
         return mName;
     }
 
+    public TextFieldsEditorView getPhoneticNameEditor() {
+        return mPhoneticName;
+    }
+
+    private void updatePhoneticNameVisibility() {
+        boolean showByDefault =
+                getContext().getResources().getBoolean(R.bool.config_editor_include_phonetic_name);
+
+        if (showByDefault || mPhoneticName.hasData() || mPhoneticNameAdded) {
+            mPhoneticName.setVisibility(View.VISIBLE);
+        } else {
+            mPhoneticName.setVisibility(View.GONE);
+        }
+    }
+
     @Override
     public long getRawContactId() {
         return mRawContactId;
@@ -323,18 +357,34 @@
             if (child instanceof KindSectionView) {
                 final KindSectionView sectionView = (KindSectionView) child;
                 // not a list and already exists? ignore
-                if (!sectionView.getKind().isList && sectionView.getEditorCount() != 0) {
+                DataKind kind = sectionView.getKind();
+                if (!kind.isList && sectionView.getEditorCount() != 0) {
                     continue;
                 }
+                if (DataKind.PSEUDO_MIME_TYPE_DISPLAY_NAME.equals(kind.mimeType)) {
+                    continue;
+                }
+
+                if (DataKind.PSEUDO_MIME_TYPE_PHONETIC_NAME.equals(kind.mimeType)
+                        && mPhoneticName.getVisibility() == View.VISIBLE) {
+                    continue;
+                }
+
                 menu.add(Menu.NONE, fields.size(), Menu.NONE, sectionView.getTitle());
                 fields.add(sectionView);
             }
         }
+
         popupMenu.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() {
             @Override
             public boolean onMenuItemClick(MenuItem item) {
                 final KindSectionView view = fields.get(item.getItemId());
-                view.addItem();
+                if (DataKind.PSEUDO_MIME_TYPE_PHONETIC_NAME.equals(view.getKind().mimeType)) {
+                    mPhoneticNameAdded = true;
+                    updatePhoneticNameVisibility();
+                } else {
+                    view.addItem();
+                }
                 return true;
             }
         });
diff --git a/src/com/android/contacts/editor/TextFieldsEditorView.java b/src/com/android/contacts/editor/TextFieldsEditorView.java
index 1a930a1..031ab18 100644
--- a/src/com/android/contacts/editor/TextFieldsEditorView.java
+++ b/src/com/android/contacts/editor/TextFieldsEditorView.java
@@ -364,7 +364,7 @@
 
         ss.mHideOptional = mHideOptional;
 
-        final int numChildren = mFieldEditTexts.length;
+        final int numChildren = mFieldEditTexts == null ? 0 : mFieldEditTexts.length;
         ss.mVisibilities = new int[numChildren];
         for (int i = 0; i < numChildren; i++) {
             ss.mVisibilities[i] = mFieldEditTexts[i].getVisibility();
diff --git a/src/com/android/contacts/model/AccountType.java b/src/com/android/contacts/model/AccountType.java
index 0f67fba..aef5c06 100644
--- a/src/com/android/contacts/model/AccountType.java
+++ b/src/com/android/contacts/model/AccountType.java
@@ -166,6 +166,11 @@
      * labels and editable {@link EditField}.
      */
     public static class DataKind {
+
+        public static final String PSEUDO_MIME_TYPE_DISPLAY_NAME = "#displayName";
+        public static final String PSEUDO_MIME_TYPE_PHONETIC_NAME = "#phoneticName";
+        public static final String PSEUDO_COLUMN_PHONETIC_NAME = "#phoneticName";
+
         public String resPackageName;
         public String mimeType;
         public int titleRes;
diff --git a/src/com/android/contacts/model/BaseAccountType.java b/src/com/android/contacts/model/BaseAccountType.java
index 70cfa55..d4a7496 100644
--- a/src/com/android/contacts/model/BaseAccountType.java
+++ b/src/com/android/contacts/model/BaseAccountType.java
@@ -105,6 +105,35 @@
 
         kind.fieldList = Lists.newArrayList();
         kind.fieldList.add(new EditField(StructuredName.DISPLAY_NAME,
+                R.string.full_name, FLAGS_PERSON_NAME));
+        kind.fieldList.add(new EditField(StructuredName.PREFIX, R.string.name_prefix,
+                FLAGS_PERSON_NAME).setLongForm(true));
+        kind.fieldList.add(new EditField(StructuredName.FAMILY_NAME, R.string.name_family,
+                FLAGS_PERSON_NAME).setLongForm(true));
+        kind.fieldList.add(new EditField(StructuredName.MIDDLE_NAME, R.string.name_middle,
+                FLAGS_PERSON_NAME).setLongForm(true));
+        kind.fieldList.add(new EditField(StructuredName.GIVEN_NAME, R.string.name_given,
+                FLAGS_PERSON_NAME).setLongForm(true));
+        kind.fieldList.add(new EditField(StructuredName.SUFFIX, R.string.name_suffix,
+                FLAGS_PERSON_NAME).setLongForm(true));
+        kind.fieldList.add(new EditField(StructuredName.PHONETIC_FAMILY_NAME,
+                R.string.name_phonetic_family, FLAGS_PHONETIC));
+        kind.fieldList.add(new EditField(StructuredName.PHONETIC_MIDDLE_NAME,
+                R.string.name_phonetic_middle, FLAGS_PHONETIC));
+        kind.fieldList.add(new EditField(StructuredName.PHONETIC_GIVEN_NAME,
+                R.string.name_phonetic_given, FLAGS_PHONETIC));
+
+        return kind;
+    }
+
+    protected DataKind addDataKindDisplayName(Context context) {
+        DataKind kind = addKind(new DataKind(DataKind.PSEUDO_MIME_TYPE_DISPLAY_NAME,
+                R.string.nameLabelsGroup, -1, -1, true));
+        kind.actionHeader = new SimpleInflater(R.string.nameLabelsGroup);
+        kind.actionBody = new SimpleInflater(Nickname.NAME);
+
+        kind.fieldList = Lists.newArrayList();
+        kind.fieldList.add(new EditField(StructuredName.DISPLAY_NAME,
                 R.string.full_name, FLAGS_PERSON_NAME).setShortForm(true));
 
         boolean displayOrderPrimary =
@@ -133,6 +162,19 @@
             kind.fieldList.add(new EditField(StructuredName.SUFFIX, R.string.name_suffix,
                     FLAGS_PERSON_NAME).setLongForm(true));
         }
+
+        return kind;
+    }
+
+    protected DataKind addDataKindPhoneticName(Context context) {
+        DataKind kind = addKind(new DataKind(DataKind.PSEUDO_MIME_TYPE_PHONETIC_NAME,
+                R.string.name_phonetic, -1, -1, true));
+        kind.actionHeader = new SimpleInflater(R.string.nameLabelsGroup);
+        kind.actionBody = new SimpleInflater(Nickname.NAME);
+
+        kind.fieldList = Lists.newArrayList();
+        kind.fieldList.add(new EditField(DataKind.PSEUDO_COLUMN_PHONETIC_NAME,
+                R.string.name_phonetic, FLAGS_PHONETIC).setShortForm(true));
         kind.fieldList.add(new EditField(StructuredName.PHONETIC_FAMILY_NAME,
                 R.string.name_phonetic_family, FLAGS_PHONETIC).setLongForm(true));
         kind.fieldList.add(new EditField(StructuredName.PHONETIC_MIDDLE_NAME,
diff --git a/src/com/android/contacts/model/ExchangeAccountType.java b/src/com/android/contacts/model/ExchangeAccountType.java
index 9779e70..2b1a520 100644
--- a/src/com/android/contacts/model/ExchangeAccountType.java
+++ b/src/com/android/contacts/model/ExchangeAccountType.java
@@ -47,6 +47,8 @@
         this.summaryResPackageName = resPackageName;
 
         addDataKindStructuredName(context);
+        addDataKindDisplayName(context);
+        addDataKindPhoneticName(context);
         addDataKindNickname(context);
         addDataKindPhone(context);
         addDataKindEmail(context);
@@ -62,7 +64,37 @@
 
     @Override
     protected DataKind addDataKindStructuredName(Context context) {
-        final DataKind kind = super.addDataKindStructuredName(context);
+        DataKind kind = addKind(new DataKind(StructuredName.CONTENT_ITEM_TYPE,
+                R.string.nameLabelsGroup, -1, -1, true));
+        kind.actionHeader = new SimpleInflater(R.string.nameLabelsGroup);
+        kind.actionBody = new SimpleInflater(Nickname.NAME);
+
+        kind.typeOverallMax = 1;
+
+        kind.fieldList = Lists.newArrayList();
+        kind.fieldList.add(new EditField(StructuredName.PREFIX, R.string.name_prefix,
+                FLAGS_PERSON_NAME).setOptional(true));
+        kind.fieldList.add(new EditField(StructuredName.FAMILY_NAME,
+                R.string.name_family, FLAGS_PERSON_NAME));
+        kind.fieldList.add(new EditField(StructuredName.MIDDLE_NAME,
+                R.string.name_middle, FLAGS_PERSON_NAME));
+        kind.fieldList.add(new EditField(StructuredName.GIVEN_NAME,
+                R.string.name_given, FLAGS_PERSON_NAME));
+        kind.fieldList.add(new EditField(StructuredName.SUFFIX,
+                R.string.name_suffix, FLAGS_PERSON_NAME));
+
+        kind.fieldList.add(new EditField(StructuredName.PHONETIC_FAMILY_NAME,
+                R.string.name_phonetic_family, FLAGS_PHONETIC));
+        kind.fieldList.add(new EditField(StructuredName.PHONETIC_GIVEN_NAME,
+                R.string.name_phonetic_given, FLAGS_PHONETIC));
+
+        return kind;
+    }
+
+    @Override
+    protected DataKind addDataKindDisplayName(Context context) {
+        DataKind kind = addKind(new DataKind(DataKind.PSEUDO_MIME_TYPE_DISPLAY_NAME,
+                R.string.nameLabelsGroup, -1, -1, true));
 
         boolean displayOrderPrimary =
                 context.getResources().getBoolean(R.bool.config_editor_field_order_primary);
@@ -78,8 +110,6 @@
                     R.string.name_middle, FLAGS_PERSON_NAME).setOptional(true));
             kind.fieldList.add(new EditField(StructuredName.GIVEN_NAME,
                     R.string.name_given, FLAGS_PERSON_NAME));
-            kind.fieldList.add(new EditField(StructuredName.SUFFIX,
-                    R.string.name_suffix, FLAGS_PERSON_NAME).setOptional(true));
         } else {
             kind.fieldList.add(new EditField(StructuredName.GIVEN_NAME,
                     R.string.name_given, FLAGS_PERSON_NAME));
@@ -87,14 +117,27 @@
                     R.string.name_middle, FLAGS_PERSON_NAME).setOptional(true));
             kind.fieldList.add(new EditField(StructuredName.FAMILY_NAME,
                     R.string.name_family, FLAGS_PERSON_NAME));
-            kind.fieldList.add(new EditField(StructuredName.SUFFIX,
-                    R.string.name_suffix, FLAGS_PERSON_NAME).setOptional(true));
         }
+        kind.fieldList.add(new EditField(StructuredName.SUFFIX,
+                R.string.name_suffix, FLAGS_PERSON_NAME).setOptional(true));
 
+        return kind;
+    }
+
+    @Override
+    protected DataKind addDataKindPhoneticName(Context context) {
+        DataKind kind = addKind(new DataKind(DataKind.PSEUDO_MIME_TYPE_PHONETIC_NAME,
+                R.string.name_phonetic, -1, -1, true));
+        kind.actionHeader = new SimpleInflater(R.string.nameLabelsGroup);
+        kind.actionBody = new SimpleInflater(Nickname.NAME);
+
+        kind.typeOverallMax = 1;
+
+        kind.fieldList = Lists.newArrayList();
         kind.fieldList.add(new EditField(StructuredName.PHONETIC_FAMILY_NAME,
-                R.string.name_phonetic_family, FLAGS_PHONETIC).setOptional(true));
+                R.string.name_phonetic_family, FLAGS_PHONETIC));
         kind.fieldList.add(new EditField(StructuredName.PHONETIC_GIVEN_NAME,
-                R.string.name_phonetic_given, FLAGS_PHONETIC).setOptional(true));
+                R.string.name_phonetic_given, FLAGS_PHONETIC));
 
         return kind;
     }
diff --git a/src/com/android/contacts/model/ExternalAccountType.java b/src/com/android/contacts/model/ExternalAccountType.java
index 0b895f6..9ce6fd9 100644
--- a/src/com/android/contacts/model/ExternalAccountType.java
+++ b/src/com/android/contacts/model/ExternalAccountType.java
@@ -73,6 +73,8 @@
 
         // Bring in name and photo from fallback source, which are non-optional
         addDataKindStructuredName(context);
+        addDataKindDisplayName(context);
+        addDataKindPhoneticName(context);
         addDataKindPhoto(context);
     }
 
diff --git a/src/com/android/contacts/model/FallbackAccountType.java b/src/com/android/contacts/model/FallbackAccountType.java
index 05e6556..13540be 100644
--- a/src/com/android/contacts/model/FallbackAccountType.java
+++ b/src/com/android/contacts/model/FallbackAccountType.java
@@ -31,6 +31,8 @@
         this.summaryResPackageName = resPackageName;
 
         addDataKindStructuredName(context);
+        addDataKindDisplayName(context);
+        addDataKindPhoneticName(context);
         addDataKindNickname(context);
         addDataKindPhone(context);
         addDataKindEmail(context);
diff --git a/src/com/android/contacts/model/GoogleAccountType.java b/src/com/android/contacts/model/GoogleAccountType.java
index d369b28..af25691 100644
--- a/src/com/android/contacts/model/GoogleAccountType.java
+++ b/src/com/android/contacts/model/GoogleAccountType.java
@@ -40,6 +40,8 @@
         this.summaryResPackageName = resPackageName;
 
         addDataKindStructuredName(context);
+        addDataKindDisplayName(context);
+        addDataKindPhoneticName(context);
         addDataKindNickname(context);
         addDataKindPhone(context);
         addDataKindEmail(context);
