diff --git a/res/layout/compact_account_info.xml b/res/layout/compact_account_info.xml
index 1ec1179..b7f396e 100644
--- a/res/layout/compact_account_info.xml
+++ b/res/layout/compact_account_info.xml
@@ -24,6 +24,7 @@
         android:orientation="horizontal"
         android:background="?android:attr/selectableItemBackground"
         android:paddingTop="8dip"
+        android:visibility="gone"
         >
 
     <ImageView
diff --git a/src/com/android/contacts/editor/CompactKindSectionView.java b/src/com/android/contacts/editor/CompactKindSectionView.java
index 23a66ab..c902e77 100644
--- a/src/com/android/contacts/editor/CompactKindSectionView.java
+++ b/src/com/android/contacts/editor/CompactKindSectionView.java
@@ -25,12 +25,10 @@
 
 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;
@@ -290,7 +288,8 @@
      * displayed, even if it is empty.
      */
     public void setState(KindSectionDataList kindSectionDataList,
-            ViewIdGenerator viewIdGenerator, CompactRawContactsEditorView.Listener listener) {
+            ViewIdGenerator viewIdGenerator, CompactRawContactsEditorView.Listener listener,
+            ValuesDelta primaryValuesDelta) {
         mKindSectionDataList = kindSectionDataList;
         mViewIdGenerator = viewIdGenerator;
         mListener = listener;
@@ -306,29 +305,27 @@
             }
         }
 
-        rebuildFromState();
+        rebuildFromState(primaryValuesDelta);
 
         updateEmptyEditors(/* shouldAnimate = */ false);
     }
 
