diff --git a/res/layout-xlarge/group_detail_fragment.xml b/res/layout-xlarge/group_detail_fragment.xml
new file mode 100644
index 0000000..a824319
--- /dev/null
+++ b/res/layout-xlarge/group_detail_fragment.xml
@@ -0,0 +1,60 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2011 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.
+-->
+
+
+<LinearLayout
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    android:id="@+id/group_detail"
+    android:orientation="vertical"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent"
+    android:background="@drawable/panel_content">
+
+    <TextView
+        android:id="@+id/group_title"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:paddingLeft="@dimen/group_detail_border_padding"
+        android:paddingTop="@dimen/group_detail_vertical_padding"
+        android:textAppearance="?android:attr/textAppearanceLarge"
+        android:textStyle="bold" />
+
+    <TextView
+        android:id="@+id/group_size"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:paddingLeft="@dimen/group_detail_border_padding"
+        android:textAppearance="?android:attr/textAppearanceMedium"
+        android:textColor="?android:attr/textColorSecondary" />
+
+    <View
+        android:layout_width="match_parent"
+        android:layout_height="1dip"
+        android:background="?android:attr/listDivider"
+        android:layout_marginTop="@dimen/group_detail_vertical_padding"
+        android:layout_marginBottom="@dimen/group_detail_vertical_padding"
+        android:layout_marginLeft="@dimen/group_detail_divider_margin"
+        android:layout_marginRight="@dimen/group_detail_divider_margin" />
+
+    <ListView android:id="@android:id/list"
+        android:layout_width="match_parent"
+        android:layout_height="match_parent"
+        android:layout_marginLeft="@dimen/group_detail_border_padding"
+        android:layout_marginRight="@dimen/group_detail_border_padding"
+        android:cacheColorHint="#00000000"
+        android:divider="@null" />
+
+</LinearLayout>
\ No newline at end of file
diff --git a/res/layout-xlarge/people_activity.xml b/res/layout-xlarge/people_activity.xml
index 3fbb3d2..969bbf9 100644
--- a/res/layout-xlarge/people_activity.xml
+++ b/res/layout-xlarge/people_activity.xml
@@ -84,10 +84,16 @@
             ex:exitAnimation="@android:animator/fade_out"
             ex:animationDuration="200">
             <fragment
-                android:id="@+id/detail_fragment"
+                android:id="@+id/contact_detail_fragment"
                 class="com.android.contacts.detail.ContactDetailFragment"
                 android:layout_width="match_parent"
-                android:layout_height="match_parent" 
+                android:layout_height="match_parent"
+            />
+            <fragment
+                android:id="@+id/group_detail_fragment"
+                class="com.android.contacts.group.GroupDetailFragment"
+                android:layout_width="match_parent"
+                android:layout_height="match_parent"
             />
         </view>
 
diff --git a/res/layout/call_detail.xml b/res/layout/call_detail.xml
index a8da153..a47452c 100644
--- a/res/layout/call_detail.xml
+++ b/res/layout/call_detail.xml
@@ -29,8 +29,7 @@
         android:layout_alignParentLeft="true"
         android:layout_alignParentTop="true"
         android:adjustViewBounds="true"
-        android:scaleX="2.5"
-        android:scaleY="2.5"
+        android:scaleType="centerCrop"
 
         android:background="@drawable/ic_contact_picture"
     />
diff --git a/res/layout/call_log_list_child_item.xml b/res/layout/call_log_list_child_item.xml
index 10e09a4..d2c22a9 100644
--- a/res/layout/call_log_list_child_item.xml
+++ b/res/layout/call_log_list_child_item.xml
@@ -17,7 +17,6 @@
 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
     android:layout_width="match_parent"
     android:layout_height="?android:attr/listPreferredItemHeight"
-    android:paddingLeft="7dip"
 >
 
     <include layout="@layout/call_log_action_call"/>
diff --git a/res/layout/call_log_list_group_item.xml b/res/layout/call_log_list_group_item.xml
index c922540..e7ab026 100644
--- a/res/layout/call_log_list_group_item.xml
+++ b/res/layout/call_log_list_group_item.xml
@@ -17,7 +17,6 @@
 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
     android:layout_width="match_parent"
     android:layout_height="?android:attr/listPreferredItemHeight"
-    android:paddingLeft="7dip"
 >
 
     <include layout="@layout/call_log_contact_photo"/>
diff --git a/res/layout/call_log_list_item.xml b/res/layout/call_log_list_item.xml
index 88a1ba1..e07479d 100644
--- a/res/layout/call_log_list_item.xml
+++ b/res/layout/call_log_list_item.xml
@@ -17,7 +17,6 @@
 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
     android:layout_width="match_parent"
     android:layout_height="?android:attr/listPreferredItemHeight"
-    android:paddingLeft="7dip"
 >
 
     <include layout="@layout/call_log_contact_photo"/>
diff --git a/res/layout/contact_tile_row_regular.xml b/res/layout/contact_tile_row_regular.xml
new file mode 100644
index 0000000..79b670a
--- /dev/null
+++ b/res/layout/contact_tile_row_regular.xml
@@ -0,0 +1,38 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2011 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.
+-->
+
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    android:id="@+id/contactTile_row_regular"
+    android:layout_width="match_parent"
+    android:layout_height="wrap_content">
+
+    <RelativeLayout android:id="@+id/contactTile_row_left"
+        style="@style/ContactTileRegularLayout">
+        <ImageView android:id="@+id/contactTile_left_image"
+            style="@style/ContactTileRegularImage" />
+        <TextView android:id="@+id/contactTile_left_name"
+            style="@style/ContactTileRegularText" />
+    </RelativeLayout>
+
+    <RelativeLayout android:id="@+id/contactTile_row_right"
+        style="@style/ContactTileRegularLayout">
+        <ImageView android:id="@+id/contactTile_right_image"
+            style="@style/ContactTileRegularImage" />
+        <TextView android:id="@+id/contactTile_right_name"
+            style="@style/ContactTileRegularText" />
+    </RelativeLayout>
+
+</LinearLayout>
diff --git a/res/layout/group_browse_list_item.xml b/res/layout/group_browse_list_item.xml
index accbedd..28f4e17 100644
--- a/res/layout/group_browse_list_item.xml
+++ b/res/layout/group_browse_list_item.xml
@@ -14,7 +14,9 @@
      limitations under the License.
 -->
 
-<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+<view
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    class="com.android.contacts.group.GroupBrowseListAdapter$GroupListItem"
     android:orientation="horizontal"
     android:layout_width="match_parent"
     android:layout_height="wrap_content">
@@ -26,7 +28,8 @@
         android:layout_height="match_parent"
         android:layout_marginLeft="10dip"
         android:layout_marginRight="10dip"
-        android:layout_gravity="center_vertical" />
+        android:layout_gravity="center_vertical"
+        android:src="@drawable/ic_menu_display_all_holo_light" />
 
     <LinearLayout
         android:orientation="vertical"
@@ -57,4 +60,4 @@
 
     </LinearLayout>
 
-</LinearLayout>
+</view>
diff --git a/res/layout/group_detail_fragment.xml b/res/layout/group_detail_fragment.xml
index 70d67b6..76f7214 100644
--- a/res/layout/group_detail_fragment.xml
+++ b/res/layout/group_detail_fragment.xml
@@ -21,7 +21,7 @@
     android:layout_height="match_parent">
 
     <ListView
-        android:id="@+id/member_list"
+        android:id="@android:id/list"
         android:layout_width="match_parent"
         android:layout_height="wrap_content"
         android:scrollbarStyle="outsideOverlay"/>
diff --git a/res/layout/strequent_fragment.xml b/res/layout/strequent_fragment.xml
new file mode 100644
index 0000000..348fd0c
--- /dev/null
+++ b/res/layout/strequent_fragment.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2011 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.
+-->
+
+<ListView xmlns:android="http://schemas.android.com/apk/res/android"
+    android:id="@+id/strequent_list"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent"
+    android:divider="@null"
+/>
diff --git a/res/values-xlarge/styles.xml b/res/values-xlarge/styles.xml
index 9d0ff29..0179f6a 100644
--- a/res/values-xlarge/styles.xml
+++ b/res/values-xlarge/styles.xml
@@ -92,7 +92,9 @@
         <item name="android:background">@drawable/directory_bg_holo</item>
     </style>
 
-    <style name="NonPhoneDialogTheme" parent="@android:Theme.Holo.Light.Dialog.Alert">
+    <style name="NonPhoneDialogTheme" parent="@android:Theme.Holo.Light.Dialog">
+        <item name="android:windowBackground">@android:color/transparent</item>
+        <item name="android:windowContentOverlay">@null</item>
     </style>
 
     <style name="BackgroundOnly" parent="@android:Theme.Holo.Light">
diff --git a/res/values/colors.xml b/res/values/colors.xml
index ace8869..9a60815 100644
--- a/res/values/colors.xml
+++ b/res/values/colors.xml
@@ -48,4 +48,8 @@
 
     <!-- Color of the text indicating the type of entry (e.g. Home, Work etc) -->
     <color name="detail_header_view_text_color">#FFFFFF</color>
+
+    <!--  Color of the text foreground and background of Regular Sized ContactTile -->
+    <color name="contact_tile_regular_text">#2B1B17</color>
+    <color name="contact_tile_regular_text_background">#FFFFFF</color>
 </resources>
diff --git a/res/values/dimens.xml b/res/values/dimens.xml
index ff7d873..68655d8 100644
--- a/res/values/dimens.xml
+++ b/res/values/dimens.xml
@@ -111,4 +111,13 @@
 
     <!-- Height of list sections (A, B, C) that show the first character of the contacts -->
     <dimen name="list_section_height">25dip</dimen>
