diff --git a/src/com/android/browser/AddNewBookmark.java b/src/com/android/browser/AddNewBookmark.java
index a75d002..5308f6b 100644
--- a/src/com/android/browser/AddNewBookmark.java
+++ b/src/com/android/browser/AddNewBookmark.java
@@ -47,17 +47,7 @@
         mUrlText = (TextView) findViewById(R.id.url);
         mImageView = (ImageView) findViewById(R.id.favicon);
     }
-    
-    /**
-     *  Copy this BookmarkItem to item.
-     *  @param item BookmarkItem to receive the info from this BookmarkItem.
-     */
-    /* package */ void copyTo(AddNewBookmark item) {
-        item.mTextView.setText(mTextView.getText());
-        item.mUrlText.setText(mUrlText.getText());
-        item.mImageView.setImageDrawable(mImageView.getDrawable());
-    }
-    
+
     /**
      *  Set the new url for the bookmark item.
      *  @param url  The new url for the bookmark item.
diff --git a/src/com/android/browser/BookmarkGridPage.java b/src/com/android/browser/BookmarkGridPage.java
index 2e05183..5517d9c 100644
--- a/src/com/android/browser/BookmarkGridPage.java
+++ b/src/com/android/browser/BookmarkGridPage.java
@@ -16,266 +16,32 @@
 
 package com.android.browser;
 
-import android.app.Activity;
 import android.content.Context;
-import android.content.Intent;
-import android.database.Cursor;
-import android.database.ContentObserver;
-import android.database.DataSetObserver;
-import android.graphics.BitmapFactory;
-import android.os.Bundle;
-import android.os.Handler;
-import android.provider.Browser;
-import android.provider.Browser.BookmarkColumns;
-import android.view.LayoutInflater;
-import android.view.View;
-import android.view.ViewGroup;
-import android.widget.AdapterView;
 import android.widget.GridView;
-import android.widget.ImageView;
-import android.widget.ListAdapter;
-import android.widget.TextView;
 
 import java.util.ArrayList;
 
-public class BookmarkGridPage extends Activity {
-    private final static int SPACING = 10;
-    private static final int BOOKMARKS_SAVE = 1;
-    private BookmarkGrid mGridView;
-    private BookmarkGridAdapter mAdapter;
+public class BookmarkGridPage extends GridView {
+    private final static int            SPACING = 10;
+    private BrowserBookmarksAdapter     mAdapter;
 
-    @Override
-    public void onCreate(Bundle savedInstanceState) {
-        super.onCreate(savedInstanceState);
-
-        mGridView = new BookmarkGrid(this);
-        mGridView.setNumColumns(3);
-        mAdapter = new BookmarkGridAdapter(this);
-        mGridView.setAdapter(mAdapter);
-        mGridView.setFocusable(true);
-        mGridView.setFocusableInTouchMode(true);
-        mGridView.setSelector(android.R.drawable.gallery_thumb);
-        mGridView.setVerticalSpacing(SPACING);
-        mGridView.setHorizontalSpacing(SPACING);
-        setContentView(mGridView);
-        mGridView.requestFocus();
+    public BookmarkGridPage(Context context, BrowserBookmarksAdapter adapter) {
+        super(context);
+        setNumColumns(3);
+        mAdapter = adapter;
+        setAdapter(mAdapter);
+        setFocusable(true);
+        setFocusableInTouchMode(true);
+        setSelector(android.R.drawable.gallery_thumb);
+        setVerticalSpacing(SPACING);
+        setHorizontalSpacing(SPACING);
     }
 
     @Override
-    protected void onActivityResult(int requestCode, int resultCode,
-                                    Intent data) {
-        switch(requestCode) {
-            case BOOKMARKS_SAVE:
-                if (resultCode == RESULT_OK) {
-                    mAdapter.refreshData();
-                }
-                break;
-            default:
-                break;
-        }
-    }
-
-    private class BookmarkGrid extends GridView {
-        public BookmarkGrid(Context context) {
-            super(context);
-        }
-        @Override
-        protected void onSizeChanged(int w, int h, int oldw, int oldh) {
-            int thumbHeight = (h - 2 * (SPACING + getListPaddingTop()
-                    + getListPaddingBottom())) / 3;
-            mAdapter.heightChanged(thumbHeight);
-            super.onSizeChanged(w, h, oldw, oldh);
-        }
-    }
-
-    private class BookmarkGridAdapter implements ListAdapter {
-        private ArrayList<DataSetObserver> mDataObservers;
-        private Context mContext;  // Context to use to inflate views
-        private Cursor  mCursor;
-        private int mThumbHeight;
-
-        public BookmarkGridAdapter(Context context) {
-            mContext = context;
-            mDataObservers = new ArrayList<DataSetObserver>();
-            String whereClause = Browser.BookmarkColumns.BOOKMARK + " != 0";
-            String orderBy = Browser.BookmarkColumns.VISITS + " DESC";
-            mCursor = managedQuery(Browser.BOOKMARKS_URI,
-                    Browser.HISTORY_PROJECTION, whereClause, null, orderBy);
-            mCursor.registerContentObserver(new ChangeObserver());
-            mGridView.setOnItemClickListener(
-                    new AdapterView.OnItemClickListener() {
-                public void onItemClick(AdapterView parent, View v,
-                        int position, long id) {
-                    if (0 == position) {
-                        // Launch the add bookmark activity
-                        Intent i = new Intent(BookmarkGridPage.this,
-                                AddBookmarkPage.class);
-                        i.putExtras(getIntent());
-                        startActivityForResult(i, BOOKMARKS_SAVE);
-                        return;
-                    }
-                    position--;
-                    mCursor.moveToPosition(position);
-                    String url = mCursor.getString(
-                            Browser.HISTORY_PROJECTION_URL_INDEX);
-                    Intent intent = (new Intent()).setAction(url);
-                    getParent().setResult(RESULT_OK, intent);
-                    finish();
-                }});
-        }
-
-        void heightChanged(int newHeight) {
-            mThumbHeight = newHeight;
-        }
-
-        private class ChangeObserver extends ContentObserver {
-            public ChangeObserver() {
-                super(new Handler());
-            }
-
-            @Override
-            public boolean deliverSelfNotifications() {
-                return true;
-            }
-
-            @Override
-            public void onChange(boolean selfChange) {
-                BookmarkGridAdapter.this.refreshData();
-            }
-        }
-
-        void refreshData() {
-            mCursor.requery();
-            for (DataSetObserver o : mDataObservers) {
-                o.onChanged();
-            }
-        }
-
-        /* (non-Javadoc)
-         * @see android.widget.ListAdapter#areAllItemsSelectable()
-         */
-        public boolean areAllItemsEnabled() {
-            return true;
-        }
-
-        /* (non-Javadoc)
-         * @see android.widget.ListAdapter#isSelectable(int)
-         */
-        public boolean isEnabled(int position) {
-            if (position >= 0 && position < mCursor.getCount()) {
-                return true;
-            }
-            return false;
-        }
-
-        /* (non-Javadoc)
-         * @see android.widget.Adapter#getCount()
-         */
-        public int getCount() {
-            return mCursor.getCount();
-        }
-
-        /* (non-Javadoc)
-         * @see android.widget.Adapter#getItem(int)
-         */
-        public Object getItem(int position) {
-            return null;
-        }
-
-        /* (non-Javadoc)
-         * @see android.widget.Adapter#getItemId(int)
-         */
-        public long getItemId(int position) {
-            return position;
-        }
-
-        /* (non-Javadoc)
-         * @see android.widget.Adapter#getView(int, android.view.View, android.view.ViewGroup)
-         */
-        public View getView(int position, View convertView, ViewGroup parent) {
-            View v = null;
-            if (convertView != null) {
-                v = convertView;
-            } else {
-                LayoutInflater factory = LayoutInflater.from(mContext);
-                v = factory.inflate(R.layout.bookmark_thumbnail, null);
-            }
-            ImageView thumb = (ImageView) v.findViewById(R.id.thumb);
-            // Favicon disabled for now.
-            //ImageView fav = (ImageView) v.findViewById(R.id.fav);
-            TextView tv = (TextView) v.findViewById(R.id.label);
-
-            ViewGroup.LayoutParams lp = thumb.getLayoutParams();
-            if (lp.height != mThumbHeight) {
-                lp.height = mThumbHeight;
-                thumb.requestLayout();
-            }
-
-            if (0 == position) {
-                // This is to create a bookmark for the current page.
-                tv.setText(R.string.add_new_bookmark);
-                thumb.setImageResource(
-                        R.drawable.ic_tab_browser_bookmark_selected);
-                return v;
-            }
-            position--;
-            mCursor.moveToPosition(position);
-            tv.setText(mCursor.getString(
-                    Browser.HISTORY_PROJECTION_TITLE_INDEX));
-            byte[] data = mCursor.getBlob(
-                    Browser.HISTORY_PROJECTION_THUMBNAIL_INDEX);
-            if (data == null) {
-                // Backup is to just show white
-                thumb.setImageResource(R.drawable.blank);
-            } else {
-                thumb.setImageBitmap(
-                        BitmapFactory.decodeByteArray(data, 0, data.length));
-            }
-/*
-            // Now show the favicon
-            data = mCursor.getBlob(Browser.HISTORY_PROJECTION_FAVICON_INDEX);
-            if (data == null) {
-                fav.setVisibility(View.GONE);
-            } else {
-                fav.setVisibility(View.VISIBLE);
-                fav.setImageBitmap(
-                        BitmapFactory.decodeByteArray(data, 0, data.length));
-            }
-*/
-            return v;
-        }
-
-        /* (non-Javadoc)
-         * @see android.widget.Adapter#registerDataSetObserver(android.database.DataSetObserver)
-         */
-        public void registerDataSetObserver(DataSetObserver observer) {
-            mDataObservers.add(observer);
-        }
-
-        /* (non-Javadoc)
-         * @see android.widget.Adapter#hasStableIds()
-         */
-        public boolean hasStableIds() {
-            return true;
-        }
-
-        /* (non-Javadoc)
-         * @see android.widget.Adapter#unregisterDataSetObserver(android.database.DataSetObserver)
-         */
-        public void unregisterDataSetObserver(DataSetObserver observer) {
-            mDataObservers.remove(observer);
-        }
-
-        public int getItemViewType(int position) {
-            return 0;
-        }
-
-        public int getViewTypeCount() {
-            return 1;
-        }
-
-        public boolean isEmpty() {
-            return getCount() == 0;
-        }
+    protected void onSizeChanged(int w, int h, int oldw, int oldh) {
+        int thumbHeight = (h - 2 * (SPACING + getListPaddingTop()
+                + getListPaddingBottom())) / 3;
+        mAdapter.heightChanged(thumbHeight);
+        super.onSizeChanged(w, h, oldw, oldh);
     }
 }
