diff --git a/src/com/android/contacts/editor/CompactContactEditorFragment.java b/src/com/android/contacts/editor/CompactContactEditorFragment.java
index 89c7521..8294365 100644
--- a/src/com/android/contacts/editor/CompactContactEditorFragment.java
+++ b/src/com/android/contacts/editor/CompactContactEditorFragment.java
@@ -95,9 +95,6 @@
 
     @Override
     protected boolean doSaveAction(int saveMode) {
-        // Store account as default account, only if this is a new contact
-        saveDefaultAccountIfNecessary();
-
         // Save contact
         final Intent intent = ContactSaveService.createSaveContactIntent(mContext, mState,
                 SAVE_MODE_EXTRA_KEY, saveMode, isEditingUserProfile(),
diff --git a/src/com/android/contacts/editor/CompactRawContactsEditorView.java b/src/com/android/contacts/editor/CompactRawContactsEditorView.java
index cbe2ee4..d8dea60 100644
--- a/src/com/android/contacts/editor/CompactRawContactsEditorView.java
+++ b/src/com/android/contacts/editor/CompactRawContactsEditorView.java
@@ -20,6 +20,7 @@
 import com.android.contacts.common.model.AccountTypeManager;
 import com.android.contacts.common.model.RawContactDelta;
 import com.android.contacts.common.model.RawContactDeltaList;
+import com.android.contacts.common.model.RawContactModifier;
 import com.android.contacts.common.model.ValuesDelta;
 import com.android.contacts.common.model.account.AccountType;
 import com.android.contacts.common.model.account.AccountType.EditField;
@@ -119,20 +120,30 @@
         }
 
         mViewIdGenerator = viewIdGenerator;
-
         setId(mViewIdGenerator.getId(rawContactDeltas.get(0), /* dataKind =*/ null,
                 /* valuesDelta =*/ null, ViewIdGenerator.NO_VIEW_INDEX));
 
-        addEditorViews(rawContactDeltas);
-        removeExtraEmptyStructuredNames();
+        addEditorViews(rawContactDeltas, viewIdGenerator);
+        removeExtraEmptyTextFields(mNames);
+        removeExtraEmptyTextFields(mPhoneNumbers);
+        removeExtraEmptyTextFields(mEmails);
     }
 
-    private void addEditorViews(RawContactDeltaList rawContactDeltas) {
+    private void addEditorViews(RawContactDeltaList rawContactDeltas,
+            ViewIdGenerator viewIdGenerator) {
         for (RawContactDelta rawContactDelta : rawContactDeltas) {
             if (!rawContactDelta.isVisible()) {
                 continue;
             }
+            setId(viewIdGenerator.getId(
+                    rawContactDelta, null, null, ViewIdGenerator.NO_VIEW_INDEX));
+
             final AccountType accountType = rawContactDelta.getAccountType(mAccountTypeManager);
+
+            // Make sure we have a StructuredName
+            RawContactModifier.ensureKindExists(
+                    rawContactDelta, accountType, StructuredName.CONTENT_ITEM_TYPE);
+
             for (DataKind dataKind : accountType.getSortedDataKinds()) {
                 if (!dataKind.editable) {
                     continue;
@@ -164,15 +175,11 @@
                                 mNicknames, dataKind, rawContactDelta));
                     }
                 } else if (Phone.CONTENT_ITEM_TYPE.equals(mimeType)) {
-                    if (hasNonEmptyValuesDelta(rawContactDelta, mimeType, dataKind)) {
-                        mPhoneNumbers.addView(inflateKindSectionView(
-                                mPhoneNumbers, dataKind, rawContactDelta));
-                    }
+                    mPhoneNumbers.addView(inflateKindSectionView(
+                            mPhoneNumbers, dataKind, rawContactDelta));
                 } else if (Email.CONTENT_ITEM_TYPE.equals(mimeType)) {
-                    if (hasNonEmptyValuesDelta(rawContactDelta, mimeType, dataKind)) {
-                        mEmails.addView(inflateKindSectionView(
-                                mEmails, dataKind, rawContactDelta));
-                    }
+                    mEmails.addView(inflateKindSectionView(
+                            mEmails, dataKind, rawContactDelta));
                 } else if (hasNonEmptyValuesDelta(rawContactDelta, mimeType, dataKind)) {
                     mOther.addView(inflateKindSectionView(
                             mOther, dataKind, rawContactDelta));
@@ -181,40 +188,48 @@
         }
     }
 