+
+    <!-- Border padding for the group detail fragment header -->
+    <dimen name="group_detail_border_padding">20dip</dimen>
+
+    <!-- Vertical padding for the group detail fragment header -->
+    <dimen name="group_detail_vertical_padding">15dip</dimen>
+
+    <!-- Margins for the group detail fragment divider in the header -->
+    <dimen name="group_detail_divider_margin">15dip</dimen>
 </resources>
diff --git a/res/values/styles.xml b/res/values/styles.xml
index aefb719..f18a340 100644
--- a/res/values/styles.xml
+++ b/res/values/styles.xml
@@ -162,7 +162,7 @@
     </style>
 
     <!-- TODO: Clean up this file so themes aren't copied. -->
-    <style name="GroupDetailTheme" parent="@android:Theme">
+    <style name="GroupDetailTheme" parent="android:Theme.Holo.Light">
         <item name="list_item_height">?android:attr/listPreferredItemHeight</item>
         <item name="activated_background">@drawable/list_item_activated_background</item>
         <item name="section_header_background">@drawable/list_title_holo</item>
@@ -274,4 +274,52 @@
         <item name="android:gravity">center_vertical</item>
         <item name="android:paddingTop">5dip</item>
     </style>
+
+    <style name="ContactTileRegularText">
+        <item name="android:layout_width">fill_parent</item>
+        <item name="android:layout_height">wrap_content</item>
+        <item name="android:layout_alignParentBottom">true</item>
+        <item name="android:background">@color/contact_tile_regular_text</item>
+        <item name="android:textColor">@color/contact_tile_regular_text_background</item>
+        <item name="android:textSize">17sp</item>
+        <item name="android:alpha">0.7</item>
+        <item name="android:gravity">center_horizontal</item>
+    </style>
+
+    <style name="ContactTileRegularImage">
+        <item name="android:layout_width">160dip</item>
+        <item name="android:layout_height">160dip</item>
+        <item name="android:layout_alignParentTop">true</item>
+        <item name="android:layout_alignParentLeft">true</item>
+        <item name="android:scaleType">centerCrop</item>
+    </style>
+
+    <style name="ContactTileRegularLayout">
+        <item name="android:layout_width">155dip</item>
+        <item name="android:layout_height">160dip</item>
+        <item name="android:focusable">true</item>
+        <item name="android:padding">5dip</item>
+        <item name="android:background">@drawable/list_selector</item>
+    </style>
+
+    <style name="ContactTileSmallText">
+        <item name="android:layout_width">80dip</item>
+        <item name="android:layout_height">wrap_content</item>
+        <item name="android:paddingTop">8dip</item>
+        <item name="android:paddingLeft">4dip</item>
+    </style>
+
+    <style name="ContactTileSmallImage">
+        <item name="android:layout_width">80dip</item>
+        <item name="android:layout_height">80dip</item>
+        <item name="android:scaleType">centerCrop</item>
+    </style>
+
+    <style name="ContactTileSmallLayout">
+        <item name="android:layout_width">160dip</item>
+        <item name="android:layout_height">80dip</item>
+        <item name="android:focusable">true</item>
+        <item name="android:padding">5dip</item>
+        <item name="android:background">@drawable/list_selector</item>
+    </style>
 </resources>
diff --git a/src/com/android/contacts/GroupMetaDataLoader.java b/src/com/android/contacts/GroupMetaDataLoader.java
index d08d007..927697a 100644
--- a/src/com/android/contacts/GroupMetaDataLoader.java
+++ b/src/com/android/contacts/GroupMetaDataLoader.java
@@ -17,10 +17,12 @@
 
 import android.content.Context;
 import android.content.CursorLoader;