-    private void rebuildFromState() {
+    private void rebuildFromState(ValuesDelta primaryValuesDelta) {
         mEditors.removeAllViews();
 
+        final String mimeType = mKindSectionDataList.getMimeType();
         for (KindSectionData kindSectionData : mKindSectionDataList) {
-            final String mimeType = kindSectionData.getDataKind().mimeType;
             if (StructuredName.CONTENT_ITEM_TYPE.equals(mimeType)) {
-                for (ValuesDelta valuesDelta : kindSectionData.getValuesDeltas()) {
-                    addNameEditorViews(kindSectionData.getAccountType(),
-                            valuesDelta, kindSectionData.getRawContactDelta());
-                }
+                addNameEditorViews(kindSectionData.getAccountType(),
+                        primaryValuesDelta, kindSectionData.getRawContactDelta());
             } else if (GroupMembership.CONTENT_ITEM_TYPE.equals(mimeType)) {
                 addGroupEditorView(kindSectionData.getRawContactDelta(),
                         kindSectionData.getDataKind());
             } else {
                 final Editor.EditorListener editorListener;
-                if (Nickname.CONTENT_ITEM_TYPE.equals(kindSectionData.getDataKind().mimeType)) {
+                if (Nickname.CONTENT_ITEM_TYPE.equals(mimeType)) {
                     editorListener = new OtherNameKindEditorListener();
-                } else if (Event.CONTENT_ITEM_TYPE.equals(kindSectionData.getDataKind().mimeType)) {
+                } else if (Event.CONTENT_ITEM_TYPE.equals(mimeType)) {
                     editorListener = new EventEditorListener();
                 } else {
                     editorListener = new NonNameEditorListener();
@@ -346,6 +343,24 @@
         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;
         }
 
@@ -360,7 +375,7 @@
         nameView.setDeletable(false);
         nameView.setValues(
                 accountType.getKindForMimetype(DataKind.PSEUDO_MIME_TYPE_DISPLAY_NAME),
-                valuesDelta, rawContactDelta, readOnly, mViewIdGenerator);
+                valuesDelta, rawContactDelta, /* readOnly =*/ false, mViewIdGenerator);
 
         // Correct start margin since there is a second icon in the structured name layout
         nameView.findViewById(R.id.kind_icon).setVisibility(View.GONE);
@@ -373,7 +388,7 @@
         phoneticNameView.setDeletable(false);
         phoneticNameView.setValues(
                 accountType.getKindForMimetype(DataKind.PSEUDO_MIME_TYPE_PHONETIC_NAME),
-                valuesDelta, rawContactDelta, readOnly, mViewIdGenerator);
+                valuesDelta, rawContactDelta, /* readOnly =*/ false, mViewIdGenerator);
 
         // Fix the start margin for phonetic name views
         final LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams(
diff --git a/src/com/android/contacts/editor/CompactRawContactsEditorView.java b/src/com/android/contacts/editor/CompactRawContactsEditorView.java
index 900889e..b935f46 100644
--- a/src/com/android/contacts/editor/CompactRawContactsEditorView.java
+++ b/src/com/android/contacts/editor/CompactRawContactsEditorView.java
@@ -286,56 +286,6 @@
         }
     }
 
-    /**
-     * Sorts primary account names first, followed by google account types, and other account
-     * types last.  For names from the same account we order structured names before nicknames,
-     * but still keep names from the same account together.
-     */
-    private static final class NameEditorComparator implements Comparator<KindSectionData> {
-
-        private final RawContactDeltaComparator mRawContactDeltaComparator;
-        private final MimeTypeComparator mMimeTypeComparator;
-        private final RawContactDelta mPrimaryRawContactDelta;
-
-        private NameEditorComparator(Context context, RawContactDelta primaryRawContactDelta) {
-            mRawContactDeltaComparator = new RawContactDeltaComparator(context);
-            mMimeTypeComparator = new MimeTypeComparator();
-            mPrimaryRawContactDelta = primaryRawContactDelta;
-        }
-
-        @Override
-        public int compare(KindSectionData kindSectionData1, KindSectionData kindSectionData2) {
-            if (kindSectionData1 == kindSectionData2) return 0;
-            if (kindSectionData1 == null) return -1;
-            if (kindSectionData2 == null) return 1;
-
-            final RawContactDelta rawContactDelta1 = kindSectionData1.getRawContactDelta();
-            final RawContactDelta rawContactDelta2 = kindSectionData2.getRawContactDelta();
-
-            if (rawContactDelta1 == rawContactDelta2) return 0;
-            if (rawContactDelta1 == null) return -1;
-            if (rawContactDelta2 == null) return 1;
-
-            final boolean isRawContactDelta1Primary =
-                mPrimaryRawContactDelta.equals(rawContactDelta1);
-            final boolean isRawContactDelta2Primary =
-                mPrimaryRawContactDelta.equals(rawContactDelta2);
-
-            // If both names are from the primary account, sort my by mime type
-            if (isRawContactDelta1Primary && isRawContactDelta2Primary) {
-                final String mimeType1 = kindSectionData1.getDataKind().mimeType;
-                final String mimeType2 = kindSectionData2.getDataKind().mimeType;
-                return mMimeTypeComparator.compare(mimeType1, mimeType2);
-            }
-
-            // The primary account name should be before all others
-            if (isRawContactDelta1Primary) return -1;
-            if (isRawContactDelta2Primary) return 1;
-
-           return mRawContactDeltaComparator.compare(rawContactDelta1, rawContactDelta2);
-        }
-    }
-
     public static class SavedState extends BaseSavedState {
 
         public static final Parcelable.Creator<SavedState> CREATOR =
@@ -373,12 +323,11 @@
 
     private ViewIdGenerator mViewIdGenerator;
     private MaterialColorMapUtils.MaterialPalette mMaterialPalette;
-    private long mPhotoId;
+    private long mPhotoId = -1;
     private String mReadOnlyDisplayName;
     private boolean mHasNewContact;
     private boolean mIsUserProfile;
     private AccountWithDataSet mPrimaryAccount;
-    private RawContactDelta mPrimaryRawContactDelta;
     private Map<String,KindSectionDataList> mKindSectionDataMap = new HashMap<>();
 
     // Account header
@@ -406,6 +355,8 @@
 
     private long mPhotoRawContactId;
     private ValuesDelta mPhotoValuesDelta;
+
+    private Pair<KindSectionData, ValuesDelta> mPrimaryNameKindSectionData;
     private StructuredNameEditorView mPrimaryNameEditorView;
 
     public CompactRawContactsEditorView(Context context) {
@@ -702,14 +653,21 @@
             if (mListener != null) mListener.onBindEditorsFailed();
             return;
         }
-        mPrimaryRawContactDelta = mKindSectionDataMap.get(StructuredName.CONTENT_ITEM_TYPE)
-                .getEntryToWrite(mPrimaryAccount, mHasNewContact).first.getRawContactDelta();
-        if (mPrimaryRawContactDelta != null) {
-            RawContactModifier.ensureKindExists(mPrimaryRawContactDelta,
-                    mPrimaryRawContactDelta.getAccountType(mAccountTypeManager),
+
+        // Get the primary name kind section data
+        mPrimaryNameKindSectionData = mKindSectionDataMap.get(StructuredName.CONTENT_ITEM_TYPE)
+                .getEntryToWrite(/* id =*/ -1, mPrimaryAccount, mIsUserProfile);
+        if (mPrimaryNameKindSectionData != null) {
+            // Ensure that a structured name and photo exists
+            final RawContactDelta rawContactDelta =
+                    mPrimaryNameKindSectionData.first.getRawContactDelta();
+            RawContactModifier.ensureKindExists(
+                    rawContactDelta,
+                    rawContactDelta.getAccountType(mAccountTypeManager),
                     StructuredName.CONTENT_ITEM_TYPE);
-            RawContactModifier.ensureKindExists(mPrimaryRawContactDelta,
-                    mPrimaryRawContactDelta.getAccountType(mAccountTypeManager),
+            RawContactModifier.ensureKindExists(
+                    rawContactDelta,
+                    rawContactDelta.getAccountType(mAccountTypeManager),
                     Photo.CONTENT_ITEM_TYPE);
         }
 
@@ -774,47 +732,42 @@
     }
 
     private void addAccountInfo(RawContactDeltaList rawContactDeltas) {
-        if (mPrimaryRawContactDelta == null) {
-            mAccountHeaderContainer.setVisibility(View.GONE);
-            mAccountSelectorContainer.setVisibility(View.GONE);
-            return;
-        }
+        mAccountHeaderContainer.setVisibility(View.GONE);
+        mAccountSelectorContainer.setVisibility(View.GONE);
+        mRawContactContainer.setVisibility(View.GONE);
+
+        if (mPrimaryNameKindSectionData == null) return;
+        final RawContactDelta rawContactDelta =
+                mPrimaryNameKindSectionData.first.getRawContactDelta();
 
         // Get the account information for the primary raw contact delta
         final Pair<String,String> accountInfo = mIsUserProfile
                 ? EditorUiUtils.getLocalAccountInfo(getContext(),
-                        mPrimaryRawContactDelta.getAccountName(),
-                        mPrimaryRawContactDelta.getAccountType(mAccountTypeManager))
+                        rawContactDelta.getAccountName(),
+                        rawContactDelta.getAccountType(mAccountTypeManager))
                 : EditorUiUtils.getAccountInfo(getContext(),
-                        mPrimaryRawContactDelta.getAccountName(),
-                        mPrimaryRawContactDelta.getAccountType(mAccountTypeManager));
+                        rawContactDelta.getAccountName(),
+                        rawContactDelta.getAccountType(mAccountTypeManager));
 
-        // The account header and selector show the same information so both shouldn't be visible
-        // at the same time
+        // Only one of the account header, selector, and raw contact selector should be shown
         final List<AccountWithDataSet> accounts =
                 AccountTypeManager.getInstance(getContext()).getAccounts(true);
-        mRawContactContainer.setVisibility(View.GONE);
-        if (mHasNewContact && !mIsUserProfile && accounts.size() > 1) {
-            mAccountHeaderContainer.setVisibility(View.GONE);
-            addAccountSelector(accountInfo);
-        } else if (mHasNewContact && !mIsUserProfile) {
-            addAccountHeader(accountInfo);
-            mAccountSelectorContainer.setVisibility(View.GONE);
-        } else if (rawContactDeltas.size() > 1) {
-            mAccountHeaderContainer.setVisibility(View.GONE);
-            mAccountSelectorContainer.setVisibility(View.GONE);
-            addRawContactAccountSelector(rawContactDeltas);
-        } else {
-            if (mIsUserProfile) {
-                addLocalAccountHeader(accountInfo);
+        if (mHasNewContact && !mIsUserProfile) {
+            if (accounts.size() > 1) {
+                addAccountSelector(accountInfo, rawContactDelta);
             } else {
                 addAccountHeader(accountInfo);
             }
-            mAccountSelectorContainer.setVisibility(View.GONE);
+        } else if (rawContactDeltas.size() > 1) {
+            addRawContactAccountSelector(rawContactDeltas);
+        } else {
+            addAccountHeader(accountInfo);
         }
     }
 
-    private void addLocalAccountHeader(Pair<String,String> accountInfo) {
+    private void addAccountHeader(Pair<String,String> accountInfo) {
+        mAccountHeaderContainer.setVisibility(View.VISIBLE);
+
         // Set the account name
         final String accountName = TextUtils.isEmpty(accountInfo.first)
                 ? accountInfo.second : accountInfo.first;
@@ -827,42 +780,23 @@
         mAccountHeaderType.setText(selectorTitle);
 
         // Set the icon
-        final AccountType primaryAccountType =
-                mPrimaryRawContactDelta.getRawContactAccountType(getContext());
-        mAccountHeaderIcon.setImageDrawable(primaryAccountType.getDisplayIcon(getContext()));
+        if (mPrimaryNameKindSectionData != null) {
+            final RawContactDelta rawContactDelta =
+                    mPrimaryNameKindSectionData.first.getRawContactDelta();
+            if (rawContactDelta != null) {
+                final AccountType accountType =
+                        rawContactDelta.getRawContactAccountType(getContext());
+                mAccountHeaderIcon.setImageDrawable(accountType.getDisplayIcon(getContext()));
+            }
+        }
 
         // Set the content description
         mAccountHeaderContainer.setContentDescription(
                 EditorUiUtils.getAccountInfoContentDescription(accountName, selectorTitle));
     }
 
-    private void addAccountHeader(Pair<String,String> accountInfo) {
-        // Set the account name
-        if (TextUtils.isEmpty(accountInfo.first)) {
-            // Hide this view so the other text view will be centered vertically
-            mAccountHeaderName.setVisibility(View.GONE);
-        } else {
-            mAccountHeaderName.setVisibility(View.VISIBLE);
-            mAccountHeaderName.setText(accountInfo.first);
-        }
-
-        // Set the account type
-        final String selectorTitle = getResources().getString(
-                R.string.compact_editor_account_selector_title);
-        mAccountHeaderType.setText(selectorTitle);
-
-        // Set the icon
-        final AccountType primaryAccountType = mPrimaryRawContactDelta.getRawContactAccountType(
-                getContext());
-        mAccountHeaderIcon.setImageDrawable(primaryAccountType.getDisplayIcon(getContext()));
-
-        // Set the content description
-        mAccountHeaderContainer.setContentDescription(
-                EditorUiUtils.getAccountInfoContentDescription(
-                        accountInfo.first, selectorTitle));
-    }
-
-    private void addAccountSelector(Pair<String,String> accountInfo) {
+    private void addAccountSelector(Pair<String,String> accountInfo,
+            final RawContactDelta rawContactDelta) {
         mAccountSelectorContainer.setVisibility(View.VISIBLE);
 
         if (TextUtils.isEmpty(accountInfo.first)) {
@@ -902,7 +836,7 @@
                         final AccountWithDataSet newAccount = adapter.getItem(position);
                         if (mListener != null && !mPrimaryAccount.equals(newAccount)) {
                             mListener.onRebindEditorsForNewContact(
-                                    mPrimaryRawContactDelta,
+                                    rawContactDelta,
                                     mPrimaryAccount,
                                     newAccount);
                         }
@@ -975,15 +909,15 @@
         mPhotoView.setPhoto(photoToDisplay.second, mMaterialPalette);
 
         // Find the raw contact ID and values delta that will be written when the photo is edited
-        final Pair<KindSectionData,ValuesDelta> photoToWrite = kindSectionDataList.getEntryToWrite(
-                mPrimaryAccount, mHasNewContact);
-        if (photoToWrite == null) {
+        final Pair<KindSectionData, ValuesDelta> pair = kindSectionDataList.getEntryToWrite(
+                mPhotoId, mPrimaryAccount, mIsUserProfile);
+        if (pair == null) {
             mPhotoView.setReadOnly(true);
             return;
         }
         mPhotoView.setReadOnly(false);
-        mPhotoRawContactId = photoToWrite.first.getRawContactDelta().getRawContactId();
-        mPhotoValuesDelta = photoToWrite.second;
+        mPhotoRawContactId = pair.first.getRawContactDelta().getRawContactId();
+        mPhotoValuesDelta = pair.second;
     }
 
     private void addKindSectionViews() {
@@ -998,45 +932,51 @@
             i++;
 
             final String mimeType = entry.getKey();
-            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);
+                if (mPrimaryNameKindSectionData == null) {
+                    vlog("kind: " + i + " " + mimeType + " dropped");
+                    continue;
                 }
-            }
-
-
-            // Ignore mime types that we've already handled
-            if (Photo.CONTENT_ITEM_TYPE.equals(mimeType)) {
-                vlog("kind: " + i + " " + mimeType + " dropped");
-                continue;
-            }
-
-            // Don't show more than one group editor on the compact editor.
-            // Groups will still be editable for each raw contact individually on the full editor.
-            if (GroupMembership.CONTENT_ITEM_TYPE.equals(mimeType)
-                    && kindSectionDataList.size() > 1) {
-                vlog("kind: " + i + " " + mimeType + " dropped");
-                continue;
-            }
-
-            if (kindSectionDataList != null && !kindSectionDataList.isEmpty()) {
-                vlog("kind: " + i + " " + mimeType + ": " + kindSectionDataList.size() +
-                        " kindSectionData(s)");
-
+                vlog("kind: " + i + " " + mimeType + " using first entry only");
+                final KindSectionDataList kindSectionDataList = new KindSectionDataList();
+                kindSectionDataList.add(mPrimaryNameKindSectionData.first);
                 final CompactKindSectionView kindSectionView = inflateKindSectionView(
-                        mKindSectionViews, kindSectionDataList, mimeType);
+                        mKindSectionViews, kindSectionDataList, mimeType,
+                        mPrimaryNameKindSectionData.second);
                 mKindSectionViews.addView(kindSectionView);
 
                 // Keep a pointer to all the KindSectionsViews for each mimeType
                 getKindSectionViews(mimeType).add(kindSectionView);
+            } else {
+                final KindSectionDataList kindSectionDataList = entry.getValue();
+
+                // Ignore mime types that we've already handled
+                if (Photo.CONTENT_ITEM_TYPE.equals(mimeType)) {
+                    vlog("kind: " + i + " " + mimeType + " dropped");
+                    continue;
+                }
+
+                // Don't show more than one group editor on the compact editor.
+                // Groups will still be editable for each raw contact individually on the full editor.
+                if (GroupMembership.CONTENT_ITEM_TYPE.equals(mimeType)
+                        && kindSectionDataList.size() > 1) {
+                    vlog("kind: " + i + " " + mimeType + " dropped");
+                    continue;
+                }
+
+                if (kindSectionDataList != null && !kindSectionDataList.isEmpty()) {
+                    vlog("kind: " + i + " " + mimeType + " " + kindSectionDataList.size() +
+                            " kindSectionData(s)");
+
+                    final CompactKindSectionView kindSectionView = inflateKindSectionView(
+                            mKindSectionViews, kindSectionDataList, mimeType,
+                            /* primaryValueDelta =*/ null);
+                    mKindSectionViews.addView(kindSectionView);
+
+                    // Keep a pointer to all the KindSectionsViews for each mimeType
+                    getKindSectionViews(mimeType).add(kindSectionView);
+                }
             }
         }
     }
@@ -1051,7 +991,8 @@
     }
 
     private CompactKindSectionView inflateKindSectionView(ViewGroup viewGroup,
-            KindSectionDataList kindSectionDataList, String mimeType) {
+            KindSectionDataList kindSectionDataList, String mimeType,
+            ValuesDelta primaryValuesDelta) {
         final CompactKindSectionView kindSectionView = (CompactKindSectionView)
                 mLayoutInflater.inflate(R.layout.compact_item_kind_section, viewGroup,
                         /* attachToRoot =*/ false);
@@ -1068,15 +1009,13 @@
         // they will be the only types you add new values to initially for new contacts
         kindSectionView.setShowOneEmptyEditor(true);
 
-        // Sort so the editors wind up in the order we want
-        if (StructuredName.CONTENT_ITEM_TYPE.equals(mimeType)) {
-            Collections.sort(kindSectionDataList, new NameEditorComparator(getContext(),
-                    mPrimaryRawContactDelta));
-        } else {
+        // Sort non-name editors so they wind up in the order we want
+        if (!StructuredName.CONTENT_ITEM_TYPE.equals(mimeType)) {
             Collections.sort(kindSectionDataList, new EditorComparator(getContext()));
         }
 
-        kindSectionView.setState(kindSectionDataList, mViewIdGenerator, mListener);
+        kindSectionView.setState(kindSectionDataList, mViewIdGenerator, mListener,
+                primaryValuesDelta);
 
         return kindSectionView;
     }
diff --git a/src/com/android/contacts/editor/KindSectionDataList.java b/src/com/android/contacts/editor/KindSectionDataList.java
index 73cd42c..6374740 100644
--- a/src/com/android/contacts/editor/KindSectionDataList.java
+++ b/src/com/android/contacts/editor/KindSectionDataList.java
@@ -20,8 +20,6 @@
 import com.android.contacts.common.model.account.AccountWithDataSet;
 import com.android.contacts.common.model.dataitem.DataKind;
 
-import android.provider.ContactsContract.CommonDataKinds.Nickname;
-import android.provider.ContactsContract.CommonDataKinds.StructuredName;
 import android.util.Log;
 import android.util.Pair;
 
@@ -54,97 +52,121 @@
     }
 
     /**
-     * Returns the "primary" KindSectionData and ValuesDelta that should be written for this List.
+     * Returns the primary KindSectionData and ValuesDelta that should be written for this List.
      */
-    public Pair<KindSectionData,ValuesDelta> getEntryToWrite(AccountWithDataSet primaryAccount,
-            boolean hasNewContact) {
-        // Use the first writable contact that matches the primary account
-        if (primaryAccount != null && !hasNewContact) {
+    public Pair<KindSectionData,ValuesDelta> getEntryToWrite(long id,
+            AccountWithDataSet primaryAccount, boolean isUserProfile) {
+        final String mimeType = getMimeType();
+        if (mimeType == null) return null;
+
+        if (!isUserProfile) {
+            if (id > 0) {
+                // Look for a match for the ID that was passed in
+                for (KindSectionData kindSectionData : this) {
+                    if (kindSectionData.getAccountType().areContactsWritable()) {
+                        final ValuesDelta valuesDelta = kindSectionData.getValuesDeltaById(id);
+                        if (valuesDelta != null) {
+                            vlog(mimeType + ": matched kind section data to write by ID");
+                            return new Pair<>(kindSectionData, valuesDelta);
+                        }
+                    }
+                }
+            }
+
+            // Look for a super primary entry
             for (KindSectionData kindSectionData : this) {
-                if (kindSectionData.getAccountType().areContactsWritable()
-                        && !kindSectionData.getValuesDeltas().isEmpty()) {
-                    if (matchesAccount(primaryAccount, kindSectionData.getRawContactDelta())) {
-                        return new Pair<>(kindSectionData,
-                                kindSectionData.getValuesDeltas().get(0));
+                if (kindSectionData.getAccountType().areContactsWritable()) {
+                    final ValuesDelta valuesDelta = kindSectionData.getSuperPrimaryValuesDelta();
+                    if (valuesDelta != null) {
+                        vlog(mimeType + ": matched kind section data to write by super primary");
+                        return new Pair<>(kindSectionData, valuesDelta);
+                    }
+                }
+            }
+
+            // Use the first writable contact that matches the primary account
+            if (primaryAccount != null) {
+                for (KindSectionData kindSectionData : this) {
+                    if (kindSectionData.getAccountType().areContactsWritable()) {
+                        if (matchesAccount(primaryAccount, kindSectionData.getRawContactDelta())
+                            && !kindSectionData.getValuesDeltas().isEmpty()) {
+                            vlog(mimeType + ": matched kind section data to write by primary " +
+                                    "account");
+                            return new Pair<>(kindSectionData,
+                                    kindSectionData.getValuesDeltas().get(0));
+                        }
                     }
                 }
             }
         }
 
-        // If no writable raw contact matched the primary account, or we're editing a read-only
-        // contact, just return the first writable entry.
+        // Just return the first writable entry.
         for (KindSectionData kindSectionData : this) {
-            if (kindSectionData.getAccountType().areContactsWritable()) {
-                if (!kindSectionData.getValuesDeltas().isEmpty()) {
-                    return new Pair<>(kindSectionData, kindSectionData.getValuesDeltas().get(0));
-                }
+            if (kindSectionData.getAccountType().areContactsWritable()
+                    && !kindSectionData.getValuesDeltas().isEmpty()) {
+                vlog(mimeType + ": falling back to first kind section data to write");
+                return new Pair<>(kindSectionData, kindSectionData.getValuesDeltas().get(0));
             }
         }
 
+        wlog(mimeType+ ": no writable kind section data found");
         return null;
     }
 
     /** Whether the given RawContactDelta belong to the given account. */
     private static boolean matchesAccount(AccountWithDataSet accountWithDataSet,
             RawContactDelta rawContactDelta) {
-        if (accountWithDataSet == null) return false;
         return Objects.equals(accountWithDataSet.name, rawContactDelta.getAccountName())
                 && Objects.equals(accountWithDataSet.type, rawContactDelta.getAccountType())
                 && Objects.equals(accountWithDataSet.dataSet, rawContactDelta.getDataSet());
     }
 
     /**
-     * Returns the "primary" KindSectionData and ValuesDelta that should be displayed to the user.
+     * Returns the KindSectionData and ValuesDelta that should be displayed to the user.
      */
     public Pair<KindSectionData,ValuesDelta> getEntryToDisplay(long id) {
         final String mimeType = getMimeType();
         if (mimeType == null) return null;
 
-        KindSectionData resultKindSectionData = null;
-        ValuesDelta resultValuesDelta = null;
         if (id > 0) {
             // Look for a match for the ID that was passed in
             for (KindSectionData kindSectionData : this) {
-                resultValuesDelta = kindSectionData.getValuesDeltaById(id);
-                if (resultValuesDelta != null) {
-                    vlog(mimeType + ": matched kind section data by ID");
-                    resultKindSectionData = kindSectionData;
-                    break;
+                final ValuesDelta valuesDelta = kindSectionData.getValuesDeltaById(id);
+                if (valuesDelta != null) {
+                    vlog(mimeType + ": matched kind section data to display by ID");
+                    return new Pair<>(kindSectionData, valuesDelta);
                 }
             }
         }
-        if (resultKindSectionData == null) {
-            // Look for a super primary entry
-            for (KindSectionData kindSectionData : this) {
-                resultValuesDelta = kindSectionData.getSuperPrimaryValuesDelta();
-                if (resultValuesDelta != null) {
-                    vlog(mimeType + ": matched super primary kind section data");
-                    resultKindSectionData = kindSectionData;
-                    break;
+        // Look for a super primary entry
+        for (KindSectionData kindSectionData : this) {
+            final ValuesDelta valuesDelta = kindSectionData.getSuperPrimaryValuesDelta();
+                if (valuesDelta != null) {
+                    vlog(mimeType + ": matched kind section data to display by super primary");
+                    return new Pair<>(kindSectionData, valuesDelta);
                 }
+        }
+
+        // Fall back to the first non-empty value
+        for (KindSectionData kindSectionData : this) {
+            final ValuesDelta valuesDelta = kindSectionData.getFirstNonEmptyValuesDelta();
+            if (valuesDelta != null) {
+                vlog(mimeType + ": using first non empty value to display");
+                return new Pair<>(kindSectionData, valuesDelta);
             }
         }
-        if (resultKindSectionData == null) {
-            // Fall back to the first non-empty value
-            for (KindSectionData kindSectionData : this) {
-                resultValuesDelta = kindSectionData.getFirstNonEmptyValuesDelta();
-                if (resultValuesDelta != null) {
-                    vlog(mimeType + ": using first non empty value");
-                    resultKindSectionData = kindSectionData;
-                    break;
-                }
-            }
-        }
-        if (resultKindSectionData == null || resultValuesDelta == null) {
-            final List<ValuesDelta> valuesDeltaList = get(0).getValuesDeltas();
+
+        for (KindSectionData kindSectionData : this) {
+            final List<ValuesDelta> valuesDeltaList = kindSectionData.getValuesDeltas();
             if (valuesDeltaList != null && !valuesDeltaList.isEmpty()) {
-                vlog(mimeType + ": falling back to first empty entry");
-                resultValuesDelta = valuesDeltaList.get(0);
-                resultKindSectionData = get(0);
+                vlog(mimeType + ": falling back to first empty entry to display");
+                final ValuesDelta valuesDelta = valuesDeltaList.get(0);
+                return new Pair<>(kindSectionData, valuesDelta);
             }
         }
-        return resultKindSectionData != null && resultValuesDelta != null
-                ? new Pair<>(resultKindSectionData, resultValuesDelta) : null;
+
+        wlog(mimeType + ": no kind section data found to display");
+        return null;
     }
 
     @Override
@@ -163,6 +185,12 @@
         return super.add(kindSectionData);
     }
 
+    private static void wlog(String message) {
+        if (Log.isLoggable(TAG, Log.WARN)) {
+            Log.w(TAG, message);
+        }
+    }
+
     private static void vlog(String message) {
         if (Log.isLoggable(TAG, Log.VERBOSE)) {
             Log.v(TAG, message);
