diff --git a/src/com/android/contacts/editor/CompactKindSectionView.java b/src/com/android/contacts/editor/CompactKindSectionView.java
index fffe464..23a66ab 100644
--- a/src/com/android/contacts/editor/CompactKindSectionView.java
+++ b/src/com/android/contacts/editor/CompactKindSectionView.java
@@ -25,10 +25,12 @@
 
 import android.content.Context;
 import android.database.Cursor;
+import android.provider.ContactsContract;
 import android.provider.ContactsContract.CommonDataKinds.Event;
 import android.provider.ContactsContract.CommonDataKinds.GroupMembership;
 import android.provider.ContactsContract.CommonDataKinds.Nickname;
 import android.provider.ContactsContract.CommonDataKinds.StructuredName;
+import android.text.TextUtils;
 import android.util.AttributeSet;
 import android.view.LayoutInflater;
 import android.view.View;
@@ -344,24 +346,6 @@
         final boolean readOnly = !accountType.areContactsWritable();
 
         if (readOnly) {
-            final View nameView = mLayoutInflater.inflate(
-                    R.layout.structured_name_readonly_editor_view, mEditors,
-                    /* attachToRoot =*/ false);
-
-            // Display name
-            ((TextView) nameView.findViewById(R.id.display_name))
-                    .setText(valuesDelta.getDisplayName());
-
-            // Account type info
-            final LinearLayout accountTypeLayout = (LinearLayout)
-                    nameView.findViewById(R.id.account_type);
-            accountTypeLayout.setVisibility(View.VISIBLE);
-            ((ImageView) accountTypeLayout.findViewById(R.id.account_type_icon))
-                    .setImageDrawable(accountType.getDisplayIcon(getContext()));
-            ((TextView) accountTypeLayout.findViewById(R.id.account_type_name))
-                    .setText(accountType.getDisplayLabel(getContext()));
-
-            mEditors.addView(nameView);
             return;
         }
 
