diff --git a/src/com/android/contacts/editor/ContactEditorFragment.java b/src/com/android/contacts/editor/ContactEditorFragment.java
index ac07342..a250b4e 100644
--- a/src/com/android/contacts/editor/ContactEditorFragment.java
+++ b/src/com/android/contacts/editor/ContactEditorFragment.java
@@ -52,6 +52,7 @@
 import android.view.ViewGroup;
 import android.widget.AdapterView;
 import android.widget.BaseAdapter;
+import android.widget.EditText;
 import android.widget.LinearLayout;
 import android.widget.ListPopupWindow;
 import android.widget.Toast;
@@ -100,6 +101,7 @@
 import java.util.HashSet;
 import java.util.Iterator;
 import java.util.List;
+import java.util.Locale;
 import java.util.Set;
 
 /**
@@ -1280,6 +1282,13 @@
         if (uri != null) {
             editorView.setFullSizePhoto(uri);
         }
+        final StructuredNameEditorView nameEditor = editorView.getNameEditorView();
+        final TextFieldsEditorView phoneticNameEditor = editorView.getPhoneticEditorView();
+        final boolean useJapaneseOrder = 
+                       Locale.JAPANESE.getLanguage().equals(Locale.getDefault().getLanguage());
+        if (useJapaneseOrder && nameEditor != null && phoneticNameEditor != null) {
+            nameEditor.setPhoneticView(phoneticNameEditor);
+        }
 
         // The editor is ready now so make it visible
         editorView.setEnabled(mEnabled);
diff --git a/src/com/android/contacts/editor/Editor.java b/src/com/android/contacts/editor/Editor.java
index 711fbc0..c02816a 100644
--- a/src/com/android/contacts/editor/Editor.java
+++ b/src/com/android/contacts/editor/Editor.java
@@ -81,6 +81,16 @@
     public void onFieldChanged(String column, String value);
 
     /**
+     * Update the phonetic field with the specified character string.
+     */
+    public void updatePhonetic(String column, String value);
+
+    /**
+     * Returns the phonetic field string of the specified column.
+     */
+    public String getPhonetic(String column);
+
+    /**
      * Marks the underlying ValuesDelta as deleted, but does not update the view.
      */
     public void markDeleted();
diff --git a/src/com/android/contacts/editor/KindSectionView.java b/src/com/android/contacts/editor/KindSectionView.java
index 94f8a32..5d49064 100644
--- a/src/com/android/contacts/editor/KindSectionView.java
+++ b/src/com/android/contacts/editor/KindSectionView.java
@@ -254,6 +254,19 @@
         return (StructuredNameEditorView) mEditors.getChildAt(0);
     }
 
+    public TextFieldsEditorView getPhoneticEditorView() {
+        if (!StructuredName.CONTENT_ITEM_TYPE.equals(mKindSectionData.getMimeType())) {
+            return null;
+        }
+        for (int i = 0; i < mEditors.getChildCount(); i++) {
+            final View view = mEditors.getChildAt(i);
+            if (!(view instanceof StructuredNameEditorView)) {
+                return (TextFieldsEditorView) view;
+            }
+        }
+        return null;
+    }
+
     /**
      * Binds views for the given {@link KindSectionData}.
      *
diff --git a/src/com/android/contacts/editor/LabeledEditorView.java b/src/com/android/contacts/editor/LabeledEditorView.java
index 5712f39..df4c5f9 100644
--- a/src/com/android/contacts/editor/LabeledEditorView.java
+++ b/src/com/android/contacts/editor/LabeledEditorView.java
@@ -331,6 +331,17 @@
         notifyEditorListener();
     }
 
+    /** {@inheritDoc} */
+    @Override
+    public void updatePhonetic(String column, String value) {
+    }
+
+    /** {@inheritDoc} */
+    @Override
+    public String getPhonetic(String column){
+        return "";
+    }
+
     protected void saveValue(String column, String value) {
         mEntry.put(column, value);
     }
diff --git a/src/com/android/contacts/editor/RawContactEditorView.java b/src/com/android/contacts/editor/RawContactEditorView.java
index 7c61f64..19da5bc 100644
--- a/src/com/android/contacts/editor/RawContactEditorView.java
+++ b/src/com/android/contacts/editor/RawContactEditorView.java
@@ -387,6 +387,13 @@
                 ? null : nameKindSectionView.getNameEditorView();
     }
 
+    public TextFieldsEditorView getPhoneticEditorView() {
+        final KindSectionView kindSectionView = mKindSectionViewMap
+                .get(StructuredName.CONTENT_ITEM_TYPE);
+        return kindSectionView == null
+                ? null : kindSectionView.getPhoneticEditorView();
+    }
+
     public RawContactDelta getCurrentRawContactDelta() {
         return mCurrentRawContactDelta;
     }
diff --git a/src/com/android/contacts/editor/StructuredNameEditorView.java b/src/com/android/contacts/editor/StructuredNameEditorView.java
index 1387bd1..922ceec 100644
--- a/src/com/android/contacts/editor/StructuredNameEditorView.java
+++ b/src/com/android/contacts/editor/StructuredNameEditorView.java
@@ -21,8 +21,12 @@
 import android.content.res.Resources;
 import android.os.Parcel;
 import android.os.Parcelable;
