diff --git a/src/com/android/browser/BrowserProvider.java b/src/com/android/browser/BrowserProvider.java
index 6755268..4747721 100644
--- a/src/com/android/browser/BrowserProvider.java
+++ b/src/com/android/browser/BrowserProvider.java
@@ -447,7 +447,7 @@
         private Cursor  mSuggestCursor;
         private int     mHistoryCount;
         private int     mSuggestionCount;
-        private boolean mBeyondCursor;
+        private boolean mIncludeWebSearch;
         private String  mString;
         private int     mSuggestText1Id;
         private int     mSuggestText2Id;
@@ -463,7 +463,7 @@
                 mSuggestionCount = MAX_SUGGESTION_LONG_ENTRIES - mHistoryCount;
             }
             mString = string;
-            mBeyondCursor = false;
+            mIncludeWebSearch = string.length() > 0;
 
             // Some web suggest providers only give suggestions and have no description string for
             // items. The order of the result columns may be different as well. So retrieve the
@@ -490,21 +490,24 @@
             if (mHistoryCursor == null) {
                 return false;
             }
+            if (mIncludeWebSearch) {
+                if (newPosition == 0) {
+                    return true;
+                } else {
+                    newPosition--;
+                }
+            }
             if (mHistoryCount > newPosition) {
                 mHistoryCursor.moveToPosition(newPosition);
-                mBeyondCursor = false;
-            } else if (mHistoryCount + mSuggestionCount > newPosition) {
-                mSuggestCursor.moveToPosition(newPosition - mHistoryCount);
-                mBeyondCursor = false;
             } else {
-                mBeyondCursor = true;
+                mSuggestCursor.moveToPosition(newPosition - mHistoryCount);
             }
             return true;
         }
 
         @Override
         public int getCount() {
-            if (mString.length() > 0) {
+            if (mIncludeWebSearch) {
                 return mHistoryCount + mSuggestionCount + 1;
             } else {
                 return mHistoryCount + mSuggestionCount;
@@ -519,43 +522,44 @@
         @Override
         public String getString(int columnIndex) {
             if ((mPos != -1 && mHistoryCursor != null)) {
+                int position = mIncludeWebSearch ? mPos - 1 : mPos;
                 switch(columnIndex) {
                     case SUGGEST_COLUMN_INTENT_ACTION_ID:
-                        if (mHistoryCount > mPos) {
+                        if (position >= 0 && position < mHistoryCount) {
                             return Intent.ACTION_VIEW;
                         } else {
                             return Intent.ACTION_SEARCH;
                         }
 
                     case SUGGEST_COLUMN_INTENT_DATA_ID:
-                        if (mHistoryCount > mPos) {
+                        if (position >= 0 && position < mHistoryCount) {
                             return mHistoryCursor.getString(1);
                         } else {
                             return null;
                         }
 
                     case SUGGEST_COLUMN_TEXT_1_ID:
-                        if (mHistoryCount > mPos) {
+                        if (position < 0) {
+                            return mString;
+                        } else if (mHistoryCount > position) {
                             return getHistoryTitle();
-                        } else if (!mBeyondCursor) {
+                        } else {
                             if (mSuggestText1Id == -1) return null;
                             return mSuggestCursor.getString(mSuggestText1Id);
-                        } else {
-                            return mString;
                         }
 
                     case SUGGEST_COLUMN_TEXT_2_ID:
-                        if (mHistoryCount > mPos) {
+                        if (position < 0) {
+                            return getContext().getString(R.string.search_the_web);
+                        } else if (mHistoryCount > position) {
                             return getHistorySubtitle();
-                        } else if (!mBeyondCursor) {
+                        } else {
                             if (mSuggestText2Id == -1) return null;
                             return mSuggestCursor.getString(mSuggestText2Id);
-                        } else {
-                            return getContext().getString(R.string.search_the_web);
                         }
 
                     case SUGGEST_COLUMN_ICON_1_ID:
-                        if (mHistoryCount > mPos) {
+                        if (position >= 0 && position < mHistoryCount) {
                             if (mHistoryCursor.getInt(3) == 1) {
                                 return Integer.valueOf(
                                         R.drawable.ic_search_category_bookmark)
@@ -575,30 +579,30 @@
                         return "0";
 
                     case SUGGEST_COLUMN_QUERY_ID:
-                        if (mHistoryCount > mPos) {
+                        if (position < 0) {
+                            return mString;
+                        } else if (mHistoryCount > position) {
                             // Return the url in the intent query column. This is ignored
                             // within the browser because our searchable is set to
                             // android:searchMode="queryRewriteFromData", but it is used by
                             // global search for query rewriting.
                             return mHistoryCursor.getString(1);
-                        } else if (!mBeyondCursor) {
+                        } else {
                             if (mSuggestQueryId == -1) return null;
                             return mSuggestCursor.getString(mSuggestQueryId);
-                        } else {
-                            return mString;
                         }
 
                     case SUGGEST_COLUMN_FORMAT:
                         return "html";
 
                     case SUGGEST_COLUMN_INTENT_EXTRA_DATA:
-                        if (mHistoryCount > mPos) {
+                        if (position < 0) {
                             return null;
-                        } else if (!mBeyondCursor) {
+                        } else if (mHistoryCount > position) {
+                            return null;
+                        } else {
                             if (mSuggestIntentExtraDataId == -1) return null;
                             return mSuggestCursor.getString(mSuggestIntentExtraDataId);
-                        } else {
-                            return null;
                         }
                 }
             }