@@ -557,10 +541,13 @@
         }
         // Add a new empty editor
         if (mShowOneEmptyEditor) {
+            final String mimeType = mKindSectionDataList.getMimeType();
+            if (Nickname.CONTENT_ITEM_TYPE.equals(mimeType) && mEditors.getChildCount() > 0) {
+                return;
+            }
             final RawContactDelta rawContactDelta =
                     mKindSectionDataList.get(0).getRawContactDelta();
             final ValuesDelta values = RawContactModifier.insertChild(rawContactDelta, dataKind);
-            final String mimeType = mKindSectionDataList.getMimeType();
             final Editor.EditorListener editorListener = Event.CONTENT_ITEM_TYPE.equals(mimeType)
                     ? new EventEditorListener() : new NonNameEditorListener();
             final View view = addNonNameEditorView(rawContactDelta, dataKind, values,
diff --git a/src/com/android/contacts/editor/CompactRawContactsEditorView.java b/src/com/android/contacts/editor/CompactRawContactsEditorView.java
index 2bdd212..386a6b3 100644
--- a/src/com/android/contacts/editor/CompactRawContactsEditorView.java
+++ b/src/com/android/contacts/editor/CompactRawContactsEditorView.java
@@ -686,6 +686,7 @@
         mViewIdGenerator = viewIdGenerator;
         mPhotoId = photoId;
         mReadOnlyDisplayName = readOnlyDisplayName;
+
         mHasNewContact = hasNewContact;
         mIsUserProfile = isUserProfile;
         mPrimaryAccount = primaryAccount;
@@ -762,12 +763,6 @@
                         new KindSectionData(accountType, dataKind, rawContactDelta);
                 kindSectionDataList.add(kindSectionData);
 
-                // Note we must create nickname entries
-                if (Nickname.CONTENT_ITEM_TYPE.equals(mimeType)
-                        && kindSectionData.getValuesDeltas().isEmpty()) {
-                    RawContactModifier.insertChild(rawContactDelta, dataKind);
-                }
-
                 vlog("parse: " + i + " " + dataKind.mimeType + " " +
                         kindSectionData.getValuesDeltas().size() + " value(s)");
             }
@@ -775,9 +770,6 @@
     }
 
     private KindSectionDataList getOrCreateKindSectionDataList(String mimeType) {
-        // Put structured names and nicknames together
-        mimeType = Nickname.CONTENT_ITEM_TYPE.equals(mimeType)
-                ? StructuredName.CONTENT_ITEM_TYPE : mimeType;
         KindSectionDataList kindSectionDataList = mKindSectionDataMap.get(mimeType);
         if (kindSectionDataList == null) {
             kindSectionDataList = new KindSectionDataList();
@@ -1009,7 +1001,20 @@
             i++;
 
             final String mimeType = entry.getKey();
-            final KindSectionDataList kindSectionDataList = entry.getValue();
+            KindSectionDataList kindSectionDataList = entry.getValue();
+            if (StructuredName.CONTENT_ITEM_TYPE.equals(mimeType)) {
+                // Only show one name editor view. Select one matched name to display according to
+                // the order: super primary name, first non-empty name, first empty name, null.
+                // The name should be the name displayed in Quick contact.
+                final Pair<KindSectionData,ValuesDelta> nameToDisplay =
+                        kindSectionDataList.getEntryToDisplay(0L);
+                if (nameToDisplay != null) {
+                    final KindSectionData nameKindSectionData = nameToDisplay.first;
+                    kindSectionDataList = new KindSectionDataList();
+                    kindSectionDataList.add(nameKindSectionData);
+                }
+            }
+
 
             // Ignore mime types that we've already handled
             if (Photo.CONTENT_ITEM_TYPE.equals(mimeType)) {
diff --git a/src/com/android/contacts/editor/KindSectionDataList.java b/src/com/android/contacts/editor/KindSectionDataList.java
index 3658f21..73cd42c 100644
--- a/src/com/android/contacts/editor/KindSectionDataList.java
+++ b/src/com/android/contacts/editor/KindSectionDataList.java
@@ -43,13 +43,7 @@
      */
     public String getMimeType() {
         if (isEmpty()) return null;
-        final String mimeType = get(0).getDataKind().mimeType;
-        // StructuredNames and Nicknames are a special case and go together under the
-        // StructuredName mime type
-        if (Nickname.CONTENT_ITEM_TYPE.equals(mimeType)) {
-            return StructuredName.CONTENT_ITEM_TYPE;
-        }
-        return mimeType;
+        return get(0).getDataKind().mimeType;
     }
 
     /**
@@ -161,12 +155,7 @@
         final String listMimeType = getMimeType();
         if (listMimeType != null) {
             final String newEntryMimeType = kindSectionData.getDataKind().mimeType;
-            if (isNameMimeType(listMimeType)) {
-                if (!isNameMimeType(newEntryMimeType)) {
-                    throw new IllegalArgumentException(
-                            "Can't add " + newEntryMimeType + " to list with type " + listMimeType);
-                }
-            } else if (!listMimeType.equals(newEntryMimeType)) {
+            if (!listMimeType.equals(newEntryMimeType)) {
                 throw new IllegalArgumentException(
                         "Can't add " + newEntryMimeType + " to list with type " + listMimeType);
             }
@@ -174,12 +163,6 @@
         return super.add(kindSectionData);
     }
 
-    // StructuredNames and Nicknames are a special case and go together
-    private static boolean isNameMimeType(String mimeType) {
-        return StructuredName.CONTENT_ITEM_TYPE.equals(mimeType)
-                || Nickname.CONTENT_ITEM_TYPE.equals(mimeType);
-    }
-
     private static void vlog(String message) {
         if (Log.isLoggable(TAG, Log.VERBOSE)) {
             Log.v(TAG, message);