diff --git a/src/com/android/browser/BrowserBookmarksAdapter.java b/src/com/android/browser/BrowserBookmarksAdapter.java
index c403b44..c7210af 100644
--- a/src/com/android/browser/BrowserBookmarksAdapter.java
+++ b/src/com/android/browser/BrowserBookmarksAdapter.java
@@ -30,11 +30,14 @@
 import android.provider.Browser;
 import android.provider.Browser.BookmarkColumns;
 import android.view.KeyEvent;
+import android.view.LayoutInflater;
 import android.view.View;
 import android.view.ViewGroup;
 import android.webkit.WebIconDatabase;
 import android.webkit.WebIconDatabase.IconListener;
 import android.widget.BaseAdapter;
+import android.widget.ImageView;
+import android.widget.TextView;
 
 import java.io.ByteArrayOutputStream;
 
@@ -43,15 +46,14 @@
     private String                  mCurrentPage;
     private Cursor                  mCursor;
     private int                     mCount;
-    private String                  mLastWhereClause;
-    private String[]                mLastSelectionArgs;
-    private String                  mLastOrderBy;
     private BrowserBookmarksPage    mBookmarksPage;
     private ContentResolver         mContentResolver;
-    private ChangeObserver          mChangeObserver;
-    private DataSetObserver         mDataSetObserver;
     private boolean                 mDataValid;
 
