diff --git a/res/layout-finger/contacts_list_content.xml b/res/layout-finger/contacts_list_content.xml
index 4dd680f..f697612 100644
--- a/res/layout-finger/contacts_list_content.xml
+++ b/res/layout-finger/contacts_list_content.xml
@@ -23,7 +23,7 @@
         >
 
     <view
-        class="com.android.contacts.PinnedHeaderListView" 
+        class="com.android.contacts.widget.PinnedHeaderListView" 
         android:id="@android:id/list"
         android:layout_width="match_parent"
         android:layout_height="0dip"
diff --git a/res/layout-finger/contacts_list_search_results.xml b/res/layout-finger/contacts_list_search_results.xml
index 244ca80..04c1f13 100644
--- a/res/layout-finger/contacts_list_search_results.xml
+++ b/res/layout-finger/contacts_list_search_results.xml
@@ -53,7 +53,7 @@
     </LinearLayout>
 
     <view
-        class="com.android.contacts.PinnedHeaderListView"
+        class="com.android.contacts.widget.PinnedHeaderListView"
         android:id="@android:id/list"
         android:layout_width="match_parent"
         android:layout_height="match_parent"
diff --git a/src/com/android/contacts/ContactsListActivity.java b/src/com/android/contacts/ContactsListActivity.java
index 400763e..8303414 100644
--- a/src/com/android/contacts/ContactsListActivity.java
+++ b/src/com/android/contacts/ContactsListActivity.java
@@ -490,15 +490,6 @@
     public TextHighlightingAnimation mHighlightingAnimation;
     private SearchEditText mSearchEditText;
 
-    /**
-     * An approximation of the background color of the pinned header. This color
-     * is used when the pinned header is being pushed up.  At that point the header
-     * "fades away".  Rather than computing a faded bitmap based on the 9-patch
-     * normally used for the background, we will use a solid color, which will
-     * provide better performance and reduced complexity.
-     */
-    public int mPinnedHeaderBackgroundColor;
-
     private ContentObserver mProviderStatusObserver = new ContentObserver(new Handler()) {
 
         @Override
@@ -617,14 +608,6 @@
         mAdapter = (ContactEntryListAdapter)adapter;
         setListAdapter(mAdapter);
 
-        if (list instanceof PinnedHeaderListView && mConfig.isSectionHeaderDisplayEnabled()) {
-            mPinnedHeaderBackgroundColor =
-                    getResources().getColor(R.color.pinned_header_background);
-            PinnedHeaderListView pinnedHeaderList = (PinnedHeaderListView)list;
-            View pinnedHeader = inflater.inflate(R.layout.list_section, list, false);
-            pinnedHeaderList.setPinnedHeaderView(pinnedHeader);
-        }
-
         list.setOnScrollListener(this);
         list.setOnKeyListener(this);
         list.setOnFocusChangeListener(this);
@@ -653,9 +636,6 @@
 
     public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount,
             int totalItemCount) {
-        if (view instanceof PinnedHeaderListView) {
-            ((PinnedHeaderListView)view).configureHeaderView(firstVisibleItem);
-        }
     }
 
     public void onScrollStateChanged(AbsListView view, int scrollState) {
@@ -674,7 +654,6 @@
         }
     }
 
-
     /**
      * Configures search UI.
      */
@@ -2446,9 +2425,4 @@
         public String phoneNumber;
     }
 
-    public final static class PinnedHeaderCache {
-        public TextView titleView;
-        public ColorStateList textColor;
-        public Drawable background;
-    }
 }
diff --git a/src/com/android/contacts/list/ContactEntryListAdapter.java b/src/com/android/contacts/list/ContactEntryListAdapter.java
index a353fed..2cf12c5 100644
--- a/src/com/android/contacts/list/ContactEntryListAdapter.java
+++ b/src/com/android/contacts/list/ContactEntryListAdapter.java
@@ -16,19 +16,15 @@
 package com.android.contacts.list;
 
 import android.content.Context;
