diff --git a/src/com/android/contacts/JoinContactActivity.java b/src/com/android/contacts/JoinContactActivity.java
index 9024e0b..501739d 100644
--- a/src/com/android/contacts/JoinContactActivity.java
+++ b/src/com/android/contacts/JoinContactActivity.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2007 The Android Open Source Project
+ * Copyright (C) 2009 The Android Open Source Project
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -17,28 +17,21 @@
 package com.android.contacts;
 
 
-import com.android.contacts.list.JoinContactListAdapter;
 import com.android.contacts.list.JoinContactListFragment;
-import com.android.internal.telephony.gsm.stk.ResultCode;
+import com.android.contacts.list.OnContactPickerActionListener;
 
-import android.content.ContentUris;
+import android.app.Activity;
+import android.app.FragmentTransaction;
 import android.content.Intent;
-import android.database.Cursor;
-import android.database.MatrixCursor;
 import android.net.Uri;
-import android.net.Uri.Builder;
+import android.os.Bundle;
 import android.provider.ContactsContract;
-import android.provider.ContactsContract.Contacts;
-import android.provider.ContactsContract.Contacts.AggregationSuggestions;
-import android.text.TextUtils;
 import android.util.Log;
-import android.widget.ListView;
-import android.widget.TextView;
 
 /**
  * An activity that shows a list of contacts that can be joined with the target contact.
  */
