diff --git a/src/com/android/contacts/ui/widget/AggregationSuggestionView.java b/src/com/android/contacts/ui/widget/AggregationSuggestionView.java
index e03f78b..04e5827 100644
--- a/src/com/android/contacts/ui/widget/AggregationSuggestionView.java
+++ b/src/com/android/contacts/ui/widget/AggregationSuggestionView.java
@@ -62,7 +62,7 @@
         super(context, attrs, defStyle);
     }
 
-    public void bindSuggestion(Suggestion suggestion, boolean showJoinButton) {
+    public void bindSuggestion(Suggestion suggestion) {
         mContactId = suggestion.contactId;
         mRawContactIds = suggestion.rawContactIds;
         ImageView photo = (ImageView) findViewById(R.id.aggregation_suggestion_photo);
@@ -88,12 +88,8 @@
         data.setText(dataText);
 
         Button join = (Button) findViewById(R.id.aggregation_suggestion_join_button);
-        if (showJoinButton) {
-            join.setOnClickListener(this);
-            join.setVisibility(View.VISIBLE);
-        } else {
-            join.setVisibility(View.INVISIBLE);
-        }
+        join.setOnClickListener(this);
+        join.setVisibility(View.VISIBLE);
     }
 
     public void setListener(Listener listener) {
diff --git a/src/com/android/contacts/views/editor/AggregationSuggestionEngine.java b/src/com/android/contacts/views/editor/AggregationSuggestionEngine.java
index 3943816..bf1f7ac 100644
--- a/src/com/android/contacts/views/editor/AggregationSuggestionEngine.java
+++ b/src/com/android/contacts/views/editor/AggregationSuggestionEngine.java
@@ -48,6 +48,7 @@
 public class AggregationSuggestionEngine extends HandlerThread {
     public static final String TAG = "AggregationSuggestionEngine";
 
+    private static final int MESSAGE_RESET = 0;
     private static final int MESSAGE_NAME_CHANGE = 1;
     private static final int MESSAGE_DATA_CURSOR = 2;
 
@@ -127,6 +128,12 @@
         return super.quit();
     }
 
+    public void reset() {
+        Handler handler = getHandler();
+        handler.removeMessages(MESSAGE_NAME_CHANGE);
+        handler.sendEmptyMessage(MESSAGE_RESET);
+    }
+
     public void onNameChange(ValuesDelta values) {
         Handler handler = getHandler();
         handler.removeMessages(MESSAGE_NAME_CHANGE);
@@ -188,7 +195,10 @@
     }
 
     protected void handleMessage(Message msg) {
-        switch(msg.what) {
+        switch (msg.what) {
+            case MESSAGE_RESET:
+                mSuggestedContactIds = new long[0];
+                break;
             case MESSAGE_NAME_CHANGE:
                 loadAggregationSuggestions((Uri) msg.obj);
                 break;
@@ -301,7 +311,7 @@
     }
 
     public int getSuggestedContactCount() {
-        return mSuggestedContactIds.length;
+        return mDataCursor != null ? mDataCursor.getCount() : 0;
     }
 
     public List<Suggestion> getSuggestions() {
diff --git a/src/com/android/contacts/views/editor/ContactEditorFragment.java b/src/com/android/contacts/views/editor/ContactEditorFragment.java
index f19feb3..366aadc 100644
--- a/src/com/android/contacts/views/editor/ContactEditorFragment.java
+++ b/src/com/android/contacts/views/editor/ContactEditorFragment.java
@@ -38,7 +38,6 @@
 import com.android.contacts.views.ContactLoader;
 import com.android.contacts.views.GroupMetaDataLoader;
 import com.android.contacts.views.editor.AggregationSuggestionEngine.Suggestion;
-import com.google.android.collect.Lists;
 
 import android.accounts.Account;
 import android.app.Activity;
@@ -60,7 +59,6 @@
 import android.content.Loader;
 import android.content.OperationApplicationException;
 import android.database.Cursor;
-import android.database.DatabaseUtils;
 import android.graphics.Bitmap;
 import android.graphics.Rect;
 import android.media.MediaScannerConnection;
@@ -75,7 +73,6 @@
 import android.provider.ContactsContract.CommonDataKinds.Phone;
 import android.provider.ContactsContract.CommonDataKinds.StructuredName;
 import android.provider.ContactsContract.Contacts;
-import android.provider.ContactsContract.Groups;
 import android.provider.ContactsContract.RawContacts;
 import android.provider.MediaStore;
 import android.text.TextUtils;
@@ -119,6 +116,7 @@
     private static final String KEY_CURRENT_PHOTO_FILE = "currentphotofile";
     private static final String KEY_QUERY_SELECTION = "queryselection";
     private static final String KEY_CONTACT_ID_FOR_JOIN = "contactidforjoin";
+    private static final String KEY_SHOW_JOIN_SUGGESTIONS = "showJoinSuggestions";
 
     /**
      * Modes that specify what the AsyncTask has to perform after saving
@@ -219,6 +217,8 @@
     private int mStatus;
 
     private AggregationSuggestionEngine mAggregationSuggestionEngine;
+    private long mAggregationSuggestionsRawContactId;
+    private View mAggregationSuggestionView;
 
     public ContactEditorFragment() {
     }
@@ -322,6 +322,7 @@
             }
             mQuerySelection = savedState.getString(KEY_QUERY_SELECTION);
             mContactIdForJoin = savedState.getLong(KEY_CONTACT_ID_FOR_JOIN);
+            mAggregationSuggestionsRawContactId = savedState.getLong(KEY_SHOW_JOIN_SUGGESTIONS);
             mStatus = Status.EDITING;
         }
     }
@@ -496,10 +497,7 @@
                     }
                 });
 
-                // If the user has already decided to join with a specific contact,
-                // trigger a refresh of the aggregation suggestion view to redisplay
-                // the selection.
-                if (mContactIdForJoin != 0) {
+                if (rawContactId == mAggregationSuggestionsRawContactId) {
                     acquireAggregationSuggestions(rawContactEditor);
                 }
             }
@@ -1135,6 +1133,16 @@
      * Triggers an asynchronous search for aggregation suggestions.
      */
     public void acquireAggregationSuggestions(ContactEditorView rawContactEditor) {
+        long rawContactId = rawContactEditor.getRawContactId();
+        if (mAggregationSuggestionsRawContactId != rawContactId
+                && mAggregationSuggestionView != null) {
+            mAggregationSuggestionView.setVisibility(View.GONE);
+            mAggregationSuggestionView = null;
+            mAggregationSuggestionEngine.reset();
+        }
+
+        mAggregationSuggestionsRawContactId = rawContactId;
+
         if (mAggregationSuggestionEngine == null) {
             mAggregationSuggestionEngine = new AggregationSuggestionEngine(getActivity());
             mAggregationSuggestionEngine.setContactId(getContactId());
@@ -1148,68 +1156,35 @@
 
     @Override
     public void onAggregationSuggestionChange() {
-        // We may have chosen some contact to join with but then changed the contact name.
-        // Let's drop the obsolete decision to join.
-        setSelectedAggregationSuggestion(0, null);
-        updateAggregationSuggestionView();
-    }
-
-    protected void updateAggregationSuggestionView() {
-        ViewStub stub = (ViewStub)mContent.findViewById(R.id.aggregation_suggestion_stub);
-        if (stub != null) {
-            stub.inflate();
-            final View view = mContent.findViewById(R.id.aggregation_suggestion);
-            mContent.postDelayed(new Runnable() {
-
-                @Override
-                public void run() {
-                    requestAggregationSuggestionOnScreen(view);
-                }
-            }, AGGREGATION_SUGGESTION_SCROLL_DELAY);
-        }
-
-        View view = mContent.findViewById(R.id.aggregation_suggestion);
-
-        List<Suggestion> suggestions = null;
-        int count = mAggregationSuggestionEngine.getSuggestedContactCount();
-        if (count > 0) {
-            suggestions = mAggregationSuggestionEngine.getSuggestions();
-
-            if (mContactIdForJoin != 0) {
-                Suggestion chosenSuggestion = null;
-                for (Suggestion suggestion : suggestions) {
-                    if (suggestion.contactId == mContactIdForJoin) {
-                        chosenSuggestion = suggestion;
-                        break;
-                    }
-                }
-
-                if (chosenSuggestion != null) {
-                    suggestions = Lists.newArrayList(chosenSuggestion);
-                } else {
-                    // If the contact we wanted to join with is no longer suggested,
-                    // forget our decision to join with it.
-                    setSelectedAggregationSuggestion(0, null);
-                }
-            }
-
-            count = suggestions.size();
-        }
-
-        if (count == 0) {
-            view.setVisibility(View.GONE);
+        View rawContactView = getContactEditorView(mAggregationSuggestionsRawContactId);
+        if (rawContactView == null) {
             return;
         }
 
-        TextView title = (TextView) view.findViewById(R.id.aggregation_suggestion_title);
-        if (mContactIdForJoin != 0) {
-            title.setText(R.string.aggregation_suggestion_joined_title);
-        } else {
-            title.setText(getActivity().getResources().getQuantityString(
-                    R.plurals.aggregation_suggestion_title, count));
+        ViewStub stub = (ViewStub)rawContactView.findViewById(R.id.aggregation_suggestion_stub);
+        if (stub != null) {
+            stub.inflate();
         }
 
-        LinearLayout itemList = (LinearLayout) view.findViewById(R.id.aggregation_suggestions);
+        // Only request the view on screen when it is first displayed
+        boolean requestOnScreen = mAggregationSuggestionView == null;
+        mAggregationSuggestionView = rawContactView.findViewById(R.id.aggregation_suggestion);
+
+        int count = mAggregationSuggestionEngine.getSuggestedContactCount();
+        if (count == 0) {
+            mAggregationSuggestionView.setVisibility(View.GONE);
+            return;
+        }
+
+        List<Suggestion> suggestions = mAggregationSuggestionEngine.getSuggestions();
+
+        TextView title = (TextView) mAggregationSuggestionView.findViewById(
+                R.id.aggregation_suggestion_title);
+        title.setText(getActivity().getResources().getQuantityString(
+                R.plurals.aggregation_suggestion_title, count));
+
+        LinearLayout itemList = (LinearLayout) mAggregationSuggestionView.findViewById(
+                R.id.aggregation_suggestions);
         itemList.removeAllViews();
 
         LayoutInflater inflater = getActivity().getLayoutInflater();
@@ -1228,18 +1203,24 @@
                     mState.setJoinWithRawContacts(rawContactIds);
                     // If we are in the edit mode (indicated by a non-zero contact ID),
                     // join the suggested contact, save all changes, and stay in the editor.
-                    if (getContactId() != 0) {
-                        doSaveAction(SaveMode.RELOAD);
-                    } else {
-                        mContactIdForJoin = contactId;
-                        updateAggregationSuggestionView();
-                    }
+                    doSaveAction(SaveMode.RELOAD);
                 }
             });
-            suggestionView.bindSuggestion(suggestion, mContactIdForJoin == 0 /* showJoinButton */);
+            suggestionView.bindSuggestion(suggestion);
             itemList.addView(suggestionView);
         }
-        view.setVisibility(View.VISIBLE);
+
+        mAggregationSuggestionView.setVisibility(View.VISIBLE);
+
+        if (requestOnScreen) {
+            mContent.postDelayed(new Runnable() {
+
+                @Override
+                public void run() {
+                    requestAggregationSuggestionOnScreen(mAggregationSuggestionView);
+                }
+            }, AGGREGATION_SUGGESTION_SCROLL_DELAY);
+        }
     }
 
     /**
@@ -1271,11 +1252,6 @@
         return rect;
     }
 
-    protected void setSelectedAggregationSuggestion(long contactId, List<Long> rawContactIds) {
-        mContactIdForJoin = contactId;
-        mState.setJoinWithRawContacts(rawContactIds);
-    }
-
     // TODO: There has to be a nicer way than this WeakAsyncTask...? Maybe call a service?
     /**
      * Background task for persisting edited contact data, using the changes
@@ -1437,6 +1413,7 @@
         }
         outState.putString(KEY_QUERY_SELECTION, mQuerySelection);
         outState.putLong(KEY_CONTACT_ID_FOR_JOIN, mContactIdForJoin);
+        outState.putLong(KEY_SHOW_JOIN_SUGGESTIONS, mAggregationSuggestionsRawContactId);
         super.onSaveInstanceState(outState);
     }
 
@@ -1475,18 +1452,7 @@
      * Sets the photo stored in mPhoto and writes it to the RawContact with the given id
      */
     private void setPhoto(long rawContact, Bitmap photo) {
-        BaseContactEditorView requestingEditor = null;
-        for (int i = 0; i < mContent.getChildCount(); i++) {
-            final View childView = mContent.getChildAt(i);
-            if (childView instanceof BaseContactEditorView) {
-                final BaseContactEditorView editor = (BaseContactEditorView) childView;
-                if (editor.getRawContactId() == rawContact) {
-                    requestingEditor = editor;
-                    break;
-                }
-            }
-        }
-
+        BaseContactEditorView requestingEditor = getContactEditorView(rawContact);
         if (requestingEditor != null) {
             requestingEditor.setPhotoBitmap(photo);
         } else {
@@ -1494,6 +1460,22 @@
         }
     }
 
+    /**
+     * Finds raw contact editor view for the given rawContactId.
+     */
+    public BaseContactEditorView getContactEditorView(long rawContactId) {
+        for (int i = 0; i < mContent.getChildCount(); i++) {
+            final View childView = mContent.getChildAt(i);
+            if (childView instanceof BaseContactEditorView) {
+                final BaseContactEditorView editor = (BaseContactEditorView) childView;
+                if (editor.getRawContactId() == rawContactId) {
+                    return editor;
+                }
+            }
+        }
+        return null;
+    }
+
     public Uri getLookupUri() {
         return mLookupUri;
     }