-    private void removeExtraEmptyStructuredNames() {
-        // If there is one (or less) structured names, leave it whether it is empty or not
-        if (mNames.getChildCount() <= 1) {
+    // TODO: avoid inflating extra views and deleting them
+    private void removeExtraEmptyTextFields(ViewGroup viewGroup) {
+        // If there is one (or less) editors, leave it whether it is empty or not
+        if (viewGroup.getChildCount() <= 1) {
             return;
         }
-        // Determine if there are any non-empty names
-        boolean hasAtLeastOneNonEmptyName = false;
-        for (int i = 0; i < mNames.getChildCount(); i++) {
-            final StructuredNameEditorView childView =
-                    (StructuredNameEditorView) mNames.getChildAt(i);
-            if (!childView.isEmpty()) {
-                hasAtLeastOneNonEmptyName = true;
+        // Determine if there are any non-empty editors
+        boolean hasAtLeastOneNonEmptyEditorView = false;
+        for (int i = 0; i < viewGroup.getChildCount(); i++) {
+            if (!isEmptyEditorView(viewGroup.getChildAt(i))) {
+                hasAtLeastOneNonEmptyEditorView = true;
                 break;
             }
         }
-        if (hasAtLeastOneNonEmptyName) {
-            // There is at least one non-empty name, remove all the empty ones
-            for (int i = 0; i < mNames.getChildCount(); i++) {
-                final StructuredNameEditorView childView =
-                        (StructuredNameEditorView) mNames.getChildAt(i);
-                if (childView.isEmpty()) {
-                    childView.setVisibility(View.GONE);
+        if (hasAtLeastOneNonEmptyEditorView) {
+            // There is at least one non-empty editor, remove all the empty ones
+            for (int i = 0; i < viewGroup.getChildCount(); i++) {
+                if (isEmptyEditorView(viewGroup.getChildAt(i))) {
+                    viewGroup.getChildAt(i).setVisibility(View.GONE);
                 }
             }
         } else {
-            // There is no non-empty name, keep the first empty view and remove the rest
-            for (int i = 1; i < mNames.getChildCount(); i++) {
-                final StructuredNameEditorView childView =
-                        (StructuredNameEditorView) mNames.getChildAt(i);
-                childView.setVisibility(View.GONE);
+            // There is no non-empty editor, keep the first empty view and remove the rest
+            for (int i = 1; i < viewGroup.getChildCount(); i++) {
+                viewGroup.getChildAt(i).setVisibility(View.GONE);
             }
         }
     }
 
+    // TODO: remove this after KindSectionView is rewritten
+    private static boolean isEmptyEditorView(View view) {
+        if (view instanceof TextFieldsEditorView) {
+            final TextFieldsEditorView textFieldsEditorView = (TextFieldsEditorView) view;
+            return textFieldsEditorView.isEmpty();
+        }
+        if (view instanceof KindSectionView) {
+            final KindSectionView kindSectionView = (KindSectionView) view;
+            return kindSectionView.hasEmptyEditor();
+        }
+        return false;
+    }
+
     private static boolean hasNonEmptyValuesDelta(RawContactDelta rawContactDelta,
             String mimeType, DataKind dataKind) {
         return !getNonEmptyValuesDeltas(rawContactDelta, mimeType, dataKind).isEmpty();
diff --git a/src/com/android/contacts/editor/ContactEditorBaseFragment.java b/src/com/android/contacts/editor/ContactEditorBaseFragment.java
index 6961c4c..03ac880 100644
--- a/src/com/android/contacts/editor/ContactEditorBaseFragment.java
+++ b/src/com/android/contacts/editor/ContactEditorBaseFragment.java
@@ -876,6 +876,9 @@
 
         setEnabled(false);
 
+        // Store account as default account, only if this is a new contact
+        saveDefaultAccountIfNecessary();
+
         return doSaveAction(saveMode);
     }
 
@@ -1065,14 +1068,56 @@
     protected void setStateForNewContact(AccountWithDataSet account, AccountType accountType,
             RawContactDelta oldState, AccountType oldAccountType) {
         mStatus = Status.EDITING;
-        mState.add(createNewRawContactDelta(mContext, mIntentExtras, account, accountType,
-                mIsUserProfile, oldState, oldAccountType));
+        mState.add(createNewRawContactDelta(account, accountType, oldState, oldAccountType));
         mRequestFocus = true;
         mNewContactDataReady = true;
         bindEditors();
     }
 
     /**
+     * Returns a {@link RawContactDelta} for a new contact suitable for addition into
+     * {@link #mState}.
+     *
+     * If oldState and oldAccountType are specified, the state specified by those parameters
+     * is migrated to the result {@link RawContactDelta}.
+     */
+    private RawContactDelta createNewRawContactDelta(AccountWithDataSet account,
+            AccountType accountType, RawContactDelta oldState, AccountType oldAccountType) {
+        final RawContact rawContact = new RawContact();
+        if (account != null) {
+            rawContact.setAccount(account);
+        } else {
+            rawContact.setAccountToLocal();
+        }
+
+        final RawContactDelta result = new RawContactDelta(
+                ValuesDelta.fromAfter(rawContact.getValues()));
+        if (oldState == null) {
+            // Parse any values from incoming intent
+            RawContactModifier.parseExtras(mContext, accountType, result, mIntentExtras);
+        } else {
+            RawContactModifier.migrateStateForNewContact(
+                    mContext, oldState, result, oldAccountType, accountType);
+        }
+
+        // Ensure we have some default fields (if the account type does not support a field,
+        // ensureKind will not add it, so it is safe to add e.g. Event)
+        RawContactModifier.ensureKindExists(result, accountType, Phone.CONTENT_ITEM_TYPE);
+        RawContactModifier.ensureKindExists(result, accountType, Email.CONTENT_ITEM_TYPE);
+        RawContactModifier.ensureKindExists(result, accountType, Organization.CONTENT_ITEM_TYPE);
+        RawContactModifier.ensureKindExists(result, accountType, Event.CONTENT_ITEM_TYPE);
+        RawContactModifier.ensureKindExists(result, accountType,
+                StructuredPostal.CONTENT_ITEM_TYPE);
+
+        // Set the correct URI for saving the contact as a profile
+        if (mNewLocalProfile) {
+            result.setProfileQueryUri();
+        }
+
+        return result;
+    }
+
+    /**
      * Prepare {@link #mState} for an existing contact.
      */
     protected void setStateForExistingContact(String displayName, boolean isUserProfile,
@@ -1108,6 +1153,21 @@
     }
 
     /**
+     * Returns a {@link RawContactDelta} for a local contact suitable for addition into
+     * {@link #mState}.
+     */
+    private static RawContactDelta createLocalRawContactDelta() {
+        final RawContact rawContact = new RawContact();
+        rawContact.setAccountToLocal();
+
+        final RawContactDelta result = new RawContactDelta(
+                ValuesDelta.fromAfter(rawContact.getValues()));
+        result.setProfileQueryUri();
+
+        return result;
+    }
+
+    /**
      * Sets group metadata on all bound editors.
      */
     abstract protected void setGroupMetaData();
@@ -1215,7 +1275,7 @@
                 if (saveSucceeded && contactLookupUri != null) {
                     final Uri lookupUri = maybeConvertToLegacyLookupUri(
                             mContext, contactLookupUri, mLookupUri);
-                    resultIntent = composeQuickContactsIntent(mContext, lookupUri);
+                    resultIntent = composeQuickContactsIntent(lookupUri);
                 } else {
                     resultIntent = null;
                 }
@@ -1480,7 +1540,7 @@
      * Creates the result Intent for the given contactLookupUri that should started after a
      * successful saving a contact.
      */
-    protected static Intent composeQuickContactsIntent(Context context, Uri contactLookupUri) {
+    protected static Intent composeQuickContactsIntent(Uri contactLookupUri) {
         final Intent intent = new Intent(QuickContact.ACTION_QUICK_CONTACT);
         intent.setData(contactLookupUri);
         intent.putExtra(QuickContact.EXTRA_MODE, QuickContactActivity.MODE_FULLY_EXPANDED);
@@ -1488,59 +1548,4 @@
         intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
         return intent;
     }
-
-    /**
-     * Returns a {@link RawContactDelta} for a new contact suitable for addition into
-     * {@link #mState}.
-     *
-     * If oldState and oldAccountType are specified, the state specified by those parameters
-     * is migrated to the result {@link RawContactDelta}.
-     */
-    private static RawContactDelta createNewRawContactDelta(Context context, Bundle intentExtras,
-            AccountWithDataSet account, AccountType accountType, boolean isNewLocalProfile,
-            RawContactDelta oldState, AccountType oldAccountType) {
-        final RawContact rawContact = new RawContact();
-        rawContact.setAccount(account);
-
-        final RawContactDelta result = new RawContactDelta(
-                ValuesDelta.fromAfter(rawContact.getValues()));
-        if (oldState == null) {
-            // Parse any values from incoming intent
-            RawContactModifier.parseExtras(context, accountType, result, intentExtras);
-        } else {
-            RawContactModifier.migrateStateForNewContact(
-                    context, oldState, result, oldAccountType, accountType);
-        }
-
-        // Ensure we have some default fields (if the account type does not support a field,
-        // ensureKind will not add it, so it is safe to add e.g. Event)
-        RawContactModifier.ensureKindExists(result, accountType, Phone.CONTENT_ITEM_TYPE);
-        RawContactModifier.ensureKindExists(result, accountType, Email.CONTENT_ITEM_TYPE);
-        RawContactModifier.ensureKindExists(result, accountType, Organization.CONTENT_ITEM_TYPE);
-        RawContactModifier.ensureKindExists(result, accountType, Event.CONTENT_ITEM_TYPE);
-        RawContactModifier.ensureKindExists(result, accountType,
-                StructuredPostal.CONTENT_ITEM_TYPE);
-
-        // Set the correct URI for saving the contact as a profile
-        if (isNewLocalProfile) {
-            result.setProfileQueryUri();
-        }
-
-        return result;
-    }
-
-    /**
-     * Returns a {@link RawContactDelta} for a local contact suitable for addition into
-     * {@link #mState}.
-     */
-    private static RawContactDelta createLocalRawContactDelta() {
-        final RawContact rawContact = new RawContact();
-        rawContact.setAccountToLocal();
-
-        final RawContactDelta result = new RawContactDelta(
-                ValuesDelta.fromAfter(rawContact.getValues()));
-        result.setProfileQueryUri();
-
-        return result;
-    }
 }
diff --git a/src/com/android/contacts/editor/ContactEditorFragment.java b/src/com/android/contacts/editor/ContactEditorFragment.java
index 236c977..5bc868a 100644
--- a/src/com/android/contacts/editor/ContactEditorFragment.java
+++ b/src/com/android/contacts/editor/ContactEditorFragment.java
@@ -418,9 +418,6 @@
 
     @Override
     protected boolean doSaveAction(int saveMode) {
-        // Store account as default account, only if this is a new contact
-        saveDefaultAccountIfNecessary();
-
         // Save contact
         Intent intent = ContactSaveService.createSaveContactIntent(mContext, mState,
                 SAVE_MODE_EXTRA_KEY, saveMode, isEditingUserProfile(),
diff --git a/src/com/android/contacts/editor/KindSectionView.java b/src/com/android/contacts/editor/KindSectionView.java
index dbcb9d5..5a5a51d 100644
--- a/src/com/android/contacts/editor/KindSectionView.java
+++ b/src/com/android/contacts/editor/KindSectionView.java
@@ -261,6 +261,13 @@
     }
 
     /**
+     * Whether this section has any empty editors.
+     */
+    public boolean hasEmptyEditor() {
+        return !getEmptyEditors().isEmpty();
+    }
+
+    /**
      * Returns a list of empty editor views in this section.
      */
     private List<View> getEmptyEditors() {