-public class JoinContactActivity extends ContactsListActivity {
+public class JoinContactActivity extends Activity {
 
     private static final String TAG = "JoinContactActivity";
 
@@ -57,153 +50,43 @@
      */
     public static final String EXTRA_TARGET_CONTACT_ID = "com.android.contacts.action.CONTACT_ID";
 
-    /** Maximum number of suggestions shown for joining aggregates */
-    private static final int MAX_SUGGESTIONS = 4;
-
     private long mTargetContactId;
 
-    /**
-     * The ID of the special item described above.
-     */
-    private static final long JOIN_MODE_SHOW_ALL_CONTACTS_ID = -2;
-
-    private boolean mLoadingJoinSuggestions;
-
-    private JoinContactListAdapter mAdapter;
-
     @Override
-    protected boolean resolveIntent(Intent intent) {
-        mMode = MODE_PICK_CONTACT;
+    protected void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+
+        Intent intent = getIntent();
         mTargetContactId = intent.getLongExtra(EXTRA_TARGET_CONTACT_ID, -1);
         if (mTargetContactId == -1) {
             Log.e(TAG, "Intent " + intent.getAction() + " is missing required extra: "
                     + EXTRA_TARGET_CONTACT_ID);
             setResult(RESULT_CANCELED);
             finish();
-            return false;
+            return;
         }
 
-        mListFragment = new JoinContactListFragment();
-
-        return true;
-    }
-
-    @Override
-    protected void onResume() {
-        super.onResume();
-
-        // TODO move this to onAttach of the corresponding fragment
-        TextView blurbView = (TextView)findViewById(R.id.join_contact_blurb);
-
-        String blurb = getString(R.string.blurbJoinContactDataWith,
-                getContactDisplayName(mTargetContactId));
-        blurbView.setText(blurb);
-
-        ListView listView = (ListView)findViewById(android.R.id.list);
-        mAdapter = (JoinContactListAdapter)listView.getAdapter();
-        mAdapter.setJoinModeShowAllContacts(true);
-    }
-
-    @Override
-    public void onListItemClick(int position, long id) {
-        if (id == JOIN_MODE_SHOW_ALL_CONTACTS_ID) {
-            mAdapter.setJoinModeShowAllContacts(false);
-            startQuery();
-        } else {
-            final Uri uri = getSelectedUri(position);
-            setResult(RESULT_OK, new Intent(null, uri));
-            finish();
-        }
-    }
-
-    @Override
-    protected Uri getUriToQuery() {
-        return getJoinSuggestionsUri(null);
-    }
-
-    /*
-     * TODO: move to a background thread.
-     */
-    private String getContactDisplayName(long contactId) {
-        String contactName = null;
-        Cursor c = getContentResolver().query(
-                ContentUris.withAppendedId(Contacts.CONTENT_URI, contactId),
-                new String[] {Contacts.DISPLAY_NAME}, null, null, null);
-        try {
-            if (c != null && c.moveToFirst()) {
-                contactName = c.getString(0);
-            }
-        } finally {
-            if (c != null) {
-                c.close();
-            }
-        }
-
-        if (contactName == null) {
-            contactName = "";
-        }
-
-        return contactName;
-    }
-
-    private Uri getJoinSuggestionsUri(String filter) {
-        Builder builder = Contacts.CONTENT_URI.buildUpon();
-        builder.appendEncodedPath(String.valueOf(mTargetContactId));
-        builder.appendEncodedPath(AggregationSuggestions.CONTENT_DIRECTORY);
-        if (!TextUtils.isEmpty(filter)) {
-            builder.appendEncodedPath(Uri.encode(filter));
-        }
-        builder.appendQueryParameter("limit", String.valueOf(MAX_SUGGESTIONS));
-        return builder.build();
-    }
-
-    @Override
-    public
-    Cursor doFilter(String filter) {
-        throw new UnsupportedOperationException();
-    }
-
-    private Cursor getShowAllContactsLabelCursor(String[] projection) {
-        MatrixCursor matrixCursor = new MatrixCursor(projection);
-        Object[] row = new Object[projection.length];
-        // The only columns we care about is the id
-        row[SUMMARY_ID_COLUMN_INDEX] = JOIN_MODE_SHOW_ALL_CONTACTS_ID;
-        matrixCursor.addRow(row);
-        return matrixCursor;
-    }
-
-    @Override
-    protected void startQuery(Uri uri, String[] projection) {
-        mLoadingJoinSuggestions = true;
-        startQuery(uri, projection, null, null, null);
-    }
-
-    @Override
-    protected void onQueryComplete(Cursor cursor) {
-        // Whenever we get a suggestions cursor, we need to immediately kick off
-        // another query for the complete list of contacts
-        if (cursor != null && mLoadingJoinSuggestions) {
-            mLoadingJoinSuggestions = false;
-            if (cursor.getCount() > 0) {
-                mAdapter.setSuggestionsCursor(cursor);
-            } else {
-                cursor.close();
-                mAdapter.setSuggestionsCursor(null);
+        JoinContactListFragment fragment = new JoinContactListFragment();
+        fragment.setTargetContactId(mTargetContactId);
+        fragment.setOnContactPickerActionListener(new OnContactPickerActionListener() {
+            public void onPickContactAction(Uri contactUri) {
+                Intent intent = new Intent(null, contactUri);
+                setResult(RESULT_OK, intent);
+                finish();
             }
 
-            if (mAdapter.getSuggestionsCursorCount() == 0
-                    || !mAdapter.isJoinModeShowAllContacts()) {
-                startQuery(getContactFilterUri(mListFragment.getQueryString()),
-                        CONTACTS_SUMMARY_PROJECTION,
-                        Contacts._ID + " != " + mTargetContactId
-                                + " AND " + ContactsContract.Contacts.IN_VISIBLE_GROUP + "=1", null,
-                        getSortOrder(CONTACTS_SUMMARY_PROJECTION));
-                return;
+            public void onSearchAllContactsAction(String string) {
             }
 
-            cursor = getShowAllContactsLabelCursor(CONTACTS_SUMMARY_PROJECTION);
-        }
+            public void onShortcutIntentCreated(Intent intent) {
+            }
 
-        super.onQueryComplete(cursor);
+            public void onCreateNewContactAction() {
+            }
+        });
+
+        FragmentTransaction transaction = openFragmentTransaction();
+        transaction.add(fragment, android.R.id.content);
+        transaction.commit();
     }
 }
diff --git a/src/com/android/contacts/list/ContactEntryListFragment.java b/src/com/android/contacts/list/ContactEntryListFragment.java
index 30eef5a..c1b90a5 100644
--- a/src/com/android/contacts/list/ContactEntryListFragment.java
+++ b/src/com/android/contacts/list/ContactEntryListFragment.java
@@ -164,18 +164,16 @@
             return;
         }
 
-        if (data == null) {
-            return;
-        }
-
         if (mEmptyView != null && (data == null || data.getCount() == 0)) {
             prepareEmptyView();
         }
 
         mAdapter.changeCursor(data);
-        showCount(data);
 
-        completeRestoreInstanceState();
+        if (data != null) {
+            showCount(data);
+            completeRestoreInstanceState();
+        }
     }
 
     protected void reloadData() {
@@ -461,7 +459,9 @@
 
     @Override
     public void onDestroy() {
-        mPhotoLoader.stop();
+        if (isPhotoLoaderEnabled()) {
+            mPhotoLoader.stop();
+        }
         super.onDestroy();
     }
 
diff --git a/src/com/android/contacts/list/ContactItemListAdapter.java b/src/com/android/contacts/list/ContactItemListAdapter.java
index 733edab..bfae731 100644
--- a/src/com/android/contacts/list/ContactItemListAdapter.java
+++ b/src/com/android/contacts/list/ContactItemListAdapter.java
@@ -652,11 +652,6 @@
         return super.getCount();
     }
 
-    @Override
-    protected int getCursorPosition(int position) {
-        return getRealPosition(position);
-    }
-
     protected int getRealPosition(int pos) {
         if (contactsListActivity.mShowNumberOfContacts) {
             pos--;
diff --git a/src/com/android/contacts/list/ContactListAdapter.java b/src/com/android/contacts/list/ContactListAdapter.java
index e6fe10a..3dfde7d 100644
--- a/src/com/android/contacts/list/ContactListAdapter.java
+++ b/src/com/android/contacts/list/ContactListAdapter.java
@@ -147,10 +147,13 @@
         return view;
     }
 
-    protected void bindSectionHeaderAndDivider(final ContactListItemView view, Cursor cursor) {
-        final int position = cursor.getPosition();
+    protected void bindSectionHeaderAndDivider(ContactListItemView view, Cursor cursor) {
+        bindSectionHeaderAndDivider(view, cursor.getPosition());
+    }
+
+    protected void bindSectionHeaderAndDivider(ContactListItemView view, int position) {
         final int section = getSectionForPosition(position);
-        if (getPositionForSection(section) == position) {
+        if (section != -1 && getPositionForSection(section) == position) {
             String title = (String)getSections()[section];
             view.setSectionHeader(title);
         } else {
diff --git a/src/com/android/contacts/list/DefaultContactListAdapter.java b/src/com/android/contacts/list/DefaultContactListAdapter.java
index 0a108d2..984e808 100644
--- a/src/com/android/contacts/list/DefaultContactListAdapter.java
+++ b/src/com/android/contacts/list/DefaultContactListAdapter.java
@@ -81,14 +81,6 @@
     }
 
     @Override
-    public View newView(Context context, Cursor cursor, ViewGroup parent) {
-        final ContactListItemView view = new ContactListItemView(context, null);
-        view.setUnknownNameText(getUnknownNameText());
-        view.setTextWithHighlightingFactory(getTextWithHighlightingFactory());
-        return view;
-    }
-
-    @Override
     public void bindView(View itemView, Context context, Cursor cursor) {
         final ContactListItemView view = (ContactListItemView)itemView;
 
diff --git a/src/com/android/contacts/list/JoinContactListAdapter.java b/src/com/android/contacts/list/JoinContactListAdapter.java
index 58f1c97..26c2e22 100644
--- a/src/com/android/contacts/list/JoinContactListAdapter.java
+++ b/src/com/android/contacts/list/JoinContactListAdapter.java
@@ -15,49 +15,105 @@
  */
 package com.android.contacts.list;
 
-import com.android.contacts.ContactsListActivity;
 import com.android.contacts.R;
-import com.android.contacts.list.ContactItemListAdapter;
 
+import android.app.patterns.CursorLoader;
+import android.content.Context;
 import android.database.Cursor;
+import android.database.MatrixCursor;
+import android.net.Uri;
+import android.net.Uri.Builder;
+import android.provider.ContactsContract;
+import android.provider.ContactsContract.Contacts;
+import android.provider.ContactsContract.Contacts.AggregationSuggestions;
+import android.text.TextUtils;
 import android.view.LayoutInflater;
 import android.view.View;
 import android.view.ViewGroup;
 import android.widget.TextView;
 
-public class JoinContactListAdapter extends ContactItemListAdapter {
-    Cursor mSuggestionsCursor;
-    int mSuggestionsCursorCount;
+public class JoinContactListAdapter extends ContactListAdapter {
+
+    /** Maximum number of suggestions shown for joining aggregates */
+    private static final int MAX_SUGGESTIONS = 4;
+
+    private Cursor mSuggestionsCursor;
+    private int mSuggestionsCursorCount;
+    private long mTargetContactId;
 
     /**
      * Determines whether we display a list item with the label
      * "Show all contacts" or actually show all contacts
      */
-    boolean mJoinModeShowAllContacts;
+    private boolean mAllContactsListShown;
 
-    public JoinContactListAdapter(ContactsListActivity context) {
+    public JoinContactListAdapter(Context context) {
         super(context);
+        setSectionHeaderDisplayEnabled(true);
     }
 
-    public boolean isJoinModeShowAllContacts() {
-        return mJoinModeShowAllContacts;
+    public void setTargetContactId(long targetContactId) {
+        this.mTargetContactId = targetContactId;
     }
 
-    public void setJoinModeShowAllContacts(boolean flag) {
-        mJoinModeShowAllContacts = flag;
+    @Override
+    public void configureLoader(CursorLoader cursorLoader) {
+        JoinContactLoader loader = (JoinContactLoader)cursorLoader;
+        loader.setLoadSuggestionsAndAllContacts(mAllContactsListShown);
+
+        Builder builder = Contacts.CONTENT_URI.buildUpon();
+        builder.appendEncodedPath(String.valueOf(mTargetContactId));
+        builder.appendEncodedPath(AggregationSuggestions.CONTENT_DIRECTORY);
+
+        String filter = getQueryString();
+        if (!TextUtils.isEmpty(filter)) {
+            builder.appendEncodedPath(Uri.encode(filter));
+        }
+
+        builder.appendQueryParameter("limit", String.valueOf(MAX_SUGGESTIONS));
+
+        loader.setSuggestionUri(builder.build());
+
+        // TODO simplify projection
+        loader.setProjection(PROJECTION);
+
+        if (mAllContactsListShown) {
+            loader.setUri(buildSectionIndexerUri(Contacts.CONTENT_URI));
+            loader.setSelection(Contacts.IN_VISIBLE_GROUP + "=1 AND " + Contacts._ID + "!=?");
+            loader.setSelectionArgs(new String[]{String.valueOf(mTargetContactId)});
+            if (getSortOrder() == ContactsContract.Preferences.SORT_ORDER_PRIMARY) {
+                loader.setSortOrder(Contacts.SORT_KEY_PRIMARY);
+            } else {
+                loader.setSortOrder(Contacts.SORT_KEY_ALTERNATIVE);
+            }
+        }
+    }
+
+    @Override
+    public boolean isEmpty() {
+        return false;
+    }
+
+    private boolean hasSuggestions() {
+        return mSuggestionsCursorCount != 0;
+    }
+
+    public boolean isAllContactsListShown() {
+        return mAllContactsListShown;
+    }
+
+    public void setAllContactsListShown(boolean flag) {
+        mAllContactsListShown = flag;
     }
 
     public void setSuggestionsCursor(Cursor cursor) {
-        if (mSuggestionsCursor != null) {
-            mSuggestionsCursor.close();
-        }
         mSuggestionsCursor = cursor;
         mSuggestionsCursorCount = cursor == null ? 0 : cursor.getCount();
     }
 
-    private boolean isShowAllContactsItemPosition(int position) {
-        return mJoinModeShowAllContacts
-                && mSuggestionsCursorCount != 0 && position == mSuggestionsCursorCount + 2;
+    public boolean isShowAllContactsItemPosition(int position) {
+        return !mAllContactsListShown
+                && hasSuggestions() && position == mSuggestionsCursorCount + 2;
     }
 
     @Override
@@ -67,33 +123,32 @@
                     "this should only be called when the cursor is valid");
         }
 
-        if (isShowAllContactsItemPosition(position)) {
-            return LayoutInflater.from(getContext()).
-                    inflate(R.layout.contacts_list_show_all_item, parent, false);
-        }
-
-        // Handle the separator specially
-        int separatorId = getSeparatorId(position);
-        if (separatorId != 0) {
-            TextView view = (TextView) LayoutInflater.from(getContext()).
-                    inflate(R.layout.list_separator, parent, false);
-            view.setText(separatorId);
-            return view;
-        }
-
-        boolean showingSuggestion;
         Cursor cursor;
-        if (mSuggestionsCursorCount != 0 && position < mSuggestionsCursorCount + 2) {
-            showingSuggestion = true;
-            cursor = mSuggestionsCursor;
+        boolean showingSuggestion = false;
+        if (hasSuggestions()) {
+            if (position == 0) {
+                // First section: "suggestions"
+                TextView view = (TextView) inflate(R.layout.list_separator, parent);
+                view.setText(R.string.separatorJoinAggregateSuggestions);
+                return view;
+            } else if (position < mSuggestionsCursorCount + 1) {
+                showingSuggestion = true;
+                cursor = mSuggestionsCursor;
+                cursor.moveToPosition(position - 1);
+            } else if (position == mSuggestionsCursorCount + 1) {
+                // Second section: "all contacts"
+                TextView view = (TextView) inflate(R.layout.list_separator, parent);
+                view.setText(R.string.separatorJoinAggregateAll);
+                return view;
+            } else if (!mAllContactsListShown && position == mSuggestionsCursorCount + 2) {
+                return inflate(R.layout.contacts_list_show_all_item, parent);
+            } else {
+                cursor = mCursor;
+                cursor.moveToPosition(position - mSuggestionsCursorCount - 2);
+            }
         } else {
-            showingSuggestion = false;
             cursor = mCursor;
-        }
-
-        int realPosition = getRealPosition(position);
-        if (!cursor.moveToPosition(realPosition)) {
-            throw new IllegalStateException("couldn't move cursor to position " + position);
+            cursor.moveToPosition(position);
         }
 
         boolean newView;
@@ -105,11 +160,35 @@
             newView = false;
             v = convertView;
         }
-        bindView(v, getContext(), cursor);
-        bindSectionHeader(v, realPosition, !showingSuggestion);
+        bindView(position, v, cursor, showingSuggestion);
         return v;
     }
 
+    private View inflate(int layoutId, ViewGroup parent) {
+        return LayoutInflater.from(getContext()).inflate(layoutId, parent, false);
+    }
+
+    @Override
+    public void bindView(View view, Context context, Cursor cursor) {
+        // not used
+    }
+
+    public void bindView(int position, View itemView, Cursor cursor, boolean showingSuggestion) {
+        final ContactListItemView view = (ContactListItemView)itemView;
+        if (!showingSuggestion) {
+            bindSectionHeaderAndDivider(view, position);
+        }
+        bindPhoto(view, cursor);
+        bindName(view, cursor);
+    }
+
+    public Cursor getShowAllContactsLabelCursor() {
+        MatrixCursor matrixCursor = new MatrixCursor(PROJECTION);
+        Object[] row = new Object[PROJECTION.length];
+        matrixCursor.addRow(row);
+        return matrixCursor;
+    }
+
     @Override
     public void changeCursor(Cursor cursor) {
         if (cursor == null) {
@@ -118,6 +197,7 @@
 
         super.changeCursor(cursor);
     }
+
     @Override
     public int getItemViewType(int position) {
         if (isShowAllContactsItemPosition(position)) {
@@ -127,15 +207,28 @@
         return super.getItemViewType(position);
     }
 
-    private int getSeparatorId(int position) {
-        if (mSuggestionsCursorCount != 0) {
-            if (position == 0) {
-                return R.string.separatorJoinAggregateSuggestions;
-            } else if (position == mSuggestionsCursorCount + 1) {
-                return R.string.separatorJoinAggregateAll;
-            }
+    @Override
+    public int getPositionForSection(int sectionIndex) {
+        if (mSuggestionsCursorCount == 0) {
+            return super.getPositionForSection(sectionIndex);
         }
-        return 0;
+
+        // Get section position in the full list
+        int position = super.getPositionForSection(sectionIndex);
+        return position + mSuggestionsCursorCount + 2;
+    }
+
+    @Override
+    public int getSectionForPosition(int position) {
+        if (mSuggestionsCursorCount == 0) {
+            return super.getSectionForPosition(position);
+        }
+
+        if (position < mSuggestionsCursorCount + 2) {
+            return -1;
+        }
+
+        return super.getSectionForPosition(position - mSuggestionsCursorCount - 2);
     }
 
     @Override
@@ -161,7 +254,7 @@
             return 0;
         }
         int superCount = super.getCount();
-        if (mSuggestionsCursorCount != 0) {
+        if (hasSuggestions()) {
             // When showing suggestions, we have 2 additional list items: the "Suggestions"
             // and "All contacts" headers.
             return mSuggestionsCursorCount + superCount + 2;
@@ -174,52 +267,51 @@
     }
 
     @Override
-    protected int getRealPosition(int pos) {
-        if (mSuggestionsCursorCount != 0) {
+    public Object getItem(int pos) {
+        if (hasSuggestions()) {
             // When showing suggestions, we have 2 additional list items: the "Suggestions"
             // and "All contacts" separators.
-            if (pos < mSuggestionsCursorCount + 2) {
-                // We are in the upper partition (Suggestions). Adjusting for the "Suggestions"
-                // separator.
-                return pos - 1;
-            } else {
-                // We are in the lower partition (All contacts). Adjusting for the size
-                // of the upper partition plus the two separators.
-                return pos - mSuggestionsCursorCount - 2;
-            }
-        } else {
-            // No separator, identity map
-            return pos;
-        }
-    }
-
-    @Override
-    public Object getItem(int pos) {
-        if (mSuggestionsCursorCount != 0 && pos <= mSuggestionsCursorCount) {
-            mSuggestionsCursor.moveToPosition(getRealPosition(pos));
-            return mSuggestionsCursor;
-        } else {
-            int realPosition = getRealPosition(pos);
-            if (realPosition < 0) {
+            if (pos == 0) {
                 return null;
             }
-            return super.getItem(realPosition);
+            else if (pos < mSuggestionsCursorCount + 1) {
+                // We are in the upper partition (Suggestions). Adjusting for the "Suggestions"
+                // separator.
+                mSuggestionsCursor.moveToPosition(pos - 1);
+                return mSuggestionsCursor;
+            } else if (pos == mSuggestionsCursorCount + 1) {
+                // This is the "All contacts" separator
+                return null;
+            } else {
+                if (!isAllContactsListShown()) {
+                    // This is the "Show all contacts" item
+                    return null;
+                } else {
+                    // We are in the lower partition (All contacts). Adjusting for the size
+                    // of the upper partition plus the two separators.
+                    mCursor.moveToPosition(pos - mSuggestionsCursorCount - 2);
+                    return mCursor;
+                }
+            }
+        } else if (mCursor != null) {
+            // No separators
+            mCursor.moveToPosition(pos);
+            return mCursor;
+        } else {
+            return null;
         }
     }
 
     @Override
     public long getItemId(int pos) {
-        if (mSuggestionsCursorCount != 0 && pos < mSuggestionsCursorCount + 2) {
-            if (mSuggestionsCursor.moveToPosition(pos - 1)) {
-                return mSuggestionsCursor.getLong(mRowIDColumn);
-            } else {
-                return 0;
-            }
-        }
-        int realPosition = getRealPosition(pos);
-        if (realPosition < 0) {
-            return 0;
-        }
-        return super.getItemId(realPosition);
+        Cursor cursor = (Cursor)getItem(pos);
+        return cursor == null ? 0 : cursor.getLong(mRowIDColumn);
+    }
+
+    public Uri getContactUri(int position) {
+        Cursor cursor = (Cursor)getItem(position);
+        long contactId = cursor.getLong(CONTACT_ID_COLUMN_INDEX);
+        String lookupKey = cursor.getString(CONTACT_LOOKUP_KEY_COLUMN_INDEX);
+        return Contacts.getLookupUri(contactId, lookupKey);
     }
 }
\ No newline at end of file
diff --git a/src/com/android/contacts/list/JoinContactListFragment.java b/src/com/android/contacts/list/JoinContactListFragment.java
index 3693070..202ee67 100644
--- a/src/com/android/contacts/list/JoinContactListFragment.java
+++ b/src/com/android/contacts/list/JoinContactListFragment.java
@@ -15,25 +15,99 @@
  */
 package com.android.contacts.list;
 
-import com.android.contacts.JoinContactActivity;
 import com.android.contacts.R;
 
+import android.app.Activity;
+import android.app.patterns.CursorLoader;
+import android.app.patterns.Loader;
+import android.content.ContentUris;
+import android.database.Cursor;
+import android.os.Bundle;
+import android.provider.ContactsContract.Contacts;
 import android.view.LayoutInflater;
 import android.view.View;
 import android.view.ViewGroup;
+import android.widget.TextView;
 
 /**
  * Fragment for the Join Contact list.
  */
-public class JoinContactListFragment extends ContactEntryListFragment {
+public class JoinContactListFragment extends ContactEntryListFragment<JoinContactListAdapter> {
+
+    private static final int DISPLAY_NAME_LOADER = 1;
+
+    private OnContactPickerActionListener mListener;
+    private long mTargetContactId;
+    private boolean mAllContactsListShown = false;
+
+    public JoinContactListFragment() {
+        setPhotoLoaderEnabled(true);
+        setSectionHeaderDisplayEnabled(true);
+    }
+
+    public void setOnContactPickerActionListener(OnContactPickerActionListener listener) {
+        mListener = listener;
+    }
 
     @Override
-    public ContactEntryListAdapter createListAdapter() {
-        JoinContactListAdapter adapter =
-                new JoinContactListAdapter((JoinContactActivity)getActivity());
-        adapter.setSectionHeaderDisplayEnabled(true);
-        adapter.setDisplayPhotos(true);
-        return adapter;
+    protected void onInitializeLoaders() {
+        super.onInitializeLoaders();
+        startLoading(DISPLAY_NAME_LOADER, null);
+    }
+
+    @Override
+    protected Loader<Cursor> onCreateLoader(int id, Bundle args) {
+        if (id == DISPLAY_NAME_LOADER) {
+            // Loader for the display name of the target contact
+            return new CursorLoader(getActivity(),
+                    ContentUris.withAppendedId(Contacts.CONTENT_URI, mTargetContactId),
+                    new String[] {Contacts.DISPLAY_NAME}, null, null, null);
+        } else {
+            return new JoinContactLoader(getActivity());
+        }
+    }
+
+    @Override
+    protected void onLoadFinished(Loader<Cursor> loader, Cursor data) {
+        if (loader.getId() == DISPLAY_NAME_LOADER) {
+            if (data != null && data.moveToFirst()) {
+                showTargetContactName(data.getString(0));
+            }
+        } else {
+            JoinContactListAdapter adapter = getAdapter();
+            if (adapter.isAllContactsListShown()) {
+                Cursor suggestionsCursor = ((JoinContactLoader)loader).getSuggestionsCursor();
+                adapter.setSuggestionsCursor(suggestionsCursor);
+                super.onLoadFinished(loader, data);
+            } else {
+                adapter.setSuggestionsCursor(data);
+                super.onLoadFinished(loader, adapter.getShowAllContactsLabelCursor());
+            }
+        }
+    }
+
+     private void showTargetContactName(String displayName) {
+        Activity activity = getActivity();
+        TextView blurbView = (TextView)activity.findViewById(R.id.join_contact_blurb);
+        String blurb = activity.getString(R.string.blurbJoinContactDataWith, displayName);
+        blurbView.setText(blurb);
+    }
+
+    public void setTargetContactId(long targetContactId) {
+        mTargetContactId = targetContactId;
+    }
+
+    @Override
+    public JoinContactListAdapter createListAdapter() {
+        return new JoinContactListAdapter(getActivity());
+    }
+
+    @Override
+    protected void configureAdapter() {
+        super.configureAdapter();
+        JoinContactListAdapter adapter = getAdapter();
+        adapter.setAllContactsListShown(mAllContactsListShown);
+        adapter.setTargetContactId(mTargetContactId);
     }
 
     @Override
@@ -43,7 +117,12 @@
 
     @Override
     protected void onItemClick(int position, long id) {
-        // TODO
-        throw new UnsupportedOperationException();
+        JoinContactListAdapter adapter = getAdapter();
+        if (adapter.isShowAllContactsItemPosition(position)) {
+            mAllContactsListShown = true;
+            reloadData();
+        } else {
+            mListener.onPickContactAction(adapter.getContactUri(position));
+        }
     }
 }
diff --git a/src/com/android/contacts/list/JoinContactLoader.java b/src/com/android/contacts/list/JoinContactLoader.java
new file mode 100644
index 0000000..c15acb1
--- /dev/null
+++ b/src/com/android/contacts/list/JoinContactLoader.java
@@ -0,0 +1,95 @@
+/*
+ * Copyright (C) 2010 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.android.contacts.list;
+
+import android.app.patterns.CursorLoader;
+import android.content.Context;
+import android.database.Cursor;
+import android.database.MatrixCursor;
+import android.net.Uri;
+
+/**
+ * A specialized loader for the Join Contacts UI.  It executes up to two queries:
+ * join suggestions and (optionally) the full contact list.
+ */
+public class JoinContactLoader extends CursorLoader {
+
+    private boolean mLoadSuggestionsAndAllContact;
+    private String[] mProjection;
+    private Uri mSuggestionUri;
+    private MatrixCursor mCachedCursor;
+
+    public JoinContactLoader(Context context) {
+        super(context, null, null, null, null, null);
+    }
+
+    public void setSuggestionUri(Uri uri) {
+        this.mSuggestionUri = uri;
+    }
+
+    @Override
+    public void setProjection(String[] projection) {
+        super.setProjection(projection);
+        this.mProjection = projection;
+    }
+
+    public Cursor getSuggestionsCursor() {
+        return mCachedCursor;
+    }
+
+    @Override
+    protected Cursor loadInBackground() {
+        if (mLoadSuggestionsAndAllContact) {
+            // First execute the suggestions query, then call super.loadInBackground
+            // to load the entire list
+            mCachedCursor = loadSuggestions();
+            return super.loadInBackground();
+        } else {
+            // Use the default behavior of the super.loadInBackground to load join
+            // suggestions only
+            setUri(mSuggestionUri);
+            setSelection(null);
+            setSelectionArgs(null);
+            setSortOrder(null);
+            return super.loadInBackground();
+        }
+    }
+
+    /**
+     * Loads join suggestions into a MatrixCursor.
+     */
+    private MatrixCursor loadSuggestions() {
+        Cursor cursor = getContext().getContentResolver().query(mSuggestionUri, mProjection,
+                null, null, null);
+        try {
+            MatrixCursor matrix = new MatrixCursor(mProjection);
+            Object[] row = new Object[mProjection.length];
+            while (cursor.moveToNext()) {
+                for (int i = 0; i < row.length; i++) {
+                    row[i] = cursor.getString(i);
+                }
+                matrix.addRow(row);
+            }
+            return matrix;
+        } finally {
+            cursor.close();
+        }
+    }
+
+    public void setLoadSuggestionsAndAllContacts(boolean flag) {
+        mLoadSuggestionsAndAllContact = flag;
+    }
+}
\ No newline at end of file
diff --git a/src/com/android/contacts/list/StrequentContactListAdapter.java b/src/com/android/contacts/list/StrequentContactListAdapter.java
index 239f804..cef0604 100644
--- a/src/com/android/contacts/list/StrequentContactListAdapter.java
+++ b/src/com/android/contacts/list/StrequentContactListAdapter.java
@@ -147,9 +147,7 @@
 
     @Override
     public View newView(Context context, Cursor cursor, ViewGroup parent) {
-        final ContactListItemView view = new ContactListItemView(context, null);
-        view.setUnknownNameText(getUnknownNameText());
-        view.setTextWithHighlightingFactory(getTextWithHighlightingFactory());
+        ContactListItemView view = (ContactListItemView)super.newView(context, cursor, parent);
         view.setOnCallButtonClickListener(mCallButtonListener);
         return view;
     }
diff --git a/src/com/android/contacts/widget/PinnedHeaderListAdapter.java b/src/com/android/contacts/widget/PinnedHeaderListAdapter.java
index db99e14..7492de1 100644
--- a/src/com/android/contacts/widget/PinnedHeaderListAdapter.java
+++ b/src/com/android/contacts/widget/PinnedHeaderListAdapter.java
@@ -64,16 +64,6 @@
         mIndexer = indexer;
     }
 
-    /**
-     * Maps an adapter position to the corresponding cursor position.  Should not
-     * be needed once we have switched to using header views and composite
-     * list adapters.
-     */
-    @Deprecated
-    protected int getCursorPosition(int position) {
-        return position;
-    }
-
     public Object [] getSections() {
         if (mIndexer == null) {
             return new String[] { " " };
@@ -107,16 +97,15 @@
             return PINNED_HEADER_GONE;
         }
 
-        int realPosition = getCursorPosition(position);
-        if (realPosition < 0) {
+        // The header should get pushed up if the top item shown
+        // is the last item in a section for a particular letter.
+        int section = getSectionForPosition(position);
+        if (section == -1) {
             return PINNED_HEADER_GONE;
         }
 
-        // The header should get pushed up if the top item shown
-        // is the last item in a section for a particular letter.
-        int section = getSectionForPosition(realPosition);
         int nextSectionPosition = getPositionForSection(section + 1);
-        if (nextSectionPosition != -1 && realPosition == nextSectionPosition - 1) {
+        if (nextSectionPosition != -1 && position == nextSectionPosition - 1) {
             return PINNED_HEADER_PUSHED_UP;
         }
 
@@ -144,8 +133,7 @@
             header.setTag(cache);
         }
 
-        int realPosition = getCursorPosition(position);
-        int section = getSectionForPosition(realPosition);
+        int section = getSectionForPosition(position);
 
         String title = (String)mIndexer.getSections()[section];
         cache.titleView.setText(title);
