diff --git a/res/drawable-hdpi/aizy_bottom.png b/res/drawable-hdpi/temp_aizy_bottom.png
similarity index 100%
rename from res/drawable-hdpi/aizy_bottom.png
rename to res/drawable-hdpi/temp_aizy_bottom.png
Binary files differ
diff --git a/res/drawable-mdpi/aizy_bottom.png b/res/drawable-mdpi/temp_aizy_bottom.png
similarity index 100%
rename from res/drawable-mdpi/aizy_bottom.png
rename to res/drawable-mdpi/temp_aizy_bottom.png
Binary files differ
diff --git a/res/drawable-mdpi/temp_aizy_knob.png b/res/drawable-mdpi/temp_aizy_knob.png
new file mode 100644
index 0000000..daa8242
--- /dev/null
+++ b/res/drawable-mdpi/temp_aizy_knob.png
Binary files differ
diff --git a/res/layout/aizy_popup_window.xml b/res/layout/aizy_popup_window.xml
index 801b481..5e83766 100644
--- a/res/layout/aizy_popup_window.xml
+++ b/res/layout/aizy_popup_window.xml
@@ -18,7 +18,7 @@
     android:orientation="vertical"
     android:layout_width="wrap_content"
     android:layout_height="wrap_content"
-    android:background="@drawable/aizy_bottom"
+    android:background="@drawable/temp_aizy_bottom"
     >
 
     <TextView
diff --git a/res/values-xlarge/colors.xml b/res/values-xlarge/colors.xml
index 4eaa941..0f8f8de 100644
--- a/res/values-xlarge/colors.xml
+++ b/res/values-xlarge/colors.xml
@@ -16,12 +16,6 @@
 
 <resources>
 
-    <!-- Color used in the Aizy visual scroll control for empty section -->
-    <color name="aizy_empty_section">#ffcccccc</color>
-
-    <!-- Color used in the Aizy visual scroll control for non-empty sections -->
-    <color name="aizy_non_empty_section">#ff9490a0</color>
-
     <!-- Color used for the letter in the A-Z section header -->
     <color name="section_header_text_color">#ff000000</color>
 
diff --git a/res/values/colors.xml b/res/values/colors.xml
index 9da6a61..cea3573 100644
--- a/res/values/colors.xml
+++ b/res/values/colors.xml
@@ -27,10 +27,7 @@
     <color name="translucent_search_background">#cc000000</color>
 
     <!-- Color used in the Aizy visual scroll control for empty section -->
-    <color name="aizy_empty_section">#ff666666</color>
-
-    <!-- Color used in the Aizy visual scroll control for non-empty sections -->
-    <color name="aizy_non_empty_section">#ffcccccc</color>
+    <color name="aizy_line_color">#ff689afe</color>
 
     <!-- Color used for the letter in the A-Z section header -->
     <color name="section_header_text_color">#ff999999</color>
diff --git a/res/values/strings.xml b/res/values/strings.xml
index a15619a..47bb0a1 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -1308,16 +1308,6 @@
     <!-- The button next to the message about multiple contact aggregation suggestions in Contact editor. [CHAR LIMIT=12]-->
     <string name="aggregation_suggestion_view_button">View</string>
 
-    <!-- Primary alphabet of this language. Each of these characters always has its own section in
-         the visual scroll control next to the contact list. These letters must be uppercase.
-         While there is no hard limit on the number of characters, there should not be more than
-         40. If the language requires more, this string should instead be empty so that the
-         visual scroll control adapts to the contents.
-         This text must only contain letters that can appear as sections, otherwise they would
-         only be empty.
-         Translations require extensive QA! -->
-    <string name="visualScrollerAlphabet">A;B;C;D;E;F;G;H;I;J;K;L;M;N;O;P;Q;R;S;T;U;V;W;X;Y;Z</string>
-
     <!-- The menu item (or button) that creates a local copy of a corporate contact. [CHAR LIMIT=40]-->
     <string name="menu_copyContact">Copy to my contacts</string>
 
