diff --git a/src/com/android/browser/AddBookmarkPage.java b/src/com/android/browser/AddBookmarkPage.java
index d269546..87638d8 100644
--- a/src/com/android/browser/AddBookmarkPage.java
+++ b/src/com/android/browser/AddBookmarkPage.java
@@ -150,7 +150,7 @@
                 if (mTouchIconUrl != null) {
                     final Cursor c =
                             BrowserBookmarksAdapter.queryBookmarksForUrl(
-                                    cr, null, url);
+                                    cr, null, url, true);
                     new DownloadTouchIcon(cr, c, url)
                             .execute(mTouchIconUrl);
                 }
diff --git a/src/com/android/browser/BrowserActivity.java b/src/com/android/browser/BrowserActivity.java
index 3c46fc9..68ccf79 100644
--- a/src/com/android/browser/BrowserActivity.java
+++ b/src/com/android/browser/BrowserActivity.java
@@ -2929,7 +2929,7 @@
         // currently accessible here.
         ContentResolver cr = getContentResolver();
         final Cursor c = BrowserBookmarksAdapter.queryBookmarksForUrl(
-                cr, view.getOriginalUrl(), view.getUrl());
+                cr, view.getOriginalUrl(), view.getUrl(), false);
         if (c != null) {
             boolean succeed = c.moveToFirst();
             ContentValues values = null;
@@ -3790,7 +3790,7 @@
             final ContentResolver cr = getContentResolver();
             final Cursor c =
                     BrowserBookmarksAdapter.queryBookmarksForUrl(cr,
-                            view.getOriginalUrl(), view.getUrl());
+                            view.getOriginalUrl(), view.getUrl(), true);
             if (c != null) {
                 if (c.getCount() > 0) {
                     new DownloadTouchIcon(cr, c, view).execute(url);
diff --git a/src/com/android/browser/BrowserBookmarksAdapter.java b/src/com/android/browser/BrowserBookmarksAdapter.java
index c3ccdfd..bf74ba2 100644
--- a/src/com/android/browser/BrowserBookmarksAdapter.java
+++ b/src/com/android/browser/BrowserBookmarksAdapter.java
@@ -52,10 +52,9 @@
     private ContentResolver         mContentResolver;
     private boolean                 mDataValid;
     private boolean                 mGridMode;
-
-    // When true, this adapter is used to pick a bookmark to create a shortcut
-    private boolean mCreateShortcut;
-    private int mExtraOffset;
+    private boolean                 mMostVisited;
+    private boolean                 mNeedsOffset;
+    private int                     mExtraOffset;
 
     // Implementation of WebIconDatabase.IconListener
     private class IconReceiver implements IconListener {
@@ -74,10 +73,10 @@
      *                  appropriately after a search.
      */
     public BrowserBookmarksAdapter(BrowserBookmarksPage b, String curPage,
-            String curTitle, boolean createShortcut) {
-        mDataValid = false;
-        mCreateShortcut = createShortcut;
-        mExtraOffset = createShortcut ? 0 : 1;
+            String curTitle, boolean createShortcut, boolean mostVisited) {
+        mNeedsOffset = !(createShortcut || mostVisited);
+        mMostVisited = mostVisited;
+        mExtraOffset = mNeedsOffset ? 1 : 0;
         mBookmarksPage = b;
         mCurrentPage = b.getResources().getString(R.string.current_page)
                 + curPage;
@@ -85,9 +84,14 @@
         mContentResolver = b.getContentResolver();
         mGridMode = false;
 
+        String whereClause;
         // FIXME: Should have a default sort order that the user selects.
-        String whereClause = Browser.BookmarkColumns.BOOKMARK + " != 0";
         String orderBy = Browser.BookmarkColumns.VISITS + " DESC";
+        if (mostVisited) {
+            whereClause = Browser.BookmarkColumns.VISITS + " != 0";
+        } else {
+            whereClause = Browser.BookmarkColumns.BOOKMARK + " != 0";
+        }
         mCursor = b.managedQuery(Browser.BOOKMARKS_URI,
                 Browser.HISTORY_PROJECTION, whereClause, null, orderBy);
         mCursor.registerContentObserver(new ChangeObserver());
@@ -264,7 +268,7 @@
 
     private static void updateBookmarkFavicon(ContentResolver cr,
             String originalUrl, String url, Bitmap favicon) {
-        final Cursor c = queryBookmarksForUrl(cr, originalUrl, url);
+        final Cursor c = queryBookmarksForUrl(cr, originalUrl, url, true);
         if (c == null) {
             return;
         }
@@ -285,7 +289,7 @@
     }
 
     /* package */ static Cursor queryBookmarksForUrl(ContentResolver cr,
-            String originalUrl, String url) {
+            String originalUrl, String url, boolean onlyBookmarks) {
         if (cr == null || url == null) {
             return null;
         }
@@ -309,11 +313,13 @@
         // http://www.google.com/m?some_query)
         final String[] selArgs = new String[] {
             originalUrlNoQuery, urlNoQuery, originalUrl, url };
-        final String where = "(" + BookmarkColumns.URL + " == ? OR "
+        String where = BookmarkColumns.URL + " == ? OR "
                 + BookmarkColumns.URL + " == ? OR "
                 + BookmarkColumns.URL + " GLOB ? || '*' OR "
-                + BookmarkColumns.URL + " GLOB ? || '*') AND "
-                + BookmarkColumns.BOOKMARK + " == 1";
+                + BookmarkColumns.URL + " GLOB ? || '*'";
+        if (onlyBookmarks) {
+            where = "(" + where + ") AND " + BookmarkColumns.BOOKMARK + " == 1";
+        }
         final String[] projection =
                 new String[] { Browser.BookmarkColumns._ID };
         return cr.query(Browser.BOOKMARKS_URI, projection, where, selArgs,
@@ -411,7 +417,7 @@
             ImageView thumb = (ImageView) convertView.findViewById(R.id.thumb);
             TextView tv = (TextView) convertView.findViewById(R.id.label);
 
-            if (0 == position && !mCreateShortcut) {
+            if (0 == position && mNeedsOffset) {
                 // This is to create a bookmark for the current page.
                 holder.setVisibility(View.VISIBLE);
                 tv.setText(mCurrentTitle);
@@ -436,7 +442,7 @@
             return convertView;
 
         }
-        if (position == 0 && !mCreateShortcut) {
+        if (position == 0 && mNeedsOffset) {
             AddNewBookmark b;
             if (convertView instanceof AddNewBookmark) {
                 b = (AddNewBookmark) convertView;
@@ -446,10 +452,20 @@
             b.setUrl(mCurrentPage);
             return b;
         }
-        if (convertView == null || !(convertView instanceof BookmarkItem)) {
-            convertView = new BookmarkItem(mBookmarksPage);
+        if (mMostVisited) {
+            if (convertView == null || !(convertView instanceof HistoryItem)) {
+                convertView = new HistoryItem(mBookmarksPage);
+            }
+        } else {
+            if (convertView == null || !(convertView instanceof BookmarkItem)) {
+                convertView = new BookmarkItem(mBookmarksPage);
+            }
         }
-        bind((BookmarkItem)convertView, position);
+        bind((BookmarkItem) convertView, position);
+        if (mMostVisited) {
+            ((HistoryItem) convertView).setIsBookmark(
+                    getIsBookmark(position));
+        }
         return convertView;
     }
 
@@ -491,6 +507,17 @@
     }
 
     /**
+     * Return whether or not this item represents a bookmarked site.
+     */
+    public boolean getIsBookmark(int position) {
+        if (position < mExtraOffset || position > mCount) {
+            return false;
+        }
+        mCursor.moveToPosition(position - mExtraOffset);
+        return (1 == mCursor.getInt(Browser.HISTORY_PROJECTION_BOOKMARK_INDEX));
+    }
+
+    /**
      * Private helper function to return the title or url.
      */
     private String getString(int cursorIndex, int position) {
diff --git a/src/com/android/browser/BrowserBookmarksPage.java b/src/com/android/browser/BrowserBookmarksPage.java
index 0fc2643..caadfdd 100644
--- a/src/com/android/browser/BrowserBookmarksPage.java
+++ b/src/com/android/browser/BrowserBookmarksPage.java
@@ -45,6 +45,8 @@
 import android.view.MenuItem;
 import android.view.View;
 import android.view.ViewGroup;
+import android.view.ViewGroup.LayoutParams;
+import android.view.ViewStub;
 import android.view.ContextMenu.ContextMenuInfo;
 import android.widget.AdapterView;
 import android.widget.GridView;
@@ -67,6 +69,8 @@
     private AddNewBookmark          mAddHeader;
     private boolean                 mCanceled = false;
     private boolean                 mCreateShortcut;
+    private boolean                 mMostVisited;
+    private View                    mEmptyView;
     // XXX: There is no public string defining this intent so if Home changes
     // the value, we have to update this string.
     private static final String     INSTALL_SHORTCUT =
@@ -105,12 +109,18 @@
             sendBroadcast(send);
             break;
         case R.id.delete_context_menu_id:
-            displayRemoveBookmarkDialog(i.position);
+            if (mMostVisited) {
+                Browser.deleteFromHistory(getContentResolver(),
+                        getUrl(i.position));
+                refreshList();
+            } else {
+                displayRemoveBookmarkDialog(i.position);
+            }
             break;
         case R.id.new_window_context_menu_id:
             openInNewWindow(i.position);
             break;
-        case R.id.send_context_menu_id:
+        case R.id.share_link_context_menu_id:
             Browser.sendString(BrowserBookmarksPage.this, getUrl(i.position));
             break;
         case R.id.copy_url_context_menu_id:
@@ -122,6 +132,19 @@
             Toast.makeText(this, R.string.homepage_set,
                     Toast.LENGTH_LONG).show();
             break;
+        // Only for the Most visited page
+        case R.id.save_to_bookmarks_menu_id:
+            HistoryItem historyItem = ((HistoryItem) i.targetView);
+            // If the site is bookmarked, the item becomes remove from
+            // bookmarks.
+            if (historyItem.isBookmark()) {
+                Bookmarks.removeFromBookmarks(this, getContentResolver(),
+                            historyItem.getUrl());
+            } else {
+                Browser.saveBookmark(this, historyItem.getName(),
+                        historyItem.getUrl());
+            }
+            break;
         default:
             return super.onContextItemSelected(item);
         }
@@ -135,9 +158,13 @@
                     (AdapterView.AdapterContextMenuInfo) menuInfo;
 
             MenuInflater inflater = getMenuInflater();
-            inflater.inflate(R.menu.bookmarkscontext, menu);
+            if (mMostVisited) {
+                inflater.inflate(R.menu.historycontext, menu);
+            } else {
+                inflater.inflate(R.menu.bookmarkscontext, menu);
+            }
 
-            if (0 == i.position) {
+            if (0 == i.position && !mMostVisited) {
                 menu.setGroupVisible(R.id.CONTEXT_MENU, false);
                 if (mAddHeader == null) {
                     mAddHeader = new AddNewBookmark(BrowserBookmarksPage.this);
@@ -149,7 +176,17 @@
                 menu.setHeaderView(mAddHeader);
                 return;
             }
-            menu.setGroupVisible(R.id.ADD_MENU, false);
+            if (mMostVisited) {
+                if ((!mGridMode && ((HistoryItem) i.targetView).isBookmark())
+                        || mBookmarksAdapter.getIsBookmark(i.position)) {
+                    MenuItem item = menu.findItem(
+                            R.id.save_to_bookmarks_menu_id);
+                    item.setTitle(R.string.remove_from_bookmarks);
+                }
+            } else {
+                // The historycontext menu has no ADD_MENU group.
+                menu.setGroupVisible(R.id.ADD_MENU, false);
+            }
             if (mMaxTabsOpen) {
                 menu.findItem(R.id.new_window_context_menu_id).setVisible(
                         false);
@@ -181,11 +218,18 @@
             mCreateShortcut = true;
         }
         mMaxTabsOpen = getIntent().getBooleanExtra("maxTabsOpen", false);
+        mMostVisited = getIntent().getBooleanExtra("mostVisited", false);
 
-        setTitle(R.string.browser_bookmarks_page_bookmarks_text);
+        if (mCreateShortcut) {
+            setTitle(R.string.browser_bookmarks_page_bookmarks_text);
+        }
         mBookmarksAdapter = new BrowserBookmarksAdapter(this,
                         getIntent().getStringExtra("url"),
-                        getIntent().getStringExtra("title"), mCreateShortcut);
+                        getIntent().getStringExtra("title"), mCreateShortcut,
+                        mMostVisited);
+        if (mMostVisited) {
+            mEmptyView = new ViewStub(this, R.layout.empty_history);
+        }
         switchViewMode(true);
     }
 
@@ -209,6 +253,9 @@
                 mGridPage.setFocusableInTouchMode(true);
                 mGridPage.setSelector(android.R.drawable.gallery_thumb);
                 mGridPage.setVerticalSpacing(10);
+                if (mMostVisited) {
+                    mGridPage.setEmptyView(mEmptyView);
+                }
                 if (!mCreateShortcut) {
                     mGridPage.setOnCreateContextMenuListener(this);
                 }
@@ -226,6 +273,9 @@
                 listView.setDrawSelectorOnTop(false);
                 listView.setVerticalScrollBarEnabled(true);
                 listView.setOnItemClickListener(mListener);
+                if (mMostVisited) {
+                    listView.setEmptyView(mEmptyView);
+                }
 
                 if (!mCreateShortcut) {
                     listView.setOnCreateContextMenuListener(this);
@@ -233,6 +283,10 @@
             }
             setContentView(mVerticalList);
         }
+        if (mMostVisited) {
+            addContentView(mEmptyView, new LayoutParams(
+                    LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT));
+        }
     }
 
     private static final int SAVE_CURRENT_PAGE = 1000;
@@ -254,7 +308,7 @@
                 return;
             }
             if (!mCreateShortcut) {
-                if (0 == position) {
+                if (0 == position && !mMostVisited) {
                     // XXX: Work-around for a framework issue.
                     mHandler.sendEmptyMessage(SAVE_CURRENT_PAGE);
                 } else {
@@ -366,6 +420,9 @@
         if (!mCreateShortcut) {
             MenuInflater inflater = getMenuInflater();
             inflater.inflate(R.menu.bookmarks, menu);
+            // Most visited page does not have an option to bookmark the last
+            // viewed page.
+            menu.findItem(R.id.new_context_menu_id).setVisible(!mMostVisited);
             return true;
         }
         return result;
@@ -373,6 +430,10 @@
 
     @Override
     public boolean onPrepareOptionsMenu(Menu menu) {
+        if (mBookmarksAdapter.getCount() == 0) {
+            // No need to show the menu if there are no items.
+            return false;
+        }
         menu.findItem(R.id.switch_mode_menu_id).setTitle(
                 mGridMode ? R.string.switch_to_list
                 : R.string.switch_to_thumbnails);
diff --git a/src/com/android/browser/BrowserHistoryPage.java b/src/com/android/browser/BrowserHistoryPage.java
index 335d8fe..cb8340e 100644
--- a/src/com/android/browser/BrowserHistoryPage.java
+++ b/src/com/android/browser/BrowserHistoryPage.java
@@ -236,7 +236,7 @@
             case R.id.share_link_context_menu_id:
                 Browser.sendString(this, url);
                 return true;
-            case R.id.copy_context_menu_id:
+            case R.id.copy_url_context_menu_id:
                 copy(url);
                 return true;
             case R.id.delete_context_menu_id:
diff --git a/src/com/android/browser/CombinedBookmarkHistoryActivity.java b/src/com/android/browser/CombinedBookmarkHistoryActivity.java
index 26fd1ee..7162c88 100644
--- a/src/com/android/browser/CombinedBookmarkHistoryActivity.java
+++ b/src/com/android/browser/CombinedBookmarkHistoryActivity.java
@@ -91,8 +91,12 @@
         bookmarksIntent.putExtras(extras);
         createTab(bookmarksIntent, R.string.tab_bookmarks, BOOKMARKS_TAB);
 
-        Intent visitedIntent = new Intent(this, MostVisitedActivity.class);
-        visitedIntent.putExtras(extras);
+        Intent visitedIntent = new Intent(this, BrowserBookmarksPage.class);
+        // Need to copy extras so the bookmarks activity and this one will be
+        // different
+        Bundle visitedExtras = new Bundle(extras);
+        visitedExtras.putBoolean("mostVisited", true);
+        visitedIntent.putExtras(visitedExtras);
         createTab(visitedIntent, R.string.tab_most_visited, VISITED_TAB);
 
         Intent historyIntent = new Intent(this, BrowserHistoryPage.class);