+import android.provider.ContactsContract.CommonDataKinds.StructuredName;
+import android.text.Editable;
 import android.util.AttributeSet;
 import android.view.View;
+import android.view.ViewGroup;
+import android.widget.EditText;
 
 import com.android.contacts.R;
 import com.android.contacts.model.RawContactDelta;
@@ -40,6 +44,8 @@
     private StructuredNameDataItem mSnapshot;
     private boolean mChanged;
 
+    private TextFieldsEditorView mPhoneticView;
+
     public StructuredNameEditorView(Context context) {
         super(context);
     }
@@ -93,6 +99,53 @@
         notifyEditorListener();
     }
 
+    public void updatePhonetic(String column, String value) {
+        EditText view = null;
+
+        if (mPhoneticView != null) {
+            ViewGroup fields = (ViewGroup) mPhoneticView.findViewById(R.id.editors);
+
+            if (StructuredName.FAMILY_NAME.equals(column)) {
+                view = (EditText) fields.getChildAt(0);
+            } else if (StructuredName.GIVEN_NAME.equals(column)) {
+                view = (EditText) fields.getChildAt(2);
+            } else if (StructuredName.MIDDLE_NAME.equals(column)) {
+                view = (EditText) fields.getChildAt(1);
+            }
+
+            if (view != null) {
+                view.setText(value);
+            }
+        }
+    }
+
+    @Override
+    public String getPhonetic(String column) {
+        String input = "";
+        EditText view = null;
+
+        if (mPhoneticView != null) {
+            ViewGroup fields = (ViewGroup) mPhoneticView.findViewById(R.id.editors);
+
+            if (StructuredName.FAMILY_NAME.equals(column)) {
+                view = (EditText) fields.getChildAt(0);
+            } else if (StructuredName.GIVEN_NAME.equals(column)) {
+                view = (EditText) fields.getChildAt(2);
+            } else if (StructuredName.MIDDLE_NAME.equals(column)) {
+                view = (EditText) fields.getChildAt(1);
+            }
+
+            if (view != null) {
+                input = view.getText().toString();
+            }
+        }
+        return input;
+    }
+
+    public void setPhoneticView(TextFieldsEditorView phoneticNameEditor) {
+        mPhoneticView = phoneticNameEditor;
+    }
+
     /**
      * Returns the display name currently displayed in the editor.
      */
diff --git a/src/com/android/contacts/editor/TextFieldsEditorView.java b/src/com/android/contacts/editor/TextFieldsEditorView.java
index c3a240a..28fe87f 100644
--- a/src/com/android/contacts/editor/TextFieldsEditorView.java
+++ b/src/com/android/contacts/editor/TextFieldsEditorView.java
@@ -22,9 +22,11 @@
 import android.os.Parcel;
 import android.os.Parcelable;
 import android.provider.ContactsContract;
+import android.provider.ContactsContract.CommonDataKinds.StructuredName;
 import android.text.Editable;
 import android.text.InputType;
 import android.text.Spannable;
+import android.text.Spanned;
 import android.text.TextUtils;
 import android.text.TextWatcher;
 import android.text.style.TtsSpan;
@@ -69,6 +71,10 @@
     private int mMinFieldHeight;
     private int mPreviousViewHeight;
     private int mHintTextColorUnfocused;
+    private String mFixedPhonetic = "";
+    private String mFixedDisplayName = "";
+    private boolean needInputInitialize;
+
 
     public TextFieldsEditorView(Context context) {
         super(context);
@@ -174,6 +180,10 @@
             }
             // Rebuild the label spinner using the new colors.
             rebuildLabel();
+
+            if (hasFocus) {
+                needInputInitialize = true;
+            }
         }
     };
 
@@ -214,6 +224,38 @@
         mFieldEditTexts[field].setText(value);
     }
 