diff --git a/src/com/android/contacts/activities/ContactBrowserActivity.java b/src/com/android/contacts/activities/ContactBrowserActivity.java
index 27fdb60..b7afc1b 100644
--- a/src/com/android/contacts/activities/ContactBrowserActivity.java
+++ b/src/com/android/contacts/activities/ContactBrowserActivity.java
@@ -237,24 +237,36 @@
     private void configureListFragment(boolean fromRequest) {
         boolean searchMode = mSearchMode;
         if (fromRequest) {
-            if (mRequest.getDisplayWithPhoneNumbersOnly()) {
-                mContactListFilterController.setContactListFilter(new ContactListFilter(
-                        ContactListFilter.FILTER_TYPE_WITH_PHONE_NUMBERS_ONLY), false);
+            ContactListFilter filter = null;
+            int actionCode = mRequest.getActionCode();
+            switch (actionCode) {
+                case ContactsRequest.ACTION_ALL_CONTACTS:
+                    filter = new ContactListFilter(ContactListFilter.FILTER_TYPE_ALL_ACCOUNTS);
+                    break;
+                case ContactsRequest.ACTION_CONTACTS_WITH_PHONES:
+                    filter = new ContactListFilter(
+                            ContactListFilter.FILTER_TYPE_WITH_PHONE_NUMBERS_ONLY);
+                    break;
+
+                // TODO: handle FREQUENT and STREQUENT according to the spec
+                case ContactsRequest.ACTION_FREQUENT:
+                case ContactsRequest.ACTION_STREQUENT:
+                    // For now they are treated the same as STARRED
+                case ContactsRequest.ACTION_STARRED:
+                    filter = new ContactListFilter(ContactListFilter.FILTER_TYPE_STARRED);
+                    break;
+            }
+
+            if (filter != null) {
+                mContactListFilterController.setContactListFilter(filter, false);
                 searchMode = false;
+            } else if (mRequest.getActionCode() == ContactsRequest.ACTION_ALL_CONTACTS) {
+                mContactListFilterController.setContactListFilter(new ContactListFilter(
+                        ContactListFilter.FILTER_TYPE_ALL_ACCOUNTS), false);
             }
         } else {
             if (mHasActionBar) {
                 searchMode = mActionBarAdapter.isSearchMode();
-            } else {
-// TODO: reenable FREQUENT, STARRED and STREQUENT
-//                int actionCode = mRequest.getActionCode();
-//                if (actionCode == ContactsRequest.ACTION_FREQUENT ||
-//                        actionCode == ContactsRequest.ACTION_STARRED ||
-//                        actionCode == ContactsRequest.ACTION_STREQUENT) {
-//                    mode = ContactBrowserMode.MODE_FAVORITES;
-//                } else {
-//                    mode = ContactBrowserMode.MODE_CONTACTS;
-//                }
             }
         }
 
diff --git a/src/com/android/contacts/list/ContactEntryListFragment.java b/src/com/android/contacts/list/ContactEntryListFragment.java
index afb748e..98c01d4 100644
--- a/src/com/android/contacts/list/ContactEntryListFragment.java
+++ b/src/com/android/contacts/list/ContactEntryListFragment.java
@@ -417,7 +417,7 @@
         mAdapter.changeCursor(partitionIndex, data);
         showCount(partitionIndex, data);
         if (partitionIndex == mAdapter.getIndexedPartition()) {
-            mAizy.readFromIndexer(mAdapter.getIndexer());
+            mAizy.setIndexer(mAdapter.getIndexer(), data.getCount());
         }
 
         // TODO should probably only restore instance state after all directories are loaded
@@ -676,8 +676,7 @@
         mAizy.setListener(new ContactListAizyView.Listener() {
             @Override
             public void onScroll(int position) {
-                mListView.smoothScrollToPositionFromTop(
-                        position + mListView.getHeaderViewsCount(),
+                mListView.smoothScrollToPositionFromTop(position + mListView.getHeaderViewsCount(),
                         0);
             }
         });
@@ -734,6 +733,9 @@
     @Override
     public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount,
             int totalItemCount) {
+        if (isAizyEnabled()) {
+            mAizy.listOnScroll(firstVisibleItem);
+        }
     }
 
     public void onScrollStateChanged(AbsListView view, int scrollState) {
diff --git a/src/com/android/contacts/list/ContactListAizyView.java b/src/com/android/contacts/list/ContactListAizyView.java
index d2cc279..69a10cf 100644
--- a/src/com/android/contacts/list/ContactListAizyView.java
+++ b/src/com/android/contacts/list/ContactListAizyView.java
@@ -17,16 +17,12 @@
 package com.android.contacts.list;
 
 import com.android.contacts.R;
-import com.android.contacts.util.PhonebookCollatorFactory;
 
 import android.content.Context;
 import android.content.res.Resources;
 import android.graphics.Canvas;
 import android.graphics.Paint;
-import android.graphics.Paint.Align;
-import android.graphics.Paint.FontMetrics;
-import android.graphics.Rect;
-import android.graphics.Typeface;
+import android.graphics.drawable.Drawable;
 import android.util.AttributeSet;
 import android.view.Gravity;
 import android.view.LayoutInflater;
@@ -36,9 +32,6 @@
 import android.widget.SectionIndexer;
 import android.widget.TextView;
 
-import java.text.Collator;
-import java.util.ArrayList;
-
 /**
  * A View that displays the sections given by an Indexer and their relative sizes. For
  * English and similar languages, this is an A to Z list (where only the used letters are
@@ -48,51 +41,19 @@
 public class ContactListAizyView extends View {
     private static final String TAG = "ContactListAizyView";
 
-    private static final int PREVIEW_TIME_DELAY_MS = 400;
+    private SectionIndexer mIndexer;
+    private int mItemCount;
+    private int[] mSectionPositions;
 
     private Listener mListener;
+    private float mPosition;
     private PopupWindow mPreviewPopupWindow;
     private TextView mPreviewPopupTextView;
+    private boolean mPreviewPopupVisible;
+    private final int[] mWindowOffset = new int[2];
 
     private ResourceValues mResourceValues;
 
-    /**
-     * True if the popup window is currently visible.
-     */
-    private boolean mPreviewPopupVisible;
-
-    /**
-     * Time when the user started tapping. This is used to calculate the time delay before fading
-     * in the PopupWindow
-     */
-    private long mPreviewPopupStartTime;
-
-    /**
-     * Needed only inside {@link #onTouchEvent(MotionEvent)} to get the location of touch events.
-     */
-    private int[] mWindowOffset;
-
-    /**
-     * Needed to measure text. Used inside {@link #onDraw(Canvas)}
-     */
-    private final Rect bounds = new Rect();
-
-    /**
-     * Used and cached inside {@link #onDraw(Canvas)}
-     */
-    private FontMetrics mFontMetrics;
-
-    /**
-     * Used and cached inside {@link #onDraw(Canvas)}
-     */
-    private Paint mPaint;
-
-    /**
-     * The list of displayed sections. "Virtual" sections can be empty and therefore don't show
-     * up as regular sections
-     */
-    private final ArrayList<VirtualSection> mVirtualSections = new ArrayList<VirtualSection>();
-
     public ContactListAizyView(Context context) {
         super(context);
     }
@@ -109,78 +70,37 @@
     protected void onAttachedToWindow() {
         super.onAttachedToWindow();
 
-        mResourceValues = new ResourceValues(getResources());
+        mResourceValues = new ResourceValues(getContext().getResources());
 
         final LayoutInflater inflater =
                 (LayoutInflater) getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
         mPreviewPopupWindow = new PopupWindow(
                 inflater.inflate(R.layout.aizy_popup_window, null, false),
-                (int) mResourceValues.previewWidth, (int) mResourceValues.previewHeight);
-        mPreviewPopupWindow.setAnimationStyle(android.R.style.Animation_Toast);
+                mResourceValues.getPreviewWidth(), mResourceValues.getPreviewHeight());
         mPreviewPopupTextView =
                 (TextView) mPreviewPopupWindow.getContentView().findViewById(R.id.caption);
     }
 
-    /**
-     * Sets up the Aizy based on the indexer and completely reads its contents.
-     * This function has to be called everytime the data is changed.
-     */
-    public void readFromIndexer(SectionIndexer indexer) {
-        mVirtualSections.clear();
-        final String alphabetString = getResources().getString(R.string.visualScrollerAlphabet);
-        final String[] alphabet = alphabetString.split(";");
-
-        // We expect to get 10 additional items that the base alphabet
-        mVirtualSections.ensureCapacity(alphabet.length + 10);
-
-        if (indexer != null) {
-            // Add the real sections
-            final Object[] sections = indexer.getSections();
-            for (int sectionIndex = 0; sectionIndex < sections.length; sectionIndex++) {
-                final Object section = sections[sectionIndex];
-                final String caption = section == null ? "" : section.toString();
-                final int position = indexer.getPositionForSection(sectionIndex);
-                mVirtualSections.add(new VirtualSection(caption, sectionIndex, position));
-            }
+    public void setIndexer(SectionIndexer indexer, int itemCount) {
+        mIndexer = indexer;
+        mItemCount = itemCount;
+        if (mIndexer == null) {
+            mSectionPositions = null;
+            return;
         }
 
-        final Collator collator = PhonebookCollatorFactory.getCollator();
-
-        // Add the base alphabet if missing
-        for (String caption : alphabet) {
-            boolean insertAtEnd = true;
-            VirtualSection previousVirtualSection = null;
-            for (int i = 0; i < mVirtualSections.size(); i++) {
-                final VirtualSection virtualSection = mVirtualSections.get(i);
-                final String virtualSectionCaption = virtualSection.getCaption();
-                final int comparison = collator.compare(virtualSectionCaption, caption);
-                if (comparison == 0) {
-                    // element is already in the list.
-                    insertAtEnd = false;
-                    break;
-                }
-                if (comparison > 0) {
-                    // we stepped too far. the element belongs before the element at i
-                    insertAtEnd = false;
-                    final int realSectionPosition = previousVirtualSection == null ? 0
-                            : previousVirtualSection.getRealSectionPosition();
-                    mVirtualSections.add(i, new VirtualSection(caption, -1, realSectionPosition));
-                    break;
-                }
-                previousVirtualSection = virtualSection;
-            }
-            if (insertAtEnd) {
-                final int realSectionPosition = previousVirtualSection == null ? 0
-                        : previousVirtualSection.getRealSectionPosition();
-                mVirtualSections.add(new VirtualSection(caption, -1, realSectionPosition));
-            }
+        // Read the section positions
+        final Object[] sections = mIndexer.getSections();
+        final int sectionCount = sections.length;
+        if (mSectionPositions == null || mSectionPositions.length != sectionCount) {
+            mSectionPositions = new int[sectionCount];
         }
-        invalidate();
+        for (int i = 0; i < sectionCount; i++) {
+            mSectionPositions[i] = mIndexer.getPositionForSection(i);
+        }
+
     }
 
-    /**
-     * Sets the Listener that is called everytime the user taps on this control.
-     */
     public void setListener(Listener listener) {
         mListener = listener;
     }
@@ -192,75 +112,19 @@
 
     @Override
     protected void onDraw(Canvas canvas) {
-        if (mPaint == null) {
-            mPaint = new Paint();
-            mPaint.setTextSize(mResourceValues.textSize);
-            mPaint.setAntiAlias(true);
-            mPaint.setTextAlign(Align.CENTER);
-            mPaint.setTypeface(Typeface.DEFAULT_BOLD);
-        }
-        if (mFontMetrics == null) {
-            mFontMetrics = mPaint.getFontMetrics();
-        }
-        final float fontHeight = mFontMetrics.descent - mFontMetrics.ascent;
-        final int halfWidth = getWidth() / 2;
-        // Draw
-        float lastVisibleY = Float.NEGATIVE_INFINITY;
-        final float sectionHeight = (float) getHeight() / mVirtualSections.size();
-        for (int i = 0; i < mVirtualSections.size(); i++) {
-            final VirtualSection virtualSection = mVirtualSections.get(i);
-            final String caption = virtualSection.getCaption();
-            if (!virtualSection.isMeasured()) {
-                mPaint.getTextBounds(caption, 0, caption.length(), bounds);
-                virtualSection.setMeasuredSize(-bounds.top);
-            }
-            final float y = i * sectionHeight;
-            if (lastVisibleY + fontHeight < y) {
-                mPaint.setColor(virtualSection.getRealSectionIndex() != -1
-                        ? mResourceValues.nonEmptySectionColor : mResourceValues.emptySectionColor);
+        if (mIndexer == null) return;
 
-                canvas.drawText(caption, halfWidth,
-                        y + sectionHeight / 2 + virtualSection.getMeasuredSize() / 2, mPaint);
-                lastVisibleY = y;
-            }
-        }
+        drawLineAndText(canvas);
     }
 
     @Override
     public boolean onTouchEvent(MotionEvent event) {
-        if (mWindowOffset == null) {
-            mWindowOffset = new int[2];
-            getLocationInWindow(mWindowOffset);
-        }
+        getLocationInWindow(mWindowOffset);
 
-        // Not initialized? Ignore
-        if (mVirtualSections.size() == 0) return true;
-
-        // Scroll the list itself
-        final int boundedY = Math.min(Math.max(0, (int) (event.getY())), getHeight() - 1);
-        final int index = boundedY * mVirtualSections.size() / getHeight();
-        final VirtualSection virtualSection = mVirtualSections.get(index);
-        final int sectionY = index * getHeight() / mVirtualSections.size();
-        mPreviewPopupTextView.setText(virtualSection.getCaption());
-        mPreviewPopupTextView.setTextColor(virtualSection.getRealSectionIndex() != -1
-                ? mResourceValues.nonEmptySectionColor : mResourceValues.emptySectionColor);
-
-        // Draw popup window
         final int previewX = mWindowOffset[0] + getWidth();
-        final float sectionHeight = (float) getHeight() / mVirtualSections.size();
-        final int previewY = (int) (sectionY + mWindowOffset[1] + (sectionHeight -
-                mPreviewPopupWindow.getHeight()) / 2);
-        final int actionMasked = event.getActionMasked();
-        final boolean fingerIsDown = actionMasked == MotionEvent.ACTION_DOWN;
-        if (fingerIsDown) {
-            mPreviewPopupStartTime = System.currentTimeMillis();
-        }
-        final boolean fingerIsDownOrScrubbing =
-            actionMasked == MotionEvent.ACTION_MOVE || actionMasked == MotionEvent.ACTION_DOWN;
-
-        final boolean previewPopupVisible = fingerIsDownOrScrubbing &&
-                (System.currentTimeMillis() > mPreviewPopupStartTime + PREVIEW_TIME_DELAY_MS);
-
+        final int previewY = (int) event.getY() + mWindowOffset[1]
+                - mPreviewPopupWindow.getHeight() / 2;
+        final boolean previewPopupVisible = event.getActionMasked() == MotionEvent.ACTION_MOVE;
         if (previewPopupVisible != mPreviewPopupVisible) {
             if (previewPopupVisible) {
                 mPreviewPopupWindow.showAtLocation(this, Gravity.LEFT | Gravity.TOP,
@@ -272,70 +136,88 @@
         } else {
             mPreviewPopupWindow.update(previewX, previewY, -1, -1);
         }
+        final float yFactor = (float) getHeight() / mItemCount;
+        final int position = Math.max(0, (int) (event.getY() / yFactor));
+        if (mIndexer != null) {
+            final int index = mIndexer.getSectionForPosition(position);
+            final Object[] sections = mIndexer.getSections();
+            final String caption =
+                    (index != -1 && index < sections.length) ? sections[index].toString() : "";
+            mPreviewPopupTextView.setText(caption);
+        }
 
-        // Perform the actual scrolling
-        if (mListener != null) mListener.onScroll(virtualSection.getRealSectionPosition());
+        if (mListener != null) mListener.onScroll(position);
 
+        super.onTouchEvent(event);
         return true;
     }
 
-    /**
-     * Reads an provides all values from the resource files
-     */
-    private static class ResourceValues {
-        private final int emptySectionColor;
-        private final int nonEmptySectionColor;
-        private final float textSize;
-        private final float previewWidth;
-        private final float previewHeight;
+    private void drawLineAndText(Canvas canvas) {
+        final float yFactor = (float) getHeight() / mItemCount;
 
-        private ResourceValues(Resources resources) {
-            emptySectionColor = resources.getColor(R.color.aizy_empty_section);
-            nonEmptySectionColor = resources.getColor(R.color.aizy_non_empty_section);
-            textSize = resources.getDimension(R.dimen.aizy_text_size);
-            previewWidth = resources.getDimension(R.dimen.aizy_preview_width);
-            previewHeight = resources.getDimension(R.dimen.aizy_preview_height);
+        final Paint paint = new Paint();
+
+        paint.setColor(mResourceValues.getLineColor());
+        paint.setAntiAlias(true);
+
+        // Draw sections
+        final float centerX = getWidth() * 0.5f;
+        for (int i = 1; i < mSectionPositions.length; i++) {
+            final float y1 = mSectionPositions[i - 1] * yFactor;
+            final float y2 = mSectionPositions[i] * yFactor;
+            canvas.drawLine(
+                    centerX, y1 + 1.0f,
+                    centerX, y2 - 1.0f,
+                    paint);
         }
+
+        // Draw knob
+        final Drawable knob = mResourceValues.getKnobDrawable();
+        final int w = knob.getIntrinsicWidth();
+        final int h = knob.getIntrinsicWidth();
+        final float y = mPosition * yFactor;
+        knob.setBounds(
+                (int) (centerX - w / 2.0f), (int) (y - h / 2.0f),
+                (int) (centerX + w / 2.0f), (int) (y + h / 2.0f));
+        knob.draw(canvas);
     }
 
-    private static class VirtualSection {
-        private final String mCaption;
-        private final int mRealSectionIndex;
-        private final int mRealSectionPosition;
-        private float mMeasuredSize = Float.NaN;
+    public void listOnScroll(int firstVisibleItem) {
+        mPosition = firstVisibleItem;
+        invalidate();
+    }
 
-        public String getCaption() {
-            return mCaption;
+    private static class ResourceValues {
+        private int mLineColor;
+        private Drawable mKnobDrawable;
+        private int mPreviewWidth;
+        private int mPreviewHeight;
+
+        public int getLineColor() {
+            return mLineColor;
         }
 
-        public int getRealSectionIndex() {
-            return mRealSectionIndex;
+        public Drawable getKnobDrawable() {
+            return mKnobDrawable;
         }
 
-        public int getRealSectionPosition() {
-            return mRealSectionPosition;
+        public int getPreviewWidth() {
+            return mPreviewWidth;
         }
 
-        public boolean isMeasured() {
-            return mMeasuredSize == Float.NaN;
+        public int getPreviewHeight() {
+            return mPreviewHeight;
         }
 
-        public void setMeasuredSize(float value) {
-            mMeasuredSize = value;
-        }
-
-        public float getMeasuredSize() {
-            return mMeasuredSize;
-        }
-
-        public VirtualSection(String caption, int realSectionIndex, int realSectionPosition) {
-            mCaption = caption;
-            mRealSectionIndex = realSectionIndex;
-            mRealSectionPosition = realSectionPosition;
+        public ResourceValues(Resources resources) {
+            mLineColor = resources.getColor(R.color.aizy_line_color);
+            mKnobDrawable = resources.getDrawable(R.drawable.temp_aizy_knob);
+            mPreviewWidth = resources.getDimensionPixelSize(R.dimen.aizy_preview_width);
+            mPreviewHeight = resources.getDimensionPixelSize(R.dimen.aizy_preview_height);
         }
     }
 
     public interface Listener {
         void onScroll(int position);
     }
-}
+}
\ 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 d1525fb..3b34cb5 100644
--- a/src/com/android/contacts/list/ContactsIntentResolver.java
+++ b/src/com/android/contacts/list/ContactsIntentResolver.java
@@ -53,7 +53,6 @@
 
     public ContactsRequest resolveIntent(Intent intent) {
         ContactsRequest request = new ContactsRequest();
-        request.setDisplayOnlyVisible(true);
 
         String action = intent.getAction();
 
@@ -62,11 +61,9 @@
         if (UI.LIST_DEFAULT.equals(action) ) {
             request.setActionCode(ContactsRequest.ACTION_DEFAULT);
         } else if (UI.LIST_ALL_CONTACTS_ACTION.equals(action)) {
-            request.setActionCode(ContactsRequest.ACTION_DEFAULT);
-            request.setDisplayOnlyVisible(false);
+            request.setActionCode(ContactsRequest.ACTION_ALL_CONTACTS);
         } else if (UI.LIST_CONTACTS_WITH_PHONES_ACTION.equals(action)) {
-            request.setActionCode(ContactsRequest.ACTION_DEFAULT);
-            request.setDisplayWithPhoneNumbersOnly(true);
+            request.setActionCode(ContactsRequest.ACTION_CONTACTS_WITH_PHONES);
         } else if (UI.LIST_STARRED_ACTION.equals(action)) {
             request.setActionCode(ContactsRequest.ACTION_STARRED);
         } else if (UI.LIST_FREQUENT_ACTION.equals(action)) {
diff --git a/src/com/android/contacts/list/ContactsRequest.java b/src/com/android/contacts/list/ContactsRequest.java
index 331dc93..aefa451 100644
--- a/src/com/android/contacts/list/ContactsRequest.java
+++ b/src/com/android/contacts/list/ContactsRequest.java
@@ -29,6 +29,12 @@
     /** Default mode: browse contacts */
     public static final int ACTION_DEFAULT = 10;
 
+    /** Show all contacts */
+    public static final int ACTION_ALL_CONTACTS = 15;
+
+    /** Show all contacts with phone numbers */
+    public static final int ACTION_CONTACTS_WITH_PHONES = 17;
+
     /** Show contents of a specific group */
     public static final int ACTION_GROUP = 20;
 
@@ -74,8 +80,6 @@
     private CharSequence mTitle;
     private boolean mSearchMode;
     private String mQueryString;
-    private boolean mDisplayOnlyWithPhones;
-    private boolean mDisplayOnlyVisible;
     private String mGroupName;
     private boolean mLegacyCompatibilityMode;
     private boolean mDirectorySearchEnabled = true;
@@ -91,8 +95,6 @@
         mTitle = request.mTitle;
         mSearchMode = request.mSearchMode;
         mQueryString = request.mQueryString;
-        mDisplayOnlyWithPhones = request.mDisplayOnlyWithPhones;
-        mDisplayOnlyVisible = request.mDisplayOnlyVisible;
         mGroupName = request.mGroupName;
         mLegacyCompatibilityMode = request.mLegacyCompatibilityMode;
         mDirectorySearchEnabled = request.mDirectorySearchEnabled;
@@ -114,8 +116,6 @@
             request.mTitle = source.readCharSequence();
             request.mSearchMode = source.readInt() != 0;
             request.mQueryString = source.readString();
-            request.mDisplayOnlyWithPhones = source.readInt() != 0;
-            request.mDisplayOnlyVisible = source.readInt() != 0;
             request.mGroupName = source.readString();
             request.mLegacyCompatibilityMode  = source.readInt() != 0;
             request.mDirectorySearchEnabled = source.readInt() != 0;
@@ -131,8 +131,6 @@
         dest.writeCharSequence(mTitle);
         dest.writeInt(mSearchMode ? 1 : 0);
         dest.writeString(mQueryString);
-        dest.writeInt(mDisplayOnlyWithPhones ? 1 : 0);
-        dest.writeInt(mDisplayOnlyVisible ? 1 : 0);
         dest.writeString(mGroupName);
         dest.writeInt(mLegacyCompatibilityMode ? 1 : 0);
         dest.writeInt(mDirectorySearchEnabled ? 1 : 0);
@@ -175,22 +173,6 @@
         mActionCode = actionCode;
     }
 
-    public boolean getDisplayOnlyVisible() {
-        return mDisplayOnlyVisible;
-    }
-
-    public void setDisplayOnlyVisible(boolean flag) {
-        mDisplayOnlyVisible = flag;
-    }
-
-    public boolean getDisplayWithPhoneNumbersOnly() {
-        return mDisplayOnlyWithPhones;
-    }
-
-    public void setDisplayWithPhoneNumbersOnly(boolean option) {
-        mDisplayOnlyWithPhones = option;
-    }
-
     public boolean isSearchMode() {
         return mSearchMode;
     }
diff --git a/src/com/android/contacts/widget/ListViewUtils.java b/src/com/android/contacts/widget/ListViewUtils.java
index bfa686e..f5af63b 100644
--- a/src/com/android/contacts/widget/ListViewUtils.java
+++ b/src/com/android/contacts/widget/ListViewUtils.java
@@ -47,7 +47,7 @@
 
             @Override
             public void run() {
-                int firstPosition = listView.getFirstVisiblePosition();
+                int firstPosition = listView.getFirstVisiblePosition() + 1;
                 int lastPosition = listView.getLastVisiblePosition();
                 if (position >= firstPosition && position <= lastPosition) {
                     return; // Already on screen
@@ -62,13 +62,19 @@
                     if (preliminaryPosition >= listView.getCount()) {
                         preliminaryPosition = listView.getCount() - 1;
                     }
+                    if (preliminaryPosition < firstPosition) {
+                        listView.setSelection(preliminaryPosition);
+                    }
                 } else {
                     preliminaryPosition = position - twoScreens;
                     if (preliminaryPosition < 0) {
                         preliminaryPosition = 0;
                     }
+                    if (preliminaryPosition > lastPosition) {
+                        listView.setSelection(preliminaryPosition);
+                    }
                 }
-                listView.setSelection(preliminaryPosition);
+
                 scrollToFinalPosition(listView, position);
             }
         });