+    // The following variables are used for the grid mode
+    private boolean                 mGridMode;
+    private int                     mThumbHeight;
+
     // When true, this adapter is used to pick a bookmark to create a shortcut
     private boolean mCreateShortcut;
     private int mExtraOffset;
@@ -91,11 +93,21 @@
         mCurrentPage = b.getResources().getString(R.string.current_page) + 
                 curPage;
         mContentResolver = b.getContentResolver();
-        mLastOrderBy = Browser.BookmarkColumns.CREATED + " DESC";
-        mChangeObserver = new ChangeObserver();
-        mDataSetObserver = new MyDataSetObserver();
+        mGridMode = false;
+
         // FIXME: Should have a default sort order that the user selects.
-        search(null);
+        String whereClause = Browser.BookmarkColumns.BOOKMARK + " != 0";
+        String orderBy = Browser.BookmarkColumns.VISITS + " DESC";
+        mCursor = b.managedQuery(Browser.BOOKMARKS_URI,
+                Browser.HISTORY_PROJECTION, whereClause, null, orderBy);
+        mCursor.registerContentObserver(new ChangeObserver());
+        mCursor.registerDataSetObserver(new MyDataSetObserver());
+
+        mDataValid = true;
+        notifyDataSetChanged();
+
+        mCount = mCursor.getCount() + mExtraOffset;
+
         // FIXME: This requires another query of the database after the
         // initial search(null). Can we optimize this?
         Browser.requestAllIcons(mContentResolver,
@@ -240,52 +252,9 @@
      *  Refresh list to recognize a change in the database.
      */
     public void refreshList() {
-        // FIXME: consider using requery().
-        // Need to do more work to get it to function though.
-        searchInternal(mLastWhereClause, mLastSelectionArgs, mLastOrderBy);
-    }
-
-    /**
-     *  Search the database for bookmarks that match the input string.
-     *  @param like String to use to search the database.  Strings with spaces 
-     *              are treated as having multiple search terms using the
-     *              OR operator.  Search both the title and url.
-     */
-    public void search(String like) {
-        String whereClause = Browser.BookmarkColumns.BOOKMARK + " == 1";
-        String[] selectionArgs = null;
-        if (like != null) {
-            String[] likes = like.split(" ");
-            int count = 0;
-            boolean firstTerm = true;
-            StringBuilder andClause = new StringBuilder(256);
-            for (int j = 0; j < likes.length; j++) {
-                if (likes[j].length() > 0) {
-                    if (firstTerm) {
-                        firstTerm = false;
-                    } else {
-                        andClause.append(" OR ");
-                    }
-                    andClause.append(Browser.BookmarkColumns.TITLE
-                            + " LIKE ? OR " + Browser.BookmarkColumns.URL
-                            + " LIKE ? ");
-                    count += 2;
-                }
-            }
-            if (count > 0) {
-                selectionArgs = new String[count];
-                count = 0;
-                for (int j = 0; j < likes.length; j++) {
-                    if (likes[j].length() > 0) {
-                        like = "%" + likes[j] + "%";
-                        selectionArgs[count++] = like;
-                        selectionArgs[count++] = like;
-                    }
-                }
-                whereClause += " AND (" + andClause + ")";
-            }
-        }
-        searchInternal(whereClause, selectionArgs, mLastOrderBy);
+        mCursor.requery();
+        mCount = mCursor.getCount() + mExtraOffset;
+        notifyDataSetChanged();
     }
 
     /**
@@ -335,46 +304,6 @@
     }
 
     /**
-     *  This sorts alphabetically, with non-capitalized titles before 
-     *  capitalized.
-     */
-    public void sortAlphabetical() {
-        searchInternal(mLastWhereClause, mLastSelectionArgs,
-                Browser.BookmarkColumns.TITLE + " COLLATE UNICODE ASC");
-    }
-
-    /**
-     *  Internal function used in search, sort, and refreshList.
-     */
-    private void searchInternal(String whereClause, String[] selectionArgs,
-            String orderBy) {
-        if (mCursor != null) {
-            mCursor.unregisterContentObserver(mChangeObserver);
-            mCursor.unregisterDataSetObserver(mDataSetObserver);
-            mBookmarksPage.stopManagingCursor(mCursor);
-            mCursor.deactivate();
-        }
-
-        mLastWhereClause = whereClause;
-        mLastSelectionArgs = selectionArgs;
-        mLastOrderBy = orderBy;
-        mCursor = mContentResolver.query(
-            Browser.BOOKMARKS_URI,
-            Browser.HISTORY_PROJECTION,
-            whereClause,
-            selectionArgs, 
-            orderBy);
-        mCursor.registerContentObserver(mChangeObserver);
-        mCursor.registerDataSetObserver(mDataSetObserver);
-        mBookmarksPage.startManagingCursor(mCursor);
-
-        mDataValid = true;
-        notifyDataSetChanged();
-
-        mCount = mCursor.getCount() + mExtraOffset;
-    }
-
-    /**
      * How many items should be displayed in the list.
      * @return Count of items.
      */
@@ -412,6 +341,24 @@
         return position;
     }
 