+    private boolean isUnFixed(Editable input) {
+        boolean unfixed = false;
+        Object[] spanned = input.getSpans(0, input.length(), Object.class);
+        if (spanned != null) {
+            for (Object obj : spanned) {
+                if ((input.getSpanFlags(obj) & Spanned.SPAN_COMPOSING) == Spanned.SPAN_COMPOSING) {
+                    unfixed = true;
+                }
+            }
+        }
+        return unfixed;
+    }
+
+    private String getNameField(String column) {
+
+      EditText editText = null;
+
+      if (StructuredName.FAMILY_NAME.equals(column)) {
+          editText = (EditText) mFields.getChildAt(1);
+      } else if (StructuredName.GIVEN_NAME.equals(column)) {
+          editText = (EditText) mFields.getChildAt(3);
+      } else if (StructuredName.MIDDLE_NAME.equals(column)) {
+          editText = (EditText) mFields.getChildAt(2);
+      }
+
+      if (editText != null) {
+          return editText.getText().toString();
+      }
+
+      return "";
+    }
+
     @Override
     public void setValues(DataKind kind, ValuesDelta entry, RawContactDelta state, boolean readOnly,
             ViewIdGenerator vig) {
@@ -280,18 +322,45 @@
 
             // Prepare listener for writing changes
             fieldView.addTextChangedListener(new TextWatcher() {
+                private int mStart = 0;
                 @Override
                 public void afterTextChanged(Editable s) {
                     // Trigger event for newly changed value
                     onFieldChanged(column, s.toString());
+
+                    if (!DataKind.PSEUDO_MIME_TYPE_NAME.equals(getKind().mimeType)){
+                        return;
+                    }
+
+                    String displayNameField = s.toString();
+
+                    int nonFixedLen = displayNameField.length() - mFixedDisplayName.length();
+                    if (isUnFixed(s) || nonFixedLen == 0) {
+                        String tmpString = mFixedPhonetic
+                             + displayNameField.substring(mStart, displayNameField.length());
+
+                        updatePhonetic(column, tmpString);
+                    } else {
+                        mFixedPhonetic = getPhonetic(column);
+                        mFixedDisplayName = displayNameField;
+                    }
                 }
 
                 @Override
                 public void beforeTextChanged(CharSequence s, int start, int count, int after) {
+                    if (!DataKind.PSEUDO_MIME_TYPE_NAME.equals(getKind().mimeType)){
+                        return;
+                    }
+                    if (needInputInitialize) {
+                        mFixedPhonetic = getPhonetic(column);
+                        mFixedDisplayName = getNameField(column);
+                        needInputInitialize = false;
+                    }
                 }
 
                 @Override
                 public void onTextChanged(CharSequence s, int start, int before, int count) {
+                    mStart = start;
                     if (!ContactsContract.CommonDataKinds.Phone.CONTENT_ITEM_TYPE.equals(
                             getKind().mimeType) || !(s instanceof Spannable)) {
                         return;
diff --git a/src/com/android/contacts/model/account/AccountType.java b/src/com/android/contacts/model/account/AccountType.java
index bddfc09..c3e0eb5 100644
--- a/src/com/android/contacts/model/account/AccountType.java
+++ b/src/com/android/contacts/model/account/AccountType.java
@@ -444,6 +444,7 @@
         public boolean optional;
         public boolean shortForm;
         public boolean longForm;
+        public String phoneticsColumn;
 
         public EditField(String column, int titleRes) {
             this.column = column;
@@ -470,6 +471,11 @@
             return this;
         }
 
+        public EditField setPhoneticsColumn(String phoneticsColumn) {
+            this.phoneticsColumn = phoneticsColumn;
+            return this;
+        }
+
         public EditField setMinLines(int minLines) {
             this.minLines = minLines;
             return this;
diff --git a/src/com/android/contacts/model/account/BaseAccountType.java b/src/com/android/contacts/model/account/BaseAccountType.java
index 50f623a..b242950 100644
--- a/src/com/android/contacts/model/account/BaseAccountType.java
+++ b/src/com/android/contacts/model/account/BaseAccountType.java
@@ -191,18 +191,18 @@
                 FLAGS_PERSON_NAME).setOptional(true));
         if (!displayOrderPrimary) {
             kind.fieldList.add(new EditField(StructuredName.FAMILY_NAME, R.string.name_family,
-                    FLAGS_PERSON_NAME));
+                    FLAGS_PERSON_NAME).setPhoneticsColumn(StructuredName.PHONETIC_FAMILY_NAME));
             kind.fieldList.add(new EditField(StructuredName.MIDDLE_NAME, R.string.name_middle,
-                    FLAGS_PERSON_NAME).setOptional(true));
+                    FLAGS_PERSON_NAME).setOptional(true).setPhoneticsColumn(StructuredName.PHONETIC_MIDDLE_NAME));
             kind.fieldList.add(new EditField(StructuredName.GIVEN_NAME, R.string.name_given,
-                    FLAGS_PERSON_NAME));
+                    FLAGS_PERSON_NAME).setPhoneticsColumn(StructuredName.PHONETIC_GIVEN_NAME));
         } else {
             kind.fieldList.add(new EditField(StructuredName.GIVEN_NAME, R.string.name_given,
-                    FLAGS_PERSON_NAME));
+                    FLAGS_PERSON_NAME).setPhoneticsColumn(StructuredName.PHONETIC_GIVEN_NAME));
             kind.fieldList.add(new EditField(StructuredName.MIDDLE_NAME, R.string.name_middle,
-                    FLAGS_PERSON_NAME).setOptional(true));
+                    FLAGS_PERSON_NAME).setOptional(true).setPhoneticsColumn(StructuredName.PHONETIC_MIDDLE_NAME));
             kind.fieldList.add(new EditField(StructuredName.FAMILY_NAME, R.string.name_family,
-                    FLAGS_PERSON_NAME));
+                    FLAGS_PERSON_NAME).setPhoneticsColumn(StructuredName.PHONETIC_FAMILY_NAME));
         }
         kind.fieldList.add(new EditField(StructuredName.SUFFIX, R.string.name_suffix,
                 FLAGS_PERSON_NAME).setOptional(true));