-import android.widget.CursorAdapter;
 
 /**
  * Common base class for various contact-related lists, e.g. contact list, phone number list
  * etc.
  */
-public abstract class ContactEntryListAdapter extends CursorAdapter {
-
-    private final Context mContext;
+public abstract class ContactEntryListAdapter extends PinnedHeaderListAdapter {
 
     public ContactEntryListAdapter(Context context) {
-        super(context, null, false);
-        this.mContext = context;
+        super(context);
     }
 
     public Context getContext() {
diff --git a/src/com/android/contacts/list/ContactEntryListConfiguration.java b/src/com/android/contacts/list/ContactEntryListConfiguration.java
index 98ad73a..26eeb72 100644
--- a/src/com/android/contacts/list/ContactEntryListConfiguration.java
+++ b/src/com/android/contacts/list/ContactEntryListConfiguration.java
@@ -18,8 +18,10 @@
 
 import com.android.contacts.ContactsApplicationController;
 import com.android.contacts.ContactsListActivity;
+import com.android.contacts.widget.PinnedHeaderListView;
 
 import android.content.Context;
+import android.view.View;
 import android.widget.ListAdapter;
 import android.widget.ListView;
 
@@ -60,6 +62,22 @@
         controller.setListView(listView);
 
         ((ContactsListActivity)mContext).setupListView(adapter);
+
+        configurePinnedHeader(listView, adapter);
+    }
+
+    private void configurePinnedHeader(ListView listView, ListAdapter adapter) {
+        if (!mSectionHeaderDisplayEnabled) {
+            return;
+        }
+
+        if (listView instanceof PinnedHeaderListView
+                && adapter instanceof PinnedHeaderListAdapter) {
+            PinnedHeaderListView pinnedHeaderList = (PinnedHeaderListView)listView;
+            PinnedHeaderListAdapter pinnedHeaderListAdapter = (PinnedHeaderListAdapter)adapter;
+            View headerView = pinnedHeaderListAdapter.createPinnedHeaderView(pinnedHeaderList);
+            pinnedHeaderList.setPinnedHeaderView(headerView);
+        }
     }
 
     public void setSectionHeaderDisplayEnabled(boolean flag) {
diff --git a/src/com/android/contacts/list/ContactItemListAdapter.java b/src/com/android/contacts/list/ContactItemListAdapter.java
index d7cd0c9..6b228c6 100644
--- a/src/com/android/contacts/list/ContactItemListAdapter.java
+++ b/src/com/android/contacts/list/ContactItemListAdapter.java
@@ -19,16 +19,13 @@
 import com.android.contacts.ContactPresenceIconUtil;
 import com.android.contacts.ContactsListActivity;
 import com.android.contacts.ContactsSectionIndexer;
-import com.android.contacts.PinnedHeaderListView;
 import com.android.contacts.R;
 import com.android.contacts.ContactsListActivity.ContactListItemCache;
-import com.android.contacts.ContactsListActivity.PinnedHeaderCache;
 import com.android.contacts.TextHighlightingAnimation.TextWithHighlighting;
 
 import android.content.Context;
 import android.database.CharArrayBuffer;
 import android.database.Cursor;
-import android.graphics.Color;
 import android.graphics.drawable.Drawable;
 import android.os.Bundle;
 import android.provider.ContactsContract;
@@ -48,14 +45,11 @@
 import android.widget.ImageView;
 import android.widget.ListView;
 import android.widget.QuickContactBadge;
-import android.widget.SectionIndexer;
 import android.widget.TextView;
 
-public class ContactItemListAdapter extends ContactEntryListAdapter
-        implements SectionIndexer, PinnedHeaderListView.PinnedHeaderAdapter {
+public class ContactItemListAdapter extends ContactEntryListAdapter {
 
     private final ContactsListActivity contactsListActivity;
-    private SectionIndexer mIndexer;
     private boolean mLoading = true;
     protected CharSequence mUnknownNameText;
     protected boolean mDisplayPhotos = false;
@@ -511,7 +505,7 @@
         } else {
             final int section = getSectionForPosition(position);
             if (getPositionForSection(section) == position) {
-                String title = (String)mIndexer.getSections()[section];
+                String title = (String)getSections()[section];
                 view.setSectionHeader(title);
             } else {
                 view.setDividerVisible(false);
@@ -586,7 +580,7 @@
 
     private void updateIndexer(Cursor cursor) {
         if (cursor == null) {
-            mIndexer = null;
+            setIndexer(null);
             return;
         }
 
@@ -595,9 +589,9 @@
             String sections[] =
                 bundle.getStringArray(ContactCounts.EXTRA_ADDRESS_BOOK_INDEX_TITLES);
             int counts[] = bundle.getIntArray(ContactCounts.EXTRA_ADDRESS_BOOK_INDEX_COUNTS);
-            mIndexer = new ContactsSectionIndexer(sections, counts);
+            setIndexer(new ContactsSectionIndexer(sections, counts));
         } else {
-            mIndexer = null;
+            setIndexer(null);
         }
     }
 
@@ -610,30 +604,6 @@
         return contactsListActivity.doFilter(constraint.toString());
     }
 
-    public Object [] getSections() {
-        if (mIndexer == null) {
-            return new String[] { " " };
-        } else {
-            return mIndexer.getSections();
-        }
-    }
-
-    public int getPositionForSection(int sectionIndex) {
-        if (mIndexer == null) {
-            return -1;
-        }
-
-        return mIndexer.getPositionForSection(sectionIndex);
-    }
-
-    public int getSectionForPosition(int position) {
-        if (mIndexer == null) {
-            return -1;
-        }
-
-        return mIndexer.getSectionForPosition(position);
-    }
-
     @Override
     public boolean areAllItemsEnabled() {
         return contactsListActivity.mMode != ContactsListActivity.MODE_STARRED
@@ -693,6 +663,11 @@
         return super.getCount();
     }
 
+    @Override
+    protected int getCursorPosition(int position) {
+        return getRealPosition(position);
+    }
+
     protected int getRealPosition(int pos) {
         if (contactsListActivity.mShowNumberOfContacts) {
             pos--;
@@ -739,68 +714,4 @@
         }
         return super.getItemId(realPosition);
     }
-
-    /**
-     * Computes the state of the pinned header.  It can be invisible, fully
-     * visible or partially pushed up out of the view.
-     */
-    public int getPinnedHeaderState(int position) {
-        if (mIndexer == null || mCursor == null || mCursor.getCount() == 0) {
-            return PINNED_HEADER_GONE;
-        }
-
-        int realPosition = getRealPosition(position);
-        if (realPosition < 0) {
-            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) {
-            return PINNED_HEADER_PUSHED_UP;
-        }
-
-        return PINNED_HEADER_VISIBLE;
-    }
-
-    /**
-     * Configures the pinned header by setting the appropriate text label
-     * and also adjusting color if necessary.  The color needs to be
-     * adjusted when the pinned header is being pushed up from the view.
-     */
-    public void configurePinnedHeader(View header, int position, int alpha) {
-        PinnedHeaderCache cache = (PinnedHeaderCache)header.getTag();
-        if (cache == null) {
-            cache = new ContactsListActivity.PinnedHeaderCache();
-            cache.titleView = (TextView)header.findViewById(R.id.header_text);
-            cache.textColor = cache.titleView.getTextColors();
-            cache.background = header.getBackground();
-            header.setTag(cache);
-        }
-
-        int realPosition = getRealPosition(position);
-        int section = getSectionForPosition(realPosition);
-
-        String title = (String)mIndexer.getSections()[section];
-        cache.titleView.setText(title);
-
-        if (alpha == 255) {
-            // Opaque: use the default background, and the original text color
-            header.setBackgroundDrawable(cache.background);
-            cache.titleView.setTextColor(cache.textColor);
-        } else {
-            // Faded: use a solid color approximation of the background, and
-            // a translucent text color
-            header.setBackgroundColor(Color.rgb(
-                    Color.red(contactsListActivity.mPinnedHeaderBackgroundColor) * alpha / 255,
-                    Color.green(contactsListActivity.mPinnedHeaderBackgroundColor) * alpha / 255,
-                    Color.blue(contactsListActivity.mPinnedHeaderBackgroundColor) * alpha / 255));
-
-            int textColor = cache.textColor.getDefaultColor();
-            cache.titleView.setTextColor(Color.argb(alpha,
-                    Color.red(textColor), Color.green(textColor), Color.blue(textColor)));
-        }
-    }
 }
\ No newline at end of file
diff --git a/src/com/android/contacts/list/ContactsIntentResolver.java b/src/com/android/contacts/list/ContactsIntentResolver.java
index f0643ee..034e64f 100644
--- a/src/com/android/contacts/list/ContactsIntentResolver.java
+++ b/src/com/android/contacts/list/ContactsIntentResolver.java
@@ -478,6 +478,13 @@
     public ContactEntryListConfiguration getConfiguration() {
         ContactEntryListConfiguration config;
         switch (mMode) {
+            case MODE_DEFAULT: {
+                config = new MainContactListConfiguration(mContext, mAppController);
+                if (!mSearchMode) {
+                    config.setSectionHeaderDisplayEnabled(true);
+                }
+                break;
+            }
             case MODE_LEGACY_PICK_POSTAL:
             case MODE_PICK_POSTAL:
             case MODE_LEGACY_PICK_PHONE:
diff --git a/src/com/android/contacts/list/MainContactListConfiguration.java b/src/com/android/contacts/list/MainContactListConfiguration.java
new file mode 100644
index 0000000..565f7e1
--- /dev/null
+++ b/src/com/android/contacts/list/MainContactListConfiguration.java
@@ -0,0 +1,47 @@
+/*
+ * 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 com.android.contacts.ContactsApplicationController;
+import com.android.contacts.ContactsListActivity;
+
+import android.content.Context;
+import android.widget.ListAdapter;
+
+/**
+ * Configuration for the default contact list.
+ */
+public class MainContactListConfiguration extends ContactEntryListConfiguration {
+
+    public MainContactListConfiguration(Context context,
+            ContactsApplicationController applicationController) {
+        super(context, applicationController);
+    }
+
+    @Override
+    public ListAdapter createListAdapter() {
+        ContactItemListAdapter adapter =
+                new ContactItemListAdapter((ContactsListActivity)getContext());
+        adapter.setSectionHeaderDisplayEnabled(isSectionHeaderDisplayEnabled());
+        adapter.setDisplayPhotos(true);
+        return adapter;
+    }
+
+    @Override
+    public ContactEntryListController createController() {
+        return new MainContactListController(getContext(), getApplicationController());
+    }
+}
diff --git a/src/com/android/contacts/list/MainContactListController.java b/src/com/android/contacts/list/MainContactListController.java
new file mode 100644
index 0000000..7aae6b4
--- /dev/null
+++ b/src/com/android/contacts/list/MainContactListController.java
@@ -0,0 +1,39 @@
+/*
+ * 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 com.android.contacts.ContactsApplicationController;
+
+import android.content.Context;
+
+/**
+ * Controller for the default contact list.
+ */
+public class MainContactListController extends ContactEntryListController {
+
+    public MainContactListController(Context context,
+            ContactsApplicationController appController) {
+        super(context, appController);
+    }
+
+    @Override
+    protected void onItemClick(int position, long id) {
+        // TODO instead of delegating the entire procedure to the ContactsListActivity,
+        // figure out what the specific action is and delegate the specific action.
+        getContactsApplicationController().onListItemClick(position, id);
+    }
+}
diff --git a/src/com/android/contacts/list/PinnedHeaderListAdapter.java b/src/com/android/contacts/list/PinnedHeaderListAdapter.java
new file mode 100644
index 0000000..27deef3
--- /dev/null
+++ b/src/com/android/contacts/list/PinnedHeaderListAdapter.java
@@ -0,0 +1,167 @@
+/*
+ * 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 com.android.contacts.R;
+import com.android.contacts.widget.PinnedHeaderListView;
+
+import android.content.Context;
+import android.content.res.ColorStateList;
+import android.graphics.Color;
+import android.graphics.drawable.Drawable;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.CursorAdapter;
+import android.widget.SectionIndexer;
+import android.widget.TextView;
+
+/**
+ * A list adapter that supports section indexer and a pinned header.
+ */
+public abstract class PinnedHeaderListAdapter extends CursorAdapter
+        implements SectionIndexer, PinnedHeaderListView.PinnedHeaderAdapter {
+
+    /**
+     * An approximation of the background color of the pinned header. This color
+     * is used when the pinned header is being pushed up.  At that point the header
+     * "fades away".  Rather than computing a faded bitmap based on the 9-patch
+     * normally used for the background, we will use a solid color, which will
+     * provide better performance and reduced complexity.
+     */
+    private int mPinnedHeaderBackgroundColor;
+
+    private SectionIndexer mIndexer;
+
+    public PinnedHeaderListAdapter(Context context) {
+        super(context, null, false);
+        this.mContext = context;
+        mPinnedHeaderBackgroundColor =
+                context.getResources().getColor(R.color.pinned_header_background);
+    }
+
+    public void setIndexer(SectionIndexer indexer) {
+        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[] { " " };
+        } else {
+            return mIndexer.getSections();
+        }
+    }
+
+    public int getPositionForSection(int sectionIndex) {
+        if (mIndexer == null) {
+            return -1;
+        }
+
+        return mIndexer.getPositionForSection(sectionIndex);
+    }
+
+    public int getSectionForPosition(int position) {
+        if (mIndexer == null) {
+            return -1;
+        }
+
+        return mIndexer.getSectionForPosition(position);
+    }
+
+    /**
+     * Computes the state of the pinned header.  It can be invisible, fully
+     * visible or partially pushed up out of the view.
+     */
+    public int getPinnedHeaderState(int position) {
+        if (mIndexer == null || mCursor == null || mCursor.getCount() == 0) {
+            return PINNED_HEADER_GONE;
+        }
+
+        int realPosition = getCursorPosition(position);
+        if (realPosition < 0) {
+            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) {
+            return PINNED_HEADER_PUSHED_UP;
+        }
+
+        return PINNED_HEADER_VISIBLE;
+    }
+
+    final static class PinnedHeaderCache {
+        public TextView titleView;
+        public ColorStateList textColor;
+        public Drawable background;
+    }
+
+    /**
+     * Configures the pinned header by setting the appropriate text label
+     * and also adjusting color if necessary.  The color needs to be
+     * adjusted when the pinned header is being pushed up from the view.
+     */
+    public void configurePinnedHeader(View header, int position, int alpha) {
+        PinnedHeaderCache cache = (PinnedHeaderCache)header.getTag();
+        if (cache == null) {
+            cache = new PinnedHeaderCache();
+            cache.titleView = (TextView)header.findViewById(R.id.header_text);
+            cache.textColor = cache.titleView.getTextColors();
+            cache.background = header.getBackground();
+            header.setTag(cache);
+        }
+
+        int realPosition = getCursorPosition(position);
+        int section = getSectionForPosition(realPosition);
+
+        String title = (String)mIndexer.getSections()[section];
+        cache.titleView.setText(title);
+
+        if (alpha == 255) {
+            // Opaque: use the default background, and the original text color
+            header.setBackgroundDrawable(cache.background);
+            cache.titleView.setTextColor(cache.textColor);
+        } else {
+            // Faded: use a solid color approximation of the background, and
+            // a translucent text color
+            header.setBackgroundColor(Color.rgb(
+                    Color.red(mPinnedHeaderBackgroundColor) * alpha / 255,
+                    Color.green(mPinnedHeaderBackgroundColor) * alpha / 255,
+                    Color.blue(mPinnedHeaderBackgroundColor) * alpha / 255));
+
+            int textColor = cache.textColor.getDefaultColor();
+            cache.titleView.setTextColor(Color.argb(alpha,
+                    Color.red(textColor), Color.green(textColor), Color.blue(textColor)));
+        }
+    }
+
+    public View createPinnedHeaderView(ViewGroup parent) {
+        return LayoutInflater.from(mContext).inflate(R.layout.list_section, parent, false);
+    }
+}
diff --git a/src/com/android/contacts/PinnedHeaderListView.java b/src/com/android/contacts/widget/PinnedHeaderListView.java
similarity index 85%
rename from src/com/android/contacts/PinnedHeaderListView.java
rename to src/com/android/contacts/widget/PinnedHeaderListView.java
index 9d1391b..a3e6794 100644
--- a/src/com/android/contacts/PinnedHeaderListView.java
+++ b/src/com/android/contacts/widget/PinnedHeaderListView.java
@@ -14,20 +14,22 @@
  * limitations under the License.
  */
 
-package com.android.contacts;
+package com.android.contacts.widget;
 
 import android.content.Context;
 import android.graphics.Canvas;
 import android.util.AttributeSet;
 import android.view.View;
+import android.widget.AbsListView;
 import android.widget.ListAdapter;
 import android.widget.ListView;
+import android.widget.AbsListView.OnScrollListener;
 
 /**
  * A ListView that maintains a header pinned at the top of the list. The
  * pinned header can be pushed up and dissolved as needed.
  */
-public class PinnedHeaderListView extends ListView {
+public class PinnedHeaderListView extends ListView implements OnScrollListener {
 
     /**
      * Adapter interface.  The list adapter must implement this interface.
@@ -78,6 +80,8 @@
 
     private int mHeaderViewHeight;
 
+    private OnScrollListener mOnScrollListener;
+
     public PinnedHeaderListView(Context context) {
         super(context);
     }
@@ -88,6 +92,7 @@
 
     public PinnedHeaderListView(Context context, AttributeSet attrs, int defStyle) {
         super(context, attrs, defStyle);
+        super.setOnScrollListener(this);
     }
 
     public void setPinnedHeaderView(View view) {
@@ -109,6 +114,12 @@
     }
 
     @Override
+    public void setOnScrollListener(OnScrollListener onScrollListener) {
+        mOnScrollListener = onScrollListener;
+        super.setOnScrollListener(this);
+    }
+
+    @Override
     protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
         super.onMeasure(widthMeasureSpec, heightMeasureSpec);
         if (mHeaderView != null) {
@@ -127,6 +138,20 @@
         }
     }
 
+    public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount,
+            int totalItemCount) {
+        configureHeaderView(firstVisibleItem);
+        if (mOnScrollListener != null) {
+            mOnScrollListener.onScroll(this, firstVisibleItem, visibleItemCount, totalItemCount);
+        }
+    }
+
+    public void onScrollStateChanged(AbsListView view, int scrollState) {
+        if (mOnScrollListener != null) {
+            mOnScrollListener.onScrollStateChanged(this, scrollState);
+        }
+    }
+
     public void configureHeaderView(int position) {
         if (mHeaderView == null) {
             return;
diff --git a/tests/AndroidManifest.xml b/tests/AndroidManifest.xml
index 53334a8..17ad3f7 100644
--- a/tests/AndroidManifest.xml
+++ b/tests/AndroidManifest.xml
@@ -40,7 +40,6 @@
             <intent-filter>
                 <action android:name="android.intent.action.MAIN" />
                 <category android:name="android.intent.category.DEFAULT" />
-                <category android:name="android.intent.category.LAUNCHER" />
             </intent-filter>
         </activity>
 