+    /* package */ void heightChanged(int newHeight) {
+        mThumbHeight = newHeight;
+    }
+
+    /* package */ void switchViewMode(boolean toGrid) {
+        mGridMode = toGrid;
+    }
+
+    /* package */ void populateBookmarkItem(BookmarkItem b, int position) {
+        mCursor.moveToPosition(position - mExtraOffset);
+        b.setUrl(mCursor.getString(Browser.HISTORY_PROJECTION_URL_INDEX));
+        b.setName(mCursor.getString(Browser.HISTORY_PROJECTION_TITLE_INDEX));
+        byte[] data = mCursor.getBlob(Browser.HISTORY_PROJECTION_FAVICON_INDEX);
+        Bitmap bitmap = (null == data) ? null :
+                BitmapFactory.decodeByteArray(data, 0, data.length);
+        b.setFavicon(bitmap);
+    }
+
     /**
      * Get a View that displays the data at the specified position
      * in the list.
@@ -427,6 +374,57 @@
             throw new AssertionError(
                     "BrowserBookmarksAdapter tried to get a view out of range");
         }
+        if (mGridMode) {
+            if (convertView == null || convertView instanceof AddNewBookmark
+                    || convertView instanceof BookmarkItem) {
+                LayoutInflater factory = LayoutInflater.from(mBookmarksPage);
+                convertView
+                        = factory.inflate(R.layout.bookmark_thumbnail, null);
+            }
+            ImageView thumb = (ImageView) convertView.findViewById(R.id.thumb);
+            // Favicon disabled for now.
+            //ImageView fav = (ImageView) convertView.findViewById(R.id.fav);
+            TextView tv = (TextView) convertView.findViewById(R.id.label);
+
+            ViewGroup.LayoutParams lp = thumb.getLayoutParams();
+            if (lp.height != mThumbHeight) {
+                lp.height = mThumbHeight;
+                thumb.requestLayout();
+            }
+
+            if (0 == position && !mCreateShortcut) {
+                // This is to create a bookmark for the current page.
+                tv.setText(R.string.add_new_bookmark);
+                thumb.setImageResource(
+                        R.drawable.ic_tab_browser_bookmark_selected);
+                return convertView;
+            }
+            mCursor.moveToPosition(position - mExtraOffset);
+            tv.setText(mCursor.getString(
+                    Browser.HISTORY_PROJECTION_TITLE_INDEX));
+            byte[] data = mCursor.getBlob(
+                    Browser.HISTORY_PROJECTION_THUMBNAIL_INDEX);
+            if (data == null) {
+                // Backup is to just show white
+                thumb.setImageResource(R.drawable.blank);
+            } else {
+                thumb.setImageBitmap(
+                        BitmapFactory.decodeByteArray(data, 0, data.length));
+            }
+/*
+            // Now show the favicon
+            data = mCursor.getBlob(Browser.HISTORY_PROJECTION_FAVICON_INDEX);
+            if (data == null) {
+                fav.setVisibility(View.GONE);
+            } else {
+                fav.setVisibility(View.VISIBLE);
+                fav.setImageBitmap(
+                        BitmapFactory.decodeByteArray(data, 0, data.length));
+            }
+*/
+            return convertView;
+
+        }
         if (position == 0 && !mCreateShortcut) {
             AddNewBookmark b;
             if (convertView instanceof AddNewBookmark) {
@@ -437,7 +435,7 @@
             b.setUrl(mCurrentPage);
             return b;
         }
-        if (convertView == null || convertView instanceof AddNewBookmark) {
+        if (convertView == null || !(convertView instanceof BookmarkItem)) {
             convertView = new BookmarkItem(mBookmarksPage);
         }
         bind((BookmarkItem)convertView, position);
diff --git a/src/com/android/browser/BrowserBookmarksPage.java b/src/com/android/browser/BrowserBookmarksPage.java
index 45fca87..513ce3e 100644
--- a/src/com/android/browser/BrowserBookmarksPage.java
+++ b/src/com/android/browser/BrowserBookmarksPage.java
@@ -36,6 +36,7 @@
 import android.util.Log;
 import android.view.ContextMenu;
 import android.view.KeyEvent;
+import android.view.LayoutInflater;
 import android.view.Menu;
 import android.view.MenuInflater;
 import android.view.MenuItem;
@@ -52,6 +53,9 @@
 public class BrowserBookmarksPage extends Activity implements 
         View.OnCreateContextMenuListener {
 
+    private boolean                 mGridMode;
+    private BookmarkGridPage        mGridPage;
+    private View                    mVerticalList;
     private BrowserBookmarksAdapter mBookmarksAdapter;
     private static final int        BOOKMARKS_SAVE = 1;
     private boolean                 mMaxTabsOpen;
@@ -138,25 +142,29 @@
                     ((ViewGroup) mAddHeader.getParent()).
                             removeView(mAddHeader);
                 }
-                ((AddNewBookmark) i.targetView).copyTo(mAddHeader);
+                mAddHeader.setUrl(getIntent().getStringExtra("url"));
                 menu.setHeaderView(mAddHeader);
                 return;
             }
             menu.setGroupVisible(R.id.ADD_MENU, false);
-            BookmarkItem b = (BookmarkItem) i.targetView;
+            if (mMaxTabsOpen) {
+                menu.findItem(R.id.new_window_context_menu_id).setVisible(
+                        false);
+            }
             if (mContextHeader == null) {
                 mContextHeader = new BookmarkItem(BrowserBookmarksPage.this);
             } else if (mContextHeader.getParent() != null) {
                 ((ViewGroup) mContextHeader.getParent()).
                         removeView(mContextHeader);
             }
-            b.copyTo(mContextHeader);
-            menu.setHeaderView(mContextHeader);
-
-            if (mMaxTabsOpen) {
-                menu.findItem(R.id.new_window_context_menu_id).setVisible(
-                        false);
+            if (mGridMode) {
+                mBookmarksAdapter.populateBookmarkItem(mContextHeader,
+                        i.position);
+            } else {
+                BookmarkItem b = (BookmarkItem) i.targetView;
+                b.copyTo(mContextHeader);
             }
+            menu.setHeaderView(mContextHeader);
         }
 
     /**
@@ -166,25 +174,52 @@
     protected void onCreate(Bundle icicle) {
         super.onCreate(icicle);
 
-        setContentView(R.layout.browser_bookmarks_page);
-        setTitle(R.string.browser_bookmarks_page_bookmarks_text);
-
         if (Intent.ACTION_CREATE_SHORTCUT.equals(getIntent().getAction())) {
             mCreateShortcut = true;
         }
-
-        mBookmarksAdapter = new BrowserBookmarksAdapter(this, 
-                getIntent().getStringExtra("url"), mCreateShortcut);
         mMaxTabsOpen = getIntent().getBooleanExtra("maxTabsOpen", false);
 
-        ListView listView = (ListView) findViewById(R.id.list);
-        listView.setAdapter(mBookmarksAdapter);
-        listView.setDrawSelectorOnTop(false);
-        listView.setVerticalScrollBarEnabled(true);
-        listView.setOnItemClickListener(mListener);
+        setTitle(R.string.browser_bookmarks_page_bookmarks_text);
+        mBookmarksAdapter = new BrowserBookmarksAdapter(this,
+                        getIntent().getStringExtra("url"), mCreateShortcut);
+        mGridMode = true;
+        switchViewMode(mGridMode);
+    }
 
-        if (!mCreateShortcut) {
-            listView.setOnCreateContextMenuListener(this);
+    /**
+     *  Set the ContentView to be either the grid of thumbnails or the vertical
+     *  list.  Pass true to set it to the grid.
+     */
+    private void switchViewMode(boolean gridMode) {
+        mGridMode = gridMode;
+        mBookmarksAdapter.switchViewMode(gridMode);
+        if (mGridMode) {
+            if (mGridPage == null) {
+                mGridPage = new BookmarkGridPage(this, mBookmarksAdapter);
+                mGridPage.setOnItemClickListener(mListener);
+                if (!mCreateShortcut) {
+                    mGridPage.setOnCreateContextMenuListener(this);
+                }
+            }
+            setContentView(mGridPage);
+        } else {
+            if (null == mVerticalList) {
+                LayoutInflater factory = LayoutInflater.from(this);
+                mVerticalList = factory.inflate(R.layout.browser_bookmarks_page,
+                        null);
+
+                ListView listView
+                        = (ListView) mVerticalList.findViewById(R.id.list);
+                listView.setAdapter(mBookmarksAdapter);
+                listView.setDrawSelectorOnTop(false);
+                listView.setVerticalScrollBarEnabled(true);
+                listView.setOnItemClickListener(mListener);
+
+                if (!mCreateShortcut) {
+                    listView.setOnCreateContextMenuListener(this);
+                }
+            }
+            setContentView(mVerticalList);
         }
     }
 
@@ -203,7 +238,7 @@
             // It is possible that the view has been canceled when we get to
             // this point as back has a higher priority 
             if (mCanceled) {
-                android.util.Log.e("browser", "item clicked when dismising");
+                android.util.Log.e(LOGTAG, "item clicked when dismissing");
                 return;
             }
             if (!mCreateShortcut) {
@@ -301,12 +336,16 @@
     @Override
     public boolean onOptionsItemSelected(MenuItem item) {
         switch (item.getItemId()) {
-            case R.id.new_context_menu_id:
-                saveCurrentPage();
-                break;
-                
-            default:
-                return super.onOptionsItemSelected(item);
+        case R.id.new_context_menu_id:
+            saveCurrentPage();
+            break;
+
+        case R.id.switch_mode_menu_id:
+            switchViewMode(!mGridMode);
+            break;
+
+        default:
+            return super.onOptionsItemSelected(item);
         }
         return true;
     }
@@ -377,7 +416,7 @@
     /**
      *  Refresh the shown list after the database has changed.
      */
-    public void refreshList() {
+    private void refreshList() {
         mBookmarksAdapter.refreshList();
     }
     
diff --git a/src/com/android/browser/CombinedBookmarkHistoryActivity.java b/src/com/android/browser/CombinedBookmarkHistoryActivity.java
index 6926c8f..963f179 100644
--- a/src/com/android/browser/CombinedBookmarkHistoryActivity.java
+++ b/src/com/android/browser/CombinedBookmarkHistoryActivity.java
@@ -84,7 +84,7 @@
         Resources resources = getResources();
 
         getIconListenerSet(getContentResolver());
-        Intent bookmarksIntent = new Intent(this, BookmarkGridPage.class);
+        Intent bookmarksIntent = new Intent(this, BrowserBookmarksPage.class);
         bookmarksIntent.putExtras(extras);
         tabHost.addTab(tabHost.newTabSpec(BOOKMARKS_TAB)
                 .setIndicator(resources.getString(R.string.tab_bookmarks),