+import android.net.Uri;
 import android.provider.ContactsContract.Groups;
 
 /**
- * Group meta-data loader.  Loads all groups from the database.
+ * Group meta-data loader. Loads all groups or just a single group from the
+ * database (if given a {@link Uri}).
  */
 public final class GroupMetaDataLoader extends CursorLoader {
 
@@ -40,8 +42,23 @@
     public final static int AUTO_ADD = 4;
     public final static int FAVORITES = 5;
 
-    public GroupMetaDataLoader(Context context) {
-        super(context, Groups.CONTENT_URI, COLUMNS, Groups.ACCOUNT_TYPE + " NOT NULL AND "
+    public GroupMetaDataLoader(Context context, Uri groupUri) {
+        super(context, ensureIsGroupUri(groupUri), COLUMNS, Groups.ACCOUNT_TYPE + " NOT NULL AND "
                 + Groups.ACCOUNT_NAME + " NOT NULL", null, null);
     }
+
+    /**
+     * Ensures that this is a valid group URI. If invalid, then an exception is
+     * thrown. Otherwise, the original URI is returned.
+     */
+    private static Uri ensureIsGroupUri(final Uri groupUri) {
+        // TODO: Fix ContactsProvider2 getType method to resolve the group Uris
+        if (groupUri == null) {
+            throw new IllegalArgumentException("Uri must not be null");
+        }
+        if (!groupUri.toString().startsWith(Groups.CONTENT_URI.toString())) {
+            throw new IllegalArgumentException("Invalid group Uri: " + groupUri);
+        }
+        return groupUri;
+    }
 }
diff --git a/src/com/android/contacts/StrequentMetaDataLoader.java b/src/com/android/contacts/StrequentMetaDataLoader.java
new file mode 100644
index 0000000..203b25f
--- /dev/null
+++ b/src/com/android/contacts/StrequentMetaDataLoader.java
@@ -0,0 +1,44 @@
+/*
+ * Copyright (C) 2011 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;
+
+import android.content.Context;
+import android.content.CursorLoader;
+import android.provider.ContactsContract.Contacts;
+
+/**
+ * Strequent meta-data loader.  Loads all starred and frequent contacts from the database.
+ */
+public final class StrequentMetaDataLoader extends CursorLoader {
+
+    public final static int CONTACT_ID = 0;
+    public final static int DISPLAY_NAME = 1;
+    public final static int STARRED = 2;
+    public final static int PHOTO_URI = 3;
+    public final static int PHOTO_ID = 4;
+
+    private static final String[] COLUMNS = new String[] {
+        Contacts._ID,
+        Contacts.DISPLAY_NAME,
+        Contacts.STARRED,
+        Contacts.PHOTO_URI,
+        Contacts.PHOTO_ID
+    };
+
+    public StrequentMetaDataLoader(Context context) {
+        super(context, Contacts.CONTENT_STREQUENT_URI, COLUMNS, null, null, null);
+    }
+}
diff --git a/src/com/android/contacts/activities/ActionBarAdapter.java b/src/com/android/contacts/activities/ActionBarAdapter.java
index 680c8bd..0541edb 100644
--- a/src/com/android/contacts/activities/ActionBarAdapter.java
+++ b/src/com/android/contacts/activities/ActionBarAdapter.java
@@ -108,6 +108,9 @@
         if (mSearchMode != flag) {
             mSearchMode = flag;
             update();
+            if (mSearchView == null) {
+                return;
+            }
             if (mSearchMode) {
                 mSearchView.requestFocus();
             } else {
@@ -122,7 +125,9 @@
 
     public void setQueryString(String query) {
         mQueryString = query;
-        mSearchView.setQuery(query, false);
+        if (mSearchView != null) {
+            mSearchView.setQuery(query, false);
+        }
     }
 
     public void update() {
diff --git a/src/com/android/contacts/activities/ContactDetailActivity.java b/src/com/android/contacts/activities/ContactDetailActivity.java
index 17e05c7..5992042 100644
--- a/src/com/android/contacts/activities/ContactDetailActivity.java
+++ b/src/com/android/contacts/activities/ContactDetailActivity.java
@@ -47,7 +47,7 @@
 
         if (PhoneCapabilityTester.isUsingTwoPanes(this)) {
             // This activity must not be shown. We have to select the contact in the
-            // ContactBrowserActivity instead ==> Create a forward intent and finish
+            // PeopleActivity instead ==> Create a forward intent and finish
             final Intent originalIntent = getIntent();
             Intent intent = new Intent();
             intent.setAction(originalIntent.getAction());
diff --git a/src/com/android/contacts/activities/DialtactsActivity.java b/src/com/android/contacts/activities/DialtactsActivity.java
index a0d77ab..083e5ce 100644
--- a/src/com/android/contacts/activities/DialtactsActivity.java
+++ b/src/com/android/contacts/activities/DialtactsActivity.java
@@ -207,7 +207,7 @@
 
         ContactsIntentResolver resolver = new ContactsIntentResolver(this);
         ContactsRequest request = resolver.resolveIntent(intent);
-        final ContactListFilter filter = new ContactListFilter(
+        final ContactListFilter filter = ContactListFilter.createFilterWithType(
                 ContactListFilter.FILTER_TYPE_ALL_ACCOUNTS);
         mContactsFragment.setFilter(filter, false);
         mContactsFragment.setSearchMode(request.isSearchMode());
@@ -225,24 +225,7 @@
         tab.setIcon(R.drawable.ic_tab_starred);
         tab.setTabListener(new TabChangeListener(mStrequentFragment));
         getActionBar().addTab(tab);
-
-        // TODO: We should not artificially create Intents and put them into the Fragment.
-        // It would be nicer to directly pass in the UI constant
-        Intent intent = new Intent(UI.LIST_STREQUENT_ACTION);
-        intent.setClass(this, PeopleActivity.class);
-
-        ContactsIntentResolver resolver = new ContactsIntentResolver(this);
-        ContactsRequest request = resolver.resolveIntent(intent);
-        final ContactListFilter filter = new ContactListFilter(
-                ContactListFilter.FILTER_TYPE_STARRED);
-        mStrequentFragment.setFilter(filter, false);
-        mStrequentFragment.setSearchMode(request.isSearchMode());
-        mStrequentFragment.setQueryString(request.getQueryString(), false);
-        mStrequentFragment.setContactsRequest(request);
-        mStrequentFragment.setDirectorySearchMode(request.isDirectorySearchEnabled()
-                ? DirectoryListLoader.SEARCH_MODE_DEFAULT
-                : DirectoryListLoader.SEARCH_MODE_NONE);
-        mStrequentFragment.setOnContactListActionListener(mListFragmentListener);
+        mStrequentFragment.setListener(mStrequentListener);
     }
 
     /**
@@ -505,6 +488,14 @@
         }
     };
 
+    private StrequentContactListFragment.Listener mStrequentListener =
+            new StrequentContactListFragment.Listener() {
+        @Override
+        public void onContactSelected(Uri contactUri) {
+            getPhoneNumberCallInteraction().startInteraction(contactUri);
+        }
+    };
+
     @Override
     public boolean onCreateOptionsMenu(Menu menu) {
         // For now, create the menu in here. It would be nice to do this in the Fragment,
@@ -523,7 +514,7 @@
 
     @Override
     public boolean onOptionsItemSelected(MenuItem item) {
-        // This is currently a copy of the equivalent code of ContactBrowserActivity (with the
+        // This is currently a copy of the equivalent code of PeopleActivity (with the
         // exception of menu_add, because we do not select items in the list).
         // Should be consolidated
         switch (item.getItemId()) {
diff --git a/src/com/android/contacts/activities/GroupDetailActivity.java b/src/com/android/contacts/activities/GroupDetailActivity.java
index edc460c..95f804c 100644
--- a/src/com/android/contacts/activities/GroupDetailActivity.java
+++ b/src/com/android/contacts/activities/GroupDetailActivity.java
@@ -18,6 +18,7 @@
 
 import com.android.contacts.ContactsActivity;
 import com.android.contacts.R;
+import com.android.contacts.group.GroupDetailFragment;
 
 import android.os.Bundle;
 
@@ -25,13 +26,6 @@
 
     private static final String TAG = "GroupDetailActivity";
 
-    public static final String KEY_ACCOUNT_TYPE = "accountType";
-    public static final String KEY_ACCOUNT_NAME = "accountName";
-    public static final String KEY_GROUP_ID = "groupId";
-    public static final String KEY_GROUP_SOURCE_ID = "groupSourceId";
-    public static final String KEY_GROUP_READ_ONLY = "groupReadOnly";
-    public static final String KEY_GROUP_TITLE = "title";
-
     @Override
     public void onCreate(Bundle savedState) {
         super.onCreate(savedState);
@@ -40,5 +34,26 @@
         // TODO: Handle search or key down
 
         setContentView(R.layout.group_detail_activity);
+
+        getActionBar().setDisplayHomeAsUpEnabled(true);
+
+        GroupDetailFragment fragment = (GroupDetailFragment) getFragmentManager().findFragmentById(
+                R.id.group_detail_fragment);
+        fragment.setListener(mFragmentListener);
+        fragment.loadGroup(getIntent().getData());
     }
+
+    private final GroupDetailFragment.Listener mFragmentListener =
+            new GroupDetailFragment.Listener() {
+
+        @Override
+        public void onGroupSizeUpdated(String size) {
+            getActionBar().setSubtitle(size);
+        }
+
+        @Override
+        public void onGroupTitleUpdated(String title) {
+            getActionBar().setTitle(title);
+        }
+    };
 }
diff --git a/src/com/android/contacts/activities/PeopleActivity.java b/src/com/android/contacts/activities/PeopleActivity.java
index f537c9e..502c31d 100644
--- a/src/com/android/contacts/activities/PeopleActivity.java
+++ b/src/com/android/contacts/activities/PeopleActivity.java
@@ -18,11 +18,14 @@
 
 import com.android.contacts.ContactSaveService;
 import com.android.contacts.ContactsActivity;
+import com.android.contacts.GroupMetaData;
 import com.android.contacts.R;
 import com.android.contacts.calllog.CallLogFragment;
 import com.android.contacts.detail.ContactDetailFragment;
 import com.android.contacts.dialpad.DialpadFragment;
 import com.android.contacts.group.GroupBrowseListFragment;
+import com.android.contacts.group.GroupBrowseListFragment.OnGroupBrowserActionListener;
+import com.android.contacts.group.GroupDetailFragment;
 import com.android.contacts.interactions.ContactDeletionInteraction;
 import com.android.contacts.interactions.GroupDeletionDialogFragment;
 import com.android.contacts.interactions.GroupRenamingDialogFragment;
@@ -92,7 +95,7 @@
         DialogManager.DialogShowingViewActivity,
         ContactListFilterController.ContactListFilterListener, ProviderStatusListener {
 
-    private static final String TAG = "ContactBrowserActivity";
+    private static final String TAG = "PeopleActivity";
 
     private static final int SUBACTIVITY_NEW_CONTACT = 2;
     private static final int SUBACTIVITY_EDIT_CONTACT = 3;
@@ -112,13 +115,16 @@
     private ContactBrowseListFragment mListFragment;
 
     /**
-     * Whether we have a right-side contact pane for displaying contact info while browsing.
-     * Generally means "this is a tablet".
+     * Whether we have a right-side contact or group detail pane for displaying info on that
+     * contact or group while browsing. Generally means "this is a tablet".
      */
-    private boolean mContactContentDisplayed;
+    private boolean mContentPaneDisplayed;
 
-    private ContactDetailFragment mDetailFragment;
-    private DetailFragmentListener mDetailFragmentListener = new DetailFragmentListener();
+    private ContactDetailFragment mContactDetailFragment;
+    private ContactDetailFragmentListener mContactDetailFragmentListener =
+            new ContactDetailFragmentListener();
+
+    private GroupDetailFragment mGroupDetailFragment;
 
     private PhoneNumberInteraction mPhoneNumberCallInteraction;
     private PhoneNumberInteraction mSendTextMessageInteraction;
@@ -162,15 +168,21 @@
                 mListFragment.setContextMenuAdapter(
                         new ContactBrowseListContextMenuAdapter(mListFragment));
             }
+        } else if (fragment instanceof GroupBrowseListFragment) {
+            mGroupsFragment = (GroupBrowseListFragment) fragment;
+            mGroupsFragment.setListener(new GroupBrowserActionListener());
         } else if (fragment instanceof ContactDetailFragment) {
-            mDetailFragment = (ContactDetailFragment)fragment;
-            mDetailFragment.setListener(mDetailFragmentListener);
-            mContactContentDisplayed = true;
+            mContactDetailFragment = (ContactDetailFragment) fragment;
+            mContactDetailFragment.setListener(mContactDetailFragmentListener);
+            mContentPaneDisplayed = true;
         } else if (fragment instanceof ContactsUnavailableFragment) {
             mContactsUnavailableFragment = (ContactsUnavailableFragment)fragment;
             mContactsUnavailableFragment.setProviderStatusLoader(mProviderStatusLoader);
             mContactsUnavailableFragment.setOnContactsUnavailableActionListener(
                     new ContactsUnavailableFragmentListener());
+        } else if (fragment instanceof GroupDetailFragment) {
+            mGroupDetailFragment = (GroupDetailFragment) fragment;
+            mContentPaneDisplayed = true;
         }
     }
 
@@ -231,11 +243,17 @@
             transaction.hide(mFavoritesFragment);
             transaction.hide(mContactsFragment);
             transaction.hide(mGroupsFragment);
+            if (mContactDetailFragment != null) {
+                transaction.hide(mContactDetailFragment);
+            }
+            if (mGroupDetailFragment != null) {
+                transaction.hide(mGroupDetailFragment);
+            }
             transaction.commit();
         }
 
         if (mRequest.getActionCode() == ContactsRequest.ACTION_VIEW_CONTACT
-                && !mContactContentDisplayed) {
+                && !mContentPaneDisplayed) {
             redirect = new Intent(this, ContactDetailActivity.class);
             redirect.setAction(Intent.ACTION_VIEW);
             redirect.setData(mRequest.getContactUri());
@@ -254,17 +272,20 @@
             actionBar.removeAllTabs();
             Tab favoritesTab = actionBar.newTab();
             favoritesTab.setText(getString(R.string.strequentList));
-            favoritesTab.setTabListener(new TabChangeListener(mFavoritesFragment));
+            favoritesTab.setTabListener(new TabChangeListener(mFavoritesFragment,
+                    mContactDetailFragment));
             actionBar.addTab(favoritesTab);
 
             Tab peopleTab = actionBar.newTab();
             peopleTab.setText(getString(R.string.people));
-            peopleTab.setTabListener(new TabChangeListener(mContactsFragment));
+            peopleTab.setTabListener(new TabChangeListener(mContactsFragment,
+                    mContactDetailFragment));
             actionBar.addTab(peopleTab);
 
             Tab groupsTab = actionBar.newTab();
             groupsTab.setText(getString(R.string.contactsGroupsLabel));
-            groupsTab.setTabListener(new TabChangeListener(mGroupsFragment));
+            groupsTab.setTabListener(new TabChangeListener(mGroupsFragment,
+                    mGroupDetailFragment));
             actionBar.addTab(groupsTab);
             actionBar.setDisplayShowTitleEnabled(true);
 
@@ -284,20 +305,33 @@
      * support library in our app.
      */
     private class TabChangeListener implements TabListener {
-        private final Fragment mFragment;
+        private final Fragment mBrowseListFragment;
 
-        public TabChangeListener(Fragment fragment) {
-            mFragment = fragment;
+        /**
+         * Right pane fragment that is present on larger screen sizes (can be
+         * null for smaller screen sizes).
+         */
+        private final Fragment mDetailFragment;
+
+        public TabChangeListener(Fragment listFragment, Fragment detailFragment) {
+            mBrowseListFragment = listFragment;
+            mDetailFragment = detailFragment;
         }
 
         @Override
         public void onTabUnselected(Tab tab, FragmentTransaction ft) {
-            ft.hide(mFragment);
+            ft.hide(mBrowseListFragment);
+            if (mDetailFragment != null) {
+                ft.hide(mDetailFragment);
+            }
         }
 
         @Override
         public void onTabSelected(Tab tab, FragmentTransaction ft) {
-            ft.show(mFragment);
+            ft.show(mBrowseListFragment);
+            if (mDetailFragment != null) {
+                ft.show(mDetailFragment);
+            }
         }
 
         @Override
@@ -341,10 +375,11 @@
             int actionCode = mRequest.getActionCode();
             switch (actionCode) {
                 case ContactsRequest.ACTION_ALL_CONTACTS:
-                    filter = new ContactListFilter(ContactListFilter.FILTER_TYPE_ALL_ACCOUNTS);
+                    filter = ContactListFilter.createFilterWithType(
+                            ContactListFilter.FILTER_TYPE_ALL_ACCOUNTS);
                     break;
                 case ContactsRequest.ACTION_CONTACTS_WITH_PHONES:
-                    filter = new ContactListFilter(
+                    filter = ContactListFilter.createFilterWithType(
                             ContactListFilter.FILTER_TYPE_WITH_PHONE_NUMBERS_ONLY);
                     break;
 
@@ -353,7 +388,8 @@
                 case ContactsRequest.ACTION_STREQUENT:
                     // For now they are treated the same as STARRED
                 case ContactsRequest.ACTION_STARRED:
-                    filter = new ContactListFilter(ContactListFilter.FILTER_TYPE_STARRED);
+                    filter = ContactListFilter.createFilterWithType(
+                            ContactListFilter.FILTER_TYPE_STARRED);
                     break;
             }
 
@@ -362,7 +398,8 @@
                 mContactListFilterController.setContactListFilter(filter, false);
                 mSearchMode = false;
             } else if (mRequest.getActionCode() == ContactsRequest.ACTION_ALL_CONTACTS) {
-                mContactListFilterController.setContactListFilter(new ContactListFilter(
+                mContactListFilterController.setContactListFilter(
+                        ContactListFilter.createFilterWithType(
                         ContactListFilter.FILTER_TYPE_ALL_ACCOUNTS), false);
             }
 
@@ -411,7 +448,11 @@
     }
 
     private void setupContactDetailFragment(final Uri contactLookupUri) {
-        mDetailFragment.loadUri(contactLookupUri);
+        mContactDetailFragment.loadUri(contactLookupUri);
+    }
+
+    private void setupGroupDetailFragment(Uri groupUri) {
+        mGroupDetailFragment.loadGroup(groupUri);
     }
 
     /**
@@ -462,11 +503,11 @@
 
         mListFragment.setVisibleScrollbarEnabled(!mSearchMode);
         mListFragment.setVerticalScrollbarPosition(
-                mContactContentDisplayed
+                mContentPaneDisplayed
                         ? View.SCROLLBAR_POSITION_LEFT
                         : View.SCROLLBAR_POSITION_RIGHT);
-        mListFragment.setSelectionVisible(mContactContentDisplayed);
-        mListFragment.setQuickContactEnabled(!mContactContentDisplayed);
+        mListFragment.setSelectionVisible(mContentPaneDisplayed);
+        mListFragment.setQuickContactEnabled(!mContentPaneDisplayed);
     }
 
     @Override
@@ -521,14 +562,14 @@
 
         @Override
         public void onSelectionChange() {
-            if (mContactContentDisplayed) {
+            if (mContentPaneDisplayed) {
                 setupContactDetailFragment(mListFragment.getSelectedContactUri());
             }
         }
 
         @Override
         public void onViewContactAction(Uri contactLookupUri) {
-            if (mContactContentDisplayed) {
+            if (mContentPaneDisplayed) {
                 setupContactDetailFragment(contactLookupUri);
             } else {
                 startActivity(new Intent(Intent.ACTION_VIEW, contactLookupUri));
@@ -595,17 +636,19 @@
             ContactListFilter currentFilter = mListFragment.getFilter();
             if (currentFilter != null
                     && currentFilter.filterType == ContactListFilter.FILTER_TYPE_SINGLE_CONTACT) {
-                filter = new ContactListFilter(ContactListFilter.FILTER_TYPE_ALL_ACCOUNTS);
+                filter = ContactListFilter.createFilterWithType(
+                        ContactListFilter.FILTER_TYPE_ALL_ACCOUNTS);
                 mListFragment.setFilter(filter);
             } else {
-                filter = new ContactListFilter(ContactListFilter.FILTER_TYPE_SINGLE_CONTACT);
+                filter = ContactListFilter.createFilterWithType(
+                        ContactListFilter.FILTER_TYPE_SINGLE_CONTACT);
                 mListFragment.setFilter(filter, false);
             }
             mContactListFilterController.setContactListFilter(filter, true);
         }
     }
 
-    private class DetailFragmentListener implements ContactDetailFragment.Listener {
+    private class ContactDetailFragmentListener implements ContactDetailFragment.Listener {
         @Override
         public void onContactNotFound() {
             // Nothing needs to be done here
@@ -670,6 +713,20 @@
         }
     }
 
+    private final class GroupBrowserActionListener implements OnGroupBrowserActionListener {
+
+        @Override
+        public void onViewGroupAction(Uri groupUri) {
+            if (mContentPaneDisplayed) {
+                setupGroupDetailFragment(groupUri);
+            } else {
+                Intent intent = new Intent(PeopleActivity.this, GroupDetailActivity.class);
+                intent.setData(groupUri);
+                startActivity(intent);
+            }
+        }
+    }
+
     public void startActivityAndForwardResult(final Intent intent) {
         intent.setFlags(Intent.FLAG_ACTIVITY_FORWARD_RESULT);
 
@@ -751,7 +808,7 @@
             return true;
         }
 
-        if (mDetailFragment != null && mDetailFragment.isOptionsMenuChanged()) {
+        if (mContactDetailFragment != null && mContactDetailFragment.isOptionsMenuChanged()) {
             return true;
         }
 
@@ -897,7 +954,7 @@
 
             case SUBACTIVITY_EDIT_CONTACT:
             case SUBACTIVITY_NEW_CONTACT: {
-                if (resultCode == RESULT_OK && mContactContentDisplayed) {
+                if (resultCode == RESULT_OK && mContentPaneDisplayed) {
                     mRequest.setActionCode(ContactsRequest.ACTION_VIEW_CONTACT);
                     mListFragment.reloadDataAndSetSelectedUri(data.getData());
                 }
@@ -1039,6 +1096,6 @@
 
     // Visible for testing
     public ContactDetailFragment getDetailFragment() {
-        return mDetailFragment;
+        return mContactDetailFragment;
     }
 }
diff --git a/src/com/android/contacts/editor/ContactEditorFragment.java b/src/com/android/contacts/editor/ContactEditorFragment.java
index 96d5843..8cab92a 100644
--- a/src/com/android/contacts/editor/ContactEditorFragment.java
+++ b/src/com/android/contacts/editor/ContactEditorFragment.java
@@ -66,6 +66,7 @@
 import android.provider.ContactsContract.CommonDataKinds.StructuredPostal;
 import android.provider.ContactsContract.CommonDataKinds.Website;
 import android.provider.ContactsContract.Contacts;
+import android.provider.ContactsContract.Groups;
 import android.provider.ContactsContract.Intents;
 import android.provider.ContactsContract.RawContacts;
 import android.provider.MediaStore;
@@ -1585,14 +1586,14 @@
     };
 
     /**
-     * The listener for the group meta data loader
+     * The listener for the group meta data loader for all groups.
      */
     private final LoaderManager.LoaderCallbacks<Cursor> mGroupLoaderListener =
             new LoaderCallbacks<Cursor>() {
 
         @Override
         public CursorLoader onCreateLoader(int id, Bundle args) {
-            return new GroupMetaDataLoader(mContext);
+            return new GroupMetaDataLoader(mContext, Groups.CONTENT_URI);
         }
 
         @Override
diff --git a/src/com/android/contacts/group/GroupBrowseListAdapter.java b/src/com/android/contacts/group/GroupBrowseListAdapter.java
index bccc207..c17fc08 100644
--- a/src/com/android/contacts/group/GroupBrowseListAdapter.java
+++ b/src/com/android/contacts/group/GroupBrowseListAdapter.java
@@ -16,15 +16,19 @@
 
 package com.android.contacts.group;
 
-import com.android.contacts.R;
 import com.android.contacts.GroupMetaData;
+import com.android.contacts.R;
 
+import android.content.ContentUris;
 import android.content.Context;
+import android.net.Uri;
+import android.provider.ContactsContract.Groups;
+import android.util.AttributeSet;
 import android.view.LayoutInflater;
 import android.view.View;
 import android.view.ViewGroup;
 import android.widget.BaseAdapter;
-import android.widget.ImageView;
+import android.widget.LinearLayout;
 import android.widget.TextView;
 
 import java.util.List;
@@ -59,21 +63,50 @@
 
     @Override
     public View getView(int position, View convertView, ViewGroup parent) {
-        if (convertView == null) {
-            convertView = mLayoutInflater.inflate(R.layout.group_browse_list_item, parent, false);
-        }
-        GroupMetaData group = getItem(position);
-        ImageView icon = (ImageView) convertView.findViewById(R.id.icon);
-        TextView label = (TextView) convertView.findViewById(R.id.label);
-        TextView account = (TextView) convertView.findViewById(R.id.account);
-        icon.setImageResource(R.drawable.ic_menu_display_all_holo_light);
-        label.setText(group.getTitle());
-        account.setText(group.getAccountName());
-
-        // Set the tag to be the GroupMetaData object, in order to extract group attributes from the
-        // view later.
-        convertView.setTag(group);
-        return convertView;
+        GroupListItem result = (GroupListItem) (convertView == null ?
+                mLayoutInflater.inflate(R.layout.group_browse_list_item, parent, false) :
+                convertView);
+        result.loadFromGroup(getItem(position));
+        return result;
     }
 
+    /**
+     * A row in a list of groups, where this row displays a single group's title
+     * and associated account.
+     */
+    public static class GroupListItem extends LinearLayout {
+
+        private TextView mLabel;
+        private TextView mAccount;
+        private Uri mUri;
+
+        public GroupListItem(Context context, AttributeSet attrs, int defStyle) {
+            super(context, attrs, defStyle);
+        }
+
+        public GroupListItem(Context context, AttributeSet attrs) {
+            super(context, attrs);
+        }
+
+        public GroupListItem(Context context) {
+            super(context);
+        }
+
+        @Override
+        protected void onFinishInflate() {
+            super.onFinishInflate();
+            mLabel = (TextView) findViewById(R.id.label);
+            mAccount = (TextView) findViewById(R.id.account);
+        }
+
+        public void loadFromGroup(GroupMetaData group) {
+            mLabel.setText(group.getTitle());
+            mAccount.setText(group.getAccountName());
+            mUri = ContentUris.withAppendedId(Groups.CONTENT_URI, group.getGroupId());
+        }
+
+        public Uri getUri() {
+            return mUri;
+        }
+    }
 }
\ No newline at end of file
diff --git a/src/com/android/contacts/group/GroupBrowseListFragment.java b/src/com/android/contacts/group/GroupBrowseListFragment.java
index d9d020e..150a00f 100644
--- a/src/com/android/contacts/group/GroupBrowseListFragment.java
+++ b/src/com/android/contacts/group/GroupBrowseListFragment.java
@@ -19,7 +19,7 @@
 import com.android.contacts.GroupMetaData;
 import com.android.contacts.GroupMetaDataLoader;
 import com.android.contacts.R;
-import com.android.contacts.activities.GroupDetailActivity;
+import com.android.contacts.group.GroupBrowseListAdapter.GroupListItem;
 
 import android.app.Activity;
 import android.app.Fragment;
@@ -27,10 +27,11 @@
 import android.app.LoaderManager.LoaderCallbacks;
 import android.content.Context;
 import android.content.CursorLoader;
-import android.content.Intent;
 import android.content.Loader;
 import android.database.Cursor;
+import android.net.Uri;
 import android.os.Bundle;
+import android.provider.ContactsContract.Groups;
 import android.view.LayoutInflater;
 import android.view.MotionEvent;
 import android.view.View;
@@ -51,6 +52,19 @@
 public class GroupBrowseListFragment extends Fragment
         implements OnFocusChangeListener, OnTouchListener {
 
+    /**
+     * Action callbacks that can be sent by a group list.
+     */
+    public interface OnGroupBrowserActionListener  {
+
+        /**
+         * Opens the specified group for viewing.
+         *
+         * @param groupUri for the group that the user wishes to view.
+         */
+        void onViewGroupAction(Uri groupUri);
+    }
+
     private static final String TAG = "GroupBrowseListFragment";
 
     private static final int LOADER_GROUPS = 1;
@@ -63,6 +77,8 @@
     private ListView mListView;
     private View mEmptyView;
 
+    private OnGroupBrowserActionListener mListener;
+
     public GroupBrowseListFragment() {
     }
 
@@ -96,14 +112,14 @@
     }
 
     /**
-     * The listener for the group meta data loader.
+     * The listener for the group meta data loader for all groups.
      */
     private final LoaderManager.LoaderCallbacks<Cursor> mGroupLoaderListener =
             new LoaderCallbacks<Cursor>() {
 
         @Override
         public CursorLoader onCreateLoader(int id, Bundle args) {
-            return new GroupMetaDataLoader(mContext);
+            return new GroupMetaDataLoader(mContext, Groups.CONTENT_URI);
         }
 
         @Override
@@ -144,21 +160,18 @@
         mListView.setOnItemClickListener(new OnItemClickListener() {
             @Override
             public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
-                startGroupDetailActivity((GroupMetaData) view.getTag());
+                GroupListItem groupListItem = (GroupListItem) view;
+                viewGroup(groupListItem.getUri());
             }
         });
     }
 
-    private void startGroupDetailActivity(GroupMetaData group) {
-        if (group == null) {
-            return;
-        }
-        Intent intent = new Intent(mContext, GroupDetailActivity.class);
-        intent.putExtra(GroupDetailActivity.KEY_ACCOUNT_TYPE, group.getAccountType());
-        intent.putExtra(GroupDetailActivity.KEY_ACCOUNT_NAME, group.getAccountName());
-        intent.putExtra(GroupDetailActivity.KEY_GROUP_ID, group.getGroupId());
-        intent.putExtra(GroupDetailActivity.KEY_GROUP_TITLE, group.getTitle());
-        mContext.startActivity(intent);
+    public void setListener(OnGroupBrowserActionListener listener) {
+        mListener = listener;
+    }
+
+    private void viewGroup(Uri groupUri) {
+        if (mListener != null) mListener.onViewGroupAction(groupUri);
     }
 
     private void hideSoftKeyboard() {
diff --git a/src/com/android/contacts/group/GroupDetailFragment.java b/src/com/android/contacts/group/GroupDetailFragment.java
index 98babac..8cffd05 100644
--- a/src/com/android/contacts/group/GroupDetailFragment.java
+++ b/src/com/android/contacts/group/GroupDetailFragment.java
@@ -17,21 +17,26 @@
 package com.android.contacts.group;
 
 import com.android.contacts.ContactPhotoManager;
+import com.android.contacts.GroupMetaData;
+import com.android.contacts.GroupMetaDataLoader;
 import com.android.contacts.R;
 import com.android.contacts.activities.GroupDetailActivity;
 import com.android.contacts.list.ContactListAdapter;
 import com.android.contacts.list.ContactListFilter;
 import com.android.contacts.list.DefaultContactListAdapter;
 
+import android.accounts.Account;
 import android.app.Activity;
 import android.app.Fragment;
 import android.app.LoaderManager;
 import android.app.LoaderManager.LoaderCallbacks;
+import android.content.ContentValues;
 import android.content.Context;
 import android.content.CursorLoader;
 import android.content.Intent;
 import android.content.Loader;
 import android.database.Cursor;
+import android.net.Uri;
 import android.os.Bundle;
 import android.provider.ContactsContract;
 import android.provider.ContactsContract.Directory;
@@ -43,24 +48,47 @@
 import android.widget.AdapterView;
 import android.widget.AdapterView.OnItemClickListener;
 import android.widget.ListView;
+import android.widget.TextView;
+
+import java.util.ArrayList;
 
 /**
  * Displays the details of a group and shows a list of actions possible for the group.
  */
 public class GroupDetailFragment extends Fragment implements OnScrollListener {
 
+    public static interface Listener {
+        /**
+         * The group title has been loaded
+         */
+        public void onGroupTitleUpdated(String title);
+
+        /**
+         * The number of group members has been determined
+         */
+        public void onGroupSizeUpdated(String size);
+    }
+
     private static final String TAG = "GroupDetailFragment";
 
-    private static final int LOADER_MEMBERS = 0;
+    private static final int LOADER_METADATA = 0;
+    private static final int LOADER_MEMBERS = 1;
 
     private Context mContext;
 
     private View mRootView;
+    private TextView mGroupTitle;
+    private TextView mGroupSize;
     private ListView mMemberListView;
 
+    private Listener mListener;
+
     private ContactListAdapter mAdapter;
     private ContactPhotoManager mPhotoManager;
 
+    private Uri mGroupUri;
+    private long mGroupId;
+
     public GroupDetailFragment() {
     }
 
@@ -80,7 +108,9 @@
     @Override
     public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedState) {
         mRootView = inflater.inflate(R.layout.group_detail_fragment, container, false);
-        mMemberListView = (ListView) mRootView.findViewById(R.id.member_list);
+        mGroupTitle = (TextView) mRootView.findViewById(R.id.group_title);
+        mGroupSize = (TextView) mRootView.findViewById(R.id.group_size);
+        mMemberListView = (ListView) mRootView.findViewById(android.R.id.list);
         mMemberListView.setOnItemClickListener(new OnItemClickListener() {
             @Override
             public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
@@ -90,22 +120,12 @@
         return mRootView;
     }
 
-    @Override
-    public void onActivityCreated(Bundle savedInstanceState) {
-        super.onActivityCreated(savedInstanceState);
-
-        Intent intent = getActivity().getIntent();
-        String accountType = intent.getStringExtra(GroupDetailActivity.KEY_ACCOUNT_TYPE);
-        String accountName = intent.getStringExtra(GroupDetailActivity.KEY_ACCOUNT_NAME);
-        long groupId = intent.getLongExtra(GroupDetailActivity.KEY_GROUP_ID, -1);
-        String groupTitle = intent.getStringExtra(GroupDetailActivity.KEY_GROUP_TITLE);
-
-        configureAdapter(accountType, accountName, groupId, groupTitle);
-        startGroupMembersLoader();
+    public void loadGroup(Uri groupUri) {
+        mGroupUri= groupUri;
+        startGroupMetadataLoader();
     }
 
-    private void configureAdapter(String accountType, String accountName,
-                long groupId, String groupTitle) {
+    private void configureAdapter(long groupId) {
         mAdapter = new DefaultContactListAdapter(getActivity());
         mAdapter.setSectionHeaderDisplayEnabled(false);
         mAdapter.setDisplayPhotos(true);
@@ -115,8 +135,7 @@
         mAdapter.setContactNameDisplayOrder(ContactsContract.Preferences.DISPLAY_ORDER_PRIMARY);
         mAdapter.setSortOrder(ContactsContract.Preferences.SORT_ORDER_PRIMARY);
         mAdapter.setPhotoLoader(mPhotoManager);
-        mAdapter.setFilter(new ContactListFilter(accountType, accountName, groupId, "", false,
-                groupTitle));
+        mAdapter.setFilter(ContactListFilter.createGroupFilter(groupId));
         mMemberListView.setAdapter(mAdapter);
     }
 
@@ -134,6 +153,18 @@
         }
     }
 
+    public void setListener(Listener value) {
+        mListener = value;
+    }
+
+    /**
+     * Start the loader to retrieve the metadata for this group.
+     */
+    private void startGroupMetadataLoader() {
+        getLoaderManager().destroyLoader(LOADER_METADATA);
+        getLoaderManager().restartLoader(LOADER_METADATA, null, mGroupMetadataLoaderListener);
+    }
+
     /**
      * Start the loader to retrieve the list of group members.
      */
@@ -143,6 +174,30 @@
     }
 
     /**
+     * The listener for the group metadata loader.
+     */
+    private final LoaderManager.LoaderCallbacks<Cursor> mGroupMetadataLoaderListener =
+            new LoaderCallbacks<Cursor>() {
+
+        @Override
+        public CursorLoader onCreateLoader(int id, Bundle args) {
+            return new GroupMetaDataLoader(mContext, mGroupUri);
+        }
+
+        @Override
+        public void onLoadFinished(Loader<Cursor> loader, Cursor data) {
+            bindGroupMetaData(data);
+
+            // Retrieve the list of members
+            configureAdapter(mGroupId);
+            startGroupMembersLoader();
+        }
+
+        @Override
+        public void onLoaderReset(Loader<Cursor> loader) {}
+    };
+
+    /**
      * The listener for the group members list loader
      */
     private final LoaderManager.LoaderCallbacks<Cursor> mGroupMemberListLoaderListener =
@@ -157,13 +212,38 @@
 
         @Override
         public void onLoadFinished(Loader<Cursor> loader, Cursor data) {
-            mAdapter.changeCursor(loader.getId(), data);
+            updateSize(Integer.toString(data.getCount()));
+            mAdapter.changeCursor(0, data);
         }
 
         @Override
         public void onLoaderReset(Loader<Cursor> loader) {}
     };
 
+    private void bindGroupMetaData(Cursor cursor) {
+        cursor.moveToPosition(-1);
+        if (cursor.moveToNext()) {
+            mGroupId = cursor.getLong(GroupMetaDataLoader.GROUP_ID);
+            updateTitle(cursor.getString(GroupMetaDataLoader.TITLE));
+        }
+    }
+
+    private void updateTitle(String title) {
+        if (mGroupTitle != null) {
+            mGroupTitle.setText(title);
+        } else {
+            mListener.onGroupTitleUpdated(title);
+        }
+    }
+
+    private void updateSize(String size) {
+        if (mGroupSize != null) {
+            mGroupSize.setText(size);
+        } else {
+            mListener.onGroupSizeUpdated(size);
+        }
+    }
+
     @Override
     public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount,
             int totalItemCount) {
diff --git a/src/com/android/contacts/list/ContactBrowseListFragment.java b/src/com/android/contacts/list/ContactBrowseListFragment.java
index 1ecfff1..7f7dad4 100644
--- a/src/com/android/contacts/list/ContactBrowseListFragment.java
+++ b/src/com/android/contacts/list/ContactBrowseListFragment.java
@@ -658,7 +658,8 @@
     private void restoreFilter() {
         mFilter = ContactListFilter.restoreFromPreferences(mPrefs);
         if (mFilter == null) {
-            mFilter = new ContactListFilter(ContactListFilter.FILTER_TYPE_ALL_ACCOUNTS);
+            mFilter = ContactListFilter.createFilterWithType(
+                    ContactListFilter.FILTER_TYPE_ALL_ACCOUNTS);
         }
     }
 
diff --git a/src/com/android/contacts/list/ContactEntryListFragment.java b/src/com/android/contacts/list/ContactEntryListFragment.java
index fcced62..a080b37 100644
--- a/src/com/android/contacts/list/ContactEntryListFragment.java
+++ b/src/com/android/contacts/list/ContactEntryListFragment.java
@@ -70,7 +70,7 @@
                 LoaderCallbacks<Cursor> {
     private static final String TAG = "ContactEntryListFragment";
 
-    // TODO: Make this protected. This should not be used from the ContactBrowserActivity but
+    // TODO: Make this protected. This should not be used from the PeopleActivity but
     // instead use the new startActivityWithResultFromFragment API
     public static final int ACTIVITY_REQUEST_CODE_PICKER = 1;
 
diff --git a/src/com/android/contacts/list/ContactListFilter.java b/src/com/android/contacts/list/ContactListFilter.java
index c53859b..0651986 100644
--- a/src/com/android/contacts/list/ContactListFilter.java
+++ b/src/com/android/contacts/list/ContactListFilter.java
@@ -45,40 +45,49 @@
     private static final String KEY_GROUP_READ_ONLY = "filter.groupReadOnly";
     private static final String KEY_GROUP_TITLE = "filter.groupTitle";
 
-    public int filterType;
-    public String accountType;
-    public String accountName;
-    public Drawable icon;
+    public final int filterType;
+    public final String accountType;
+    public final String accountName;
+    public final Drawable icon;
     public long groupId;
     public String groupSourceId;
-    public boolean groupReadOnly;
-    public String title;
+    public final boolean groupReadOnly;
+    public final String title;
     private String mId;
 
-    public ContactListFilter(int filterType) {
+    public ContactListFilter(int filterType, String accountType, String accountName, Drawable icon,
+            long groupId, String groupSourceId, boolean groupReadOnly, String title) {
         this.filterType = filterType;
-    }
-
-    public ContactListFilter(
-            String accountType, String accountName, Drawable icon, String title) {
-        this.filterType = ContactListFilter.FILTER_TYPE_ACCOUNT;
         this.accountType = accountType;
         this.accountName = accountName;
         this.icon = icon;
-        this.title = title;
-    }
-
-    public ContactListFilter(String accountType, String accountName, long groupId,
-            String groupSourceId, boolean groupReadOnly, String title) {
-        this.filterType = ContactListFilter.FILTER_TYPE_GROUP;
-        this.accountType = accountType;
-        this.accountName = accountName;
         this.groupId = groupId;
         this.groupSourceId = groupSourceId;
         this.groupReadOnly = groupReadOnly;
         this.title = title;
     }
 
+    public static ContactListFilter createFilterWithType(int filterType) {
+        return new ContactListFilter(filterType, null, null, null, 0, null, false, null);
+    }
+
+    public static ContactListFilter createGroupFilter(long groupId) {
+        return new ContactListFilter(ContactListFilter.FILTER_TYPE_GROUP, null, null, null, groupId,
+                null, false, null);
+    }
+
+    public static ContactListFilter createGroupFilter(String accountType, String accountName,
+            long groupId, String groupSourceId, boolean groupReadOnly, String title) {
+        return new ContactListFilter(ContactListFilter.FILTER_TYPE_GROUP, accountType, accountName,
+                null, groupId, groupSourceId, groupReadOnly, title);
+    }
+
+    public static ContactListFilter createAccountFilter(String accountType, String accountName,
+            Drawable icon, String title) {
+        return new ContactListFilter(ContactListFilter.FILTER_TYPE_ACCOUNT, accountType,
+                accountName, icon, 0, null, false, title);
+    }
+
     /**
      * Returns true if this filter is based on data and may become invalid over time.
      */
@@ -188,14 +197,14 @@
             return null;
         }
 
-        ContactListFilter filter = new ContactListFilter(filterType);
-        filter.accountName = prefs.getString(KEY_ACCOUNT_NAME, null);
-        filter.accountType = prefs.getString(KEY_ACCOUNT_TYPE, null);
-        filter.groupId = prefs.getLong(KEY_GROUP_ID, -1);
-        filter.groupSourceId = prefs.getString(KEY_GROUP_SOURCE_ID, null);
-        filter.groupReadOnly = prefs.getBoolean(KEY_GROUP_READ_ONLY, false);
-        filter.title = prefs.getString(KEY_GROUP_TITLE, "group");
-        return filter;
+        String accountName = prefs.getString(KEY_ACCOUNT_NAME, null);
+        String accountType = prefs.getString(KEY_ACCOUNT_TYPE, null);
+        long groupId = prefs.getLong(KEY_GROUP_ID, -1);
+        String groupSourceId = prefs.getString(KEY_GROUP_SOURCE_ID, null);
+        boolean groupReadOnly = prefs.getBoolean(KEY_GROUP_READ_ONLY, false);
+        String title = prefs.getString(KEY_GROUP_TITLE, "group");
+        return new ContactListFilter(filterType, accountType, accountName, null, groupId,
+                groupSourceId, groupReadOnly, title);
     }
 
 
@@ -210,18 +219,17 @@
     }
 
     public static final Parcelable.Creator<ContactListFilter> CREATOR =
-            new Parcelable.Creator<ContactListFilter>()
-    {
+            new Parcelable.Creator<ContactListFilter>() {
         @Override
         public ContactListFilter createFromParcel(Parcel source) {
             int filterType = source.readInt();
-            ContactListFilter filter = new ContactListFilter(filterType);
-            filter.accountName = source.readString();
-            filter.accountType = source.readString();
-            filter.groupId = source.readLong();
-            filter.groupSourceId = source.readString();
-            filter.groupReadOnly = source.readInt() != 0;
-            return filter;
+            String accountName = source.readString();
+            String accountType = source.readString();
+            long groupId = source.readLong();
+            String groupSourceId = source.readString();
+            boolean groupReadOnly = source.readInt() != 0;
+            return new ContactListFilter(filterType, accountType, accountName, null, groupId,
+                    groupSourceId, groupReadOnly, null);
         }
 
         @Override
diff --git a/src/com/android/contacts/list/ContactListFilterController.java b/src/com/android/contacts/list/ContactListFilterController.java
index 4da5baa..533f24a 100644
--- a/src/com/android/contacts/list/ContactListFilterController.java
+++ b/src/com/android/contacts/list/ContactListFilterController.java
@@ -160,10 +160,10 @@
         }
 
         if (mAccountCount != 1) {
-            mFilters.append(mNextFilterId++,
-                    new ContactListFilter(ContactListFilter.FILTER_TYPE_ALL_ACCOUNTS));
-            mFilters.append(mNextFilterId++,
-                    new ContactListFilter(ContactListFilter.FILTER_TYPE_STARRED));
+            mFilters.append(mNextFilterId++, ContactListFilter.createFilterWithType(
+                    ContactListFilter.FILTER_TYPE_ALL_ACCOUNTS));
+            mFilters.append(mNextFilterId++, ContactListFilter.createFilterWithType(
+                    ContactListFilter.FILTER_TYPE_STARRED));
         }
 
         for (int index = 0; index < count; index++) {
@@ -174,7 +174,8 @@
 
             // If we only have one account, don't show it as "account", instead show it as "all"
             if (firstAndOnly) {
-                filter = new ContactListFilter(ContactListFilter.FILTER_TYPE_ALL_ACCOUNTS);
+                filter = ContactListFilter.createFilterWithType(
+                        ContactListFilter.FILTER_TYPE_ALL_ACCOUNTS);
             }
 
             mFilters.append(mNextFilterId++, filter);
@@ -186,14 +187,14 @@
             }
 
             if (firstAndOnly) {
-                mFilters.append(mNextFilterId++,
-                        new ContactListFilter(ContactListFilter.FILTER_TYPE_STARRED));
+                mFilters.append(mNextFilterId++, ContactListFilter.createFilterWithType(
+                        ContactListFilter.FILTER_TYPE_STARRED));
             }
         }
 
         if (mAccountCount > 0) {
-            mFilters.append(
-                    mNextFilterId++, new ContactListFilter(ContactListFilter.FILTER_TYPE_CUSTOM));
+            mFilters.append(mNextFilterId++, ContactListFilter.createFilterWithType(
+                    ContactListFilter.FILTER_TYPE_CUSTOM));
         }
 
         boolean filterChanged = false;
@@ -222,11 +223,14 @@
     private void setContactListFilter(int filterId) {
         ContactListFilter filter;
         if (filterId == ContactListFilter.FILTER_TYPE_ALL_ACCOUNTS) {
-            filter = new ContactListFilter(ContactListFilter.FILTER_TYPE_ALL_ACCOUNTS);
+            filter = ContactListFilter.createFilterWithType(
+                    ContactListFilter.FILTER_TYPE_ALL_ACCOUNTS);
         } else if (filterId == ContactListFilter.FILTER_TYPE_CUSTOM) {
-            filter = new ContactListFilter(ContactListFilter.FILTER_TYPE_CUSTOM);
+            filter = ContactListFilter.createFilterWithType(
+                    ContactListFilter.FILTER_TYPE_CUSTOM);
         } else if (filterId == ContactListFilter.FILTER_TYPE_STARRED) {
-            filter = new ContactListFilter(ContactListFilter.FILTER_TYPE_STARRED);
+            filter = ContactListFilter.createFilterWithType(
+                    ContactListFilter.FILTER_TYPE_STARRED);
         } else {
             filter = mFilters.get(filterId);
             if (filter == null) {
@@ -286,7 +290,7 @@
     }
 
     public void selectCustomFilter() {
-        mFilter = new ContactListFilter(ContactListFilter.FILTER_TYPE_CUSTOM);
+        mFilter = ContactListFilter.createFilterWithType(ContactListFilter.FILTER_TYPE_CUSTOM);
         notifyContactListFilterChanged();
     }
 
diff --git a/src/com/android/contacts/list/ContactListFilterLoader.java b/src/com/android/contacts/list/ContactListFilterLoader.java
index 82749ff..6bca4ad 100644
--- a/src/com/android/contacts/list/ContactListFilterLoader.java
+++ b/src/com/android/contacts/list/ContactListFilterLoader.java
@@ -81,7 +81,8 @@
         for (Account account : accounts) {
             AccountType accountType = accountTypes.getAccountType(account.type);
             Drawable icon = accountType != null ? accountType.getDisplayIcon(getContext()) : null;
-            results.add(new ContactListFilter(account.type, account.name, icon, account.name));
+            results.add(ContactListFilter.createAccountFilter(account.type, account.name, icon,
+                    account.name));
         }
 
         ContentResolver resolver = context.getContentResolver();
@@ -111,8 +112,8 @@
                     }
                 } else {
                     String title = cursor.getString(GroupQuery.TITLE);
-                    results.add(new ContactListFilter(accountType, accountName, groupId,
-                            groupSourceId, groupReadOnly, title));
+                    results.add(ContactListFilter.createGroupFilter(accountType, accountName,
+                            groupId, groupSourceId, groupReadOnly, title));
                 }
             }
         } finally {
diff --git a/src/com/android/contacts/list/ContactPickerFragment.java b/src/com/android/contacts/list/ContactPickerFragment.java
index 17e3fb9..6bfca57 100644
--- a/src/com/android/contacts/list/ContactPickerFragment.java
+++ b/src/com/android/contacts/list/ContactPickerFragment.java
@@ -151,8 +151,8 @@
     protected ContactEntryListAdapter createListAdapter() {
         if (!isLegacyCompatibilityMode()) {
             DefaultContactListAdapter adapter = new DefaultContactListAdapter(getActivity());
-            adapter.setFilter(
-                    new ContactListFilter(ContactListFilter.FILTER_TYPE_ALL_ACCOUNTS));
+            adapter.setFilter(ContactListFilter.createFilterWithType(
+                    ContactListFilter.FILTER_TYPE_ALL_ACCOUNTS));
             adapter.setSectionHeaderDisplayEnabled(true);
             adapter.setDisplayPhotos(true);
             adapter.setQuickContactEnabled(false);
diff --git a/src/com/android/contacts/list/StrequentAdapter.java b/src/com/android/contacts/list/StrequentAdapter.java
new file mode 100644
index 0000000..4c6109a
--- /dev/null
+++ b/src/com/android/contacts/list/StrequentAdapter.java
@@ -0,0 +1,232 @@
+/*
+ * Copyright (C) 2011 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 com.android.contacts.ContactPhotoManager;
+import com.android.contacts.R;
+import com.android.contacts.StrequentMetaDataLoader;
+
+import android.content.Context;
+import android.database.Cursor;
+import android.net.Uri;
+import android.provider.ContactsContract.Contacts;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.View.OnClickListener;
+import android.view.ViewGroup;
+import android.widget.BaseAdapter;
+import android.widget.ImageView;
+import android.widget.TextView;
+
+import java.util.ArrayList;
+
+/**
+ * Arranges contacts in {@link StrequentFragment} (aka favorites) according to if the contact
+ * is starred or not. Also shows two contacts per row.
+ */
+public class StrequentAdapter extends BaseAdapter implements OnClickListener {
+
+    private LayoutInflater mInflater;
+    private ArrayList<StrequentEntry> mAllEntries;
+    private ContactPhotoManager mPhotoManager;
+    private Listener mListener;
+    private int mMostFrequentCount;
+    private int mStarredCount;
+    private static final int NUMCOLS = 2;
+
+    public StrequentAdapter(Context context, Listener listener) {
+        mInflater = LayoutInflater.from(context);
+        mPhotoManager = ContactPhotoManager.createContactPhotoManager(context);
+        mListener = listener;
+    }
+
+    public void setCursor(Cursor cursor){
+        populateStrequentEntries(cursor);
+    }
+
+    private void populateStrequentEntries(Cursor cursor) {
+        mAllEntries = new ArrayList<StrequentEntry>();
+        mMostFrequentCount = mStarredCount = 0;
+
+        while (cursor.moveToNext()) {
+            StrequentEntry contact = new StrequentEntry();
+
+            contact.id = cursor.getLong(StrequentMetaDataLoader.CONTACT_ID);
+            contact.photoId = cursor.getLong(StrequentMetaDataLoader.PHOTO_ID);
+            contact.name = cursor.getString(StrequentMetaDataLoader.DISPLAY_NAME);
+
+            // Adding Starred Contact
+            if (cursor.getInt(StrequentMetaDataLoader.STARRED) == 1) {
+                mStarredCount++;
+            } else {
+                mMostFrequentCount++;
+            }
+            mAllEntries.add(contact);
+        }
+        this.notifyDataSetChanged();
+    }
+
+    @Override
+    public int getCount() {
+        return mAllEntries.size() / NUMCOLS;
+    }
+
+    @Override
+    public Object getItem(int position) {
+        return mAllEntries.get(position);
+    }
+
+    @Override
+    public long getItemId(int position) {
+        return mAllEntries.get(position).id;
+    }
+
+    @Override
+    public View getView(int position, View convertView, ViewGroup parent) {
+        ViewHolder holder;
+        // Note: For now, every row except for the last row will have 2 columns
+        int index = position * NUMCOLS;
+
+        // Try to recycle convertView
+        if (convertView != null) {
+            holder = (ViewHolder) convertView.getTag();
+        } else {
+            // Must create new View
+            convertView = mInflater.inflate(R.layout.contact_tile_row_regular, null);
+            holder = new ViewHolder(convertView);
+
+            holder.getLayoutLeft().setOnClickListener(this);
+            holder.getLayoutRight().setOnClickListener(this);
+
+            convertView.setTag(holder);
+        }
+
+        holder.getTextLeft().setText(mAllEntries.get(index).name);
+        mPhotoManager.loadPhoto(holder.getImageLeft(), mAllEntries.get(index).photoId);
+        holder.getLayoutLeft().setTag(mAllEntries.get(index));
+
+        if (++index < mAllEntries.size()) {
+            holder.getTextRight().setText(mAllEntries.get(index).name);
+            mPhotoManager.loadPhoto(holder.mImageRight, mAllEntries.get(index).photoId);
+            holder.getLayoutRight().setTag(mAllEntries.get(index));
+        } else {
+            holder.getTextRight().setText(null);
+            holder.getImageRight().setImageBitmap(null);
+            holder.getLayoutRight().setOnClickListener(null);
+        }
+
+        return convertView;
+    }
+
+    @Override
+    public int getViewTypeCount() {
+        return 1;
+    }
+
+    @Override
+    public int getItemViewType(int position) {
+        return 1;
+    }
+
+    /**
+     * Class it hold views for layout to help make wonderful listview faster
+     */
+    private static class ViewHolder {
+        private TextView mTextLeft, mTextRight;
+        private ImageView mImageLeft, mImageRight;
+        private View mLayoutLeft, mLayoutRight;
+
+        public ViewHolder(View convertView){
+            // Left Column
+            mTextLeft = (TextView) convertView.findViewById(R.id.contactTile_left_name);
+            mImageLeft = (ImageView) convertView.findViewById(R.id.contactTile_left_image);
+            mLayoutLeft = convertView.findViewById(R.id.contactTile_row_left);
+
+            // Right Column
+            mTextRight = (TextView) convertView.findViewById(R.id.contactTile_right_name);
+            mImageRight = (ImageView) convertView.findViewById(R.id.contactTile_right_image);
+            mLayoutRight = convertView.findViewById(R.id.contactTile_row_right);
+        }
+
+        public TextView getTextLeft() {
+            return mTextLeft;
+        }
+
+        public void setTextLeft(TextView textLeft) {
+            this.mTextLeft = textLeft;
+        }
+
+        public TextView getTextRight() {
+            return mTextRight;
+        }
+
+        public void setTextRight(TextView textRight) {
+            this.mTextRight = textRight;
+        }
+
+        public ImageView getImageLeft() {
+            return mImageLeft;
+        }
+
+        public void setImageLeft(ImageView imageLeft) {
+            this.mImageLeft = imageLeft;
+        }
+
+        public ImageView getImageRight() {
+            return mImageRight;
+        }
+
+        public void setImageRight(ImageView imageRight) {
+            this.mImageRight = imageRight;
+        }
+
+        public View getLayoutLeft() {
+            return mLayoutLeft;
+        }
+
+        public void setLayoutLeft(View layoutLeft) {
+            this.mLayoutLeft = layoutLeft;
+        }
+
+        public View getLayoutRight() {
+            return mLayoutRight;
+        }
+
+        public void setLayoutRight(View layoutRight) {
+            this.mLayoutRight = layoutRight;
+        }
+    }
+
+    /**
+     * Class to hold contact information
+     */
+    private static class StrequentEntry {
+        public long id;
+        public long photoId;
+        public String name;
+    }
+
+    @Override
+    public void onClick(View v) {
+        StrequentEntry entry = (StrequentEntry)v.getTag();
+        Uri data = Uri.withAppendedPath(Contacts.CONTENT_URI, String.valueOf(entry.id));
+        mListener.onContactSelected(data);
+    }
+
+    public interface Listener {
+        public void onContactSelected(Uri contactUri);
+    }
+}
diff --git a/src/com/android/contacts/list/StrequentContactListFragment.java b/src/com/android/contacts/list/StrequentContactListFragment.java
index 393e698..47cc7be 100644
--- a/src/com/android/contacts/list/StrequentContactListFragment.java
+++ b/src/com/android/contacts/list/StrequentContactListFragment.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2010 The Android Open Source Project
+ * Copyright (C) 2011 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.
@@ -16,94 +16,94 @@
 package com.android.contacts.list;
 
 import com.android.contacts.R;
+import com.android.contacts.StrequentMetaDataLoader;
 
+import android.app.Activity;
+import android.app.Fragment;
+import android.app.LoaderManager;
+import android.app.LoaderManager.LoaderCallbacks;
+import android.content.Context;
+import android.content.CursorLoader;
+import android.content.Loader;
+import android.database.Cursor;
+import android.net.Uri;
+import android.os.Bundle;
 import android.view.LayoutInflater;
 import android.view.View;
 import android.view.ViewGroup;
-import android.view.View.OnClickListener;
+import android.widget.ListView;
 
 /**
  * Fragment containing a list of starred contacts followed by a list of frequently contacted.
  */
-public class StrequentContactListFragment extends ContactBrowseListFragment
-        implements OnClickListener {
+public class StrequentContactListFragment extends Fragment {
+    public interface Listener {
+        public void onContactSelected(Uri contactUri);
+    }
 
-    private static final int CALL_BUTTON_ID = android.R.id.button1;
+    private static int LOADER_STREQUENT = 1;
 
-    private boolean mStarredContactsIncluded = true;
-    private boolean mFrequentlyContactedContactsIncluded = true;
+    private Listener mListener;
+    private StrequentAdapter mAdapter;
+    private ListView mListView;
+    private Context mContext;
 
-    public StrequentContactListFragment() {
-        setSectionHeaderDisplayEnabled(false);
-        setPhotoLoaderEnabled(true);
+    @Override
+    public void onAttach(Activity activity) {
+        super.onAttach(activity);
+        mAdapter = new StrequentAdapter(getActivity(), mAdapterListener);
+        mContext = activity;
     }
 
     @Override
-    protected boolean isNameHighlighingEnabled() {
-        // Since the list is not ordered alphabetically, we don't need to highlight the part
-        // that is used for sorting.
-        return false;
+    public View onCreateView(LayoutInflater inflater, ViewGroup container,
+            Bundle savedInstanceState) {
+        View v = inflater.inflate(R.layout.strequent_fragment, container, false);
+        mListView = (ListView) v.findViewById(R.id.strequent_list);
+        mListView.setItemsCanFocus(true);
+        return v;
     }
 
-    public void setStarredContactsIncluded(boolean flag) {
-        mStarredContactsIncluded = flag;
-        configureAdapter();
-    }
-
-    public void setFrequentlyContactedContactsIncluded(boolean flag) {
-        mFrequentlyContactedContactsIncluded = flag;
-        configureAdapter();
+    public void setListener(Listener listener) {
+        mListener = listener;
     }
 
     @Override
-    protected void onItemClick(int position, long id) {
-        ContactListAdapter adapter = getAdapter();
-        viewContact(adapter.getContactUri(position));
+    public void onStart(){
+        super.onStart();
+        getLoaderManager().restartLoader(LOADER_STREQUENT, null, mStrequentLoaderListener);
     }
 
-    @Override
-    protected ContactListAdapter createListAdapter() {
-        StrequentContactListAdapter adapter =
-                new StrequentContactListAdapter(getActivity(), CALL_BUTTON_ID);
-        adapter.setSectionHeaderDisplayEnabled(false);
-        adapter.setDisplayPhotos(true);
-        adapter.setQuickContactEnabled(true);
-        adapter.setCallButtonListener(this);
+    /**
+     * The listener for the strequent meta data loader.
+     */
+    private final LoaderManager.LoaderCallbacks<Cursor> mStrequentLoaderListener =
+            new LoaderCallbacks<Cursor>() {
 
-        return adapter;
-    }
-
-    @Override
-    protected void configureAdapter() {
-        super.configureAdapter();
-
-        StrequentContactListAdapter adapter = (StrequentContactListAdapter)getAdapter();
-        if (adapter != null) {
-            adapter.setStarredContactsIncluded(mStarredContactsIncluded);
-            adapter.setFrequentlyContactedContactsIncluded(mFrequentlyContactedContactsIncluded);
+        @Override
+        public CursorLoader onCreateLoader(int id, Bundle args) {
+            return new StrequentMetaDataLoader(mContext);
         }
-    }
 
-    @Override
-    protected View inflateView(LayoutInflater inflater, ViewGroup container) {
-        return inflater.inflate(R.layout.contacts_list_content, null);
-    }
+        @Override
+        public void onLoadFinished(Loader<Cursor> loader, Cursor data) {
+            mAdapter.setCursor(data);
+            mListView.setAdapter(mAdapter);
+        }
 
-    @Override
-    protected void prepareEmptyView() {
-        setEmptyText(R.string.noFavoritesHelpText);
-    }
+        @Override
+        public void onLoaderReset(Loader<Cursor> loader) {
+            mAdapter.setCursor(null);
+        }
+    };
 
-    @Override
-    public void onClick(View v) {
-        int id = v.getId();
-        switch (id) {
-            case CALL_BUTTON_ID: {
-                final int position = (Integer)v.getTag();
-                ContactListAdapter adapter = getAdapter();
-                callContact(adapter.getContactUri(position));
-                break;
+    private StrequentAdapter.Listener mAdapterListener =
+            new StrequentAdapter.Listener() {
+        @Override
+        public void onContactSelected(Uri contactUri) {
+            if (mListener != null) {
+                mListener.onContactSelected(contactUri);
             }
         }
-    }
+    };
 }
diff --git a/tests/src/com/android/contacts/tests/allintents/AllIntentsActivity.java b/tests/src/com/android/contacts/tests/allintents/AllIntentsActivity.java
index 03b6302..71012de 100644
--- a/tests/src/com/android/contacts/tests/allintents/AllIntentsActivity.java
+++ b/tests/src/com/android/contacts/tests/allintents/AllIntentsActivity.java
@@ -58,7 +58,7 @@
     private static final String ANDROID_CONTACTS_PACKAGE = "com.android.contacts";
 
     private static final String CONTACT_LIST_ACTIVITY_CLASS_NAME =
-            "com.android.contacts.activities.ContactBrowserActivity";
+            "com.android.contacts.activities.PeopleActivity";
 
     public enum ContactsIntent {
         LIST_DEFAULT,
