diff --git a/src/com/android/browser/AddBookmarkFolder.java b/src/com/android/browser/AddBookmarkFolder.java
index b468da2..faff027 100644
--- a/src/com/android/browser/AddBookmarkFolder.java
+++ b/src/com/android/browser/AddBookmarkFolder.java
@@ -638,7 +638,7 @@
         mAddSeparator.setVisibility(View.GONE);
 
         mCrumbs = (BreadCrumbView) findViewById(R.id.crumbs);
-        mCrumbs.setUseBackButton(true);
+        //mCrumbs.setUseBackButton(true);
         mCrumbs.setController(this);
         mHeaderIcon = getResources().getDrawable(R.drawable.ic_deco_folder_normal);
         mCrumbHolder = findViewById(R.id.crumb_holder);
diff --git a/src/com/android/browser/AddBookmarkPage.java b/src/com/android/browser/AddBookmarkPage.java
index a50a7d6..ef462bc 100644
--- a/src/com/android/browser/AddBookmarkPage.java
+++ b/src/com/android/browser/AddBookmarkPage.java
@@ -103,6 +103,7 @@
     private EditText    mAddress;
     private TextView    mButton;
     private View        mCancelButton;
+    private View        mDeleteButton;
     private boolean     mEditingExisting;
     private boolean     mEditingFolder;
     private Bundle      mMap;
@@ -314,6 +315,8 @@
             } else {
                 finish();
             }
+        } else if (v == mDeleteButton || v == mRemoveLink) {
+            onDeleteWithConfirm();
         } else if (v == mFolderCancel) {
             completeOrCancelFolderNaming(true);
         } else if (v == mAddNewFolder) {
@@ -330,16 +333,6 @@
             Class[] type = new Class[] {View.class};
             ReflectHelper.invokeMethod(imm, "focusIn", type, params);
             imm.showSoftInput(mFolderNamer, InputMethodManager.SHOW_IMPLICIT);
-        } else if (v == mRemoveLink) {
-            if (!mEditingExisting) {
-                throw new AssertionError("Remove button should not be shown for"
-                        + " new bookmarks");
-            }
-            long id = mMap.getLong(BrowserContract.Bookmarks._ID);
-            createHandler();
-            Message msg = Message.obtain(mHandler, BOOKMARK_DELETED);
-            BookmarkUtils.displayRemoveBookmarkDialog(id,
-                    mTitle.getText().toString(), this, msg);
         }
     }
 
@@ -546,6 +539,14 @@
                 while (cursor.moveToNext()) {
                     mAccountAdapter.add(new BookmarkAccount(this, cursor));
                 }
+
+                if (cursor.getCount() < 2) {
+                    View accountView = findViewById(R.id.row_account);
+                    if (accountView != null) {
+                        accountView.setVisibility(View.GONE);
+                    }
+                }
+
                 getLoaderManager().destroyLoader(LOADER_ID_ACCOUNTS);
                 getLoaderManager().restartLoader(LOADER_ID_EDIT_INFO, null,
                         mEditInfoLoaderCallbacks);
@@ -660,6 +661,10 @@
         mTouchIconUrl = null;
 
         mFakeTitle = (TextView) findViewById(R.id.fake_title);
+
+        mDeleteButton = findViewById(R.id.delete);
+        mDeleteButton.setOnClickListener(this);
+
         if (mMap != null) {
             Bundle b = mMap.getBundle(EXTRA_EDIT_BOOKMARK);
             if (b != null) {
@@ -691,6 +696,7 @@
                     title = title.substring(0, MAX_TITLE_LENGTH);
                 }
             }
+
         }
 
         mTitle = (EditText) findViewById(R.id.title);
@@ -731,7 +737,7 @@
         mAddSeparator = findViewById(R.id.add_divider);
 
         mCrumbs = (BreadCrumbView) findViewById(R.id.crumbs);
-        mCrumbs.setUseBackButton(true);
+        //mCrumbs.setUseBackButton(true);
         mCrumbs.setController(this);
         mHeaderIcon = getResources().getDrawable(R.drawable.ic_deco_folder_normal);
         mCrumbHolder = findViewById(R.id.crumb_holder);
@@ -769,6 +775,7 @@
     }
 
     private void showRemoveButton() {
+        mDeleteButton.setVisibility(View.VISIBLE);
         findViewById(R.id.remove_divider).setVisibility(View.VISIBLE);
         mRemoveLink = findViewById(R.id.remove);
         mRemoveLink.setVisibility(View.VISIBLE);
@@ -909,6 +916,52 @@
         context.getContentResolver().delete(uri, null, null);
     }
 
+    private void onDeleteWithConfirm() {
+        final String title = mTitle.getText().toString().trim();
+        final String unfilteredUrl = UrlUtils.fixUrl(mAddress.getText().toString());
+        final String url = unfilteredUrl.trim();
+        new AlertDialog.Builder(this)
+                .setIconAttribute(android.R.attr.alertDialogIcon)
+                .setMessage(getString(R.string.delete_bookmark_warning, title))
+                .setNegativeButton(android.R.string.cancel, null)
+                .setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener() {
+                    public void onClick(DialogInterface dialog, int which) {
+                        ContentResolver cr = getContentResolver();
+                        Cursor cursor = cr.query(BrowserContract.Bookmarks.CONTENT_URI,
+                                BookmarksLoader.PROJECTION,
+                                "title = ? OR url = ?",
+                                new String[] {
+                                        title, url
+                                },
+                                null);
+
+                        if (cursor == null) {
+                            finish();
+                            return;
+                        }
+
+                        try {
+                            if (cursor.moveToFirst()) {
+                                do {
+                                    long index = cursor.getLong(
+                                            cursor.getColumnIndex(BrowserContract.Bookmarks._ID));
+                                    cr.delete(ContentUris.withAppendedId(
+                                            BrowserContract.Bookmarks.CONTENT_URI, index),
+                                            null, null);
+                                } while (cursor.moveToNext());
+                            }
+                        } catch (IllegalStateException e) {
+                            e.printStackTrace();
+                        } finally {
+                            if (cursor != null)
+                                cursor.close();
+                        }
+                        finish();
+                    }
+                })
+                .show();
+    }
+
     private void onSaveWithConfirm() {
         String title = mTitle.getText().toString().trim();
         String unfilteredUrl = UrlUtils.fixUrl(mAddress.getText().toString());
diff --git a/src/com/android/browser/BookmarkUtils.java b/src/com/android/browser/BookmarkUtils.java
index 0bce3c2..335a352 100644
--- a/src/com/android/browser/BookmarkUtils.java
+++ b/src/com/android/browser/BookmarkUtils.java
@@ -235,12 +235,13 @@
      * @param msg Message to send if the bookmark is deleted.
      */
     static void displayRemoveBookmarkDialog( final long id, final String title,
-            final Context context, final Message msg) {
+            final Context context, final Message msg, boolean is_folder) {
 
         new AlertDialog.Builder(context)
                 .setIconAttribute(android.R.attr.alertDialogIcon)
-                .setMessage(context.getString(R.string.delete_bookmark_warning,
-                        title))
+                .setMessage(is_folder ?
+                        context.getString(R.string.delete_folder_warning, title) :
+                        context.getString(R.string.delete_bookmark_warning, title))
                 .setPositiveButton(R.string.ok,
                         new DialogInterface.OnClickListener() {
                             @Override
@@ -248,7 +249,7 @@
                                 if (msg != null) {
                                     msg.sendToTarget();
                                 }
-                                Runnable runnable = new Runnable(){
+                                Runnable runnable = new Runnable() {
                                     @Override
                                     public void run() {
                                         removeBookmarkOrFolder(context, id);
diff --git a/src/com/android/browser/BreadCrumbView.java b/src/com/android/browser/BreadCrumbView.java
index 0cd8226..1501d21 100644
--- a/src/com/android/browser/BreadCrumbView.java
+++ b/src/com/android/browser/BreadCrumbView.java
@@ -60,6 +60,7 @@
     private int mMaxVisible = -1;
     private Context mContext;
     private int mCrumbPadding;
+    private TextView mOverflowView;
 
     /**
      * @param context
@@ -164,6 +165,16 @@
         return crumb.crumbView;
     }
 
+    public void addOverflowLabel(TextView view) {
+        mOverflowView = view;
+        if (view != null) {
+            view.setTextAppearance(mContext, R.style.BookmarkPathText);
+            view.setPadding(mCrumbPadding, 0, mCrumbPadding, 0);
+            view.setGravity(Gravity.CENTER_VERTICAL);
+            view.setText("... >");
+        }
+    }
+
     public void pushView(View view, Object data) {
         Crumb crumb = new Crumb(view, true, data);
         pushCrumb(crumb);
@@ -211,7 +222,7 @@
         params.setMargins(0, 0, 4 * mCrumbPadding, 0);
         mCrumbLayout.setLayoutParams(params);
         mCrumbLayout.setVisibility(View.VISIBLE);
-        addParentLabel();
+        //addParentLabel();
         addView(mCrumbLayout);
     }
 
@@ -275,11 +286,15 @@
 
     private void updateVisible() {
         // start at index 1 (0 == parent label)
-        int childIndex = 1;
+        int childIndex = 0;
         if (mMaxVisible >= 0) {
             int invisibleCrumbs = size() - mMaxVisible;
             if (invisibleCrumbs > 0) {
                 int crumbIndex = 0;
+                if (mOverflowView != null) {
+                    mOverflowView.setVisibility(VISIBLE);
+                    mOverflowView.setOnClickListener(this);
+                }
                 while (crumbIndex < invisibleCrumbs) {
                     // Set the crumb to GONE.
                     mCrumbLayout.getChildAt(childIndex).setVisibility(View.GONE);
@@ -287,6 +302,10 @@
                     // Move to the next crumb.
                     crumbIndex++;
                 }
+            } else {
+                if (mOverflowView != null) {
+                    mOverflowView.setVisibility(GONE);
+                }
             }
             // Make sure the last is visible.
             int childCount = mCrumbLayout.getChildCount();
@@ -333,6 +352,13 @@
         if (mBackButton == v) {
             popView();
             notifyController();
+        } else if (mOverflowView == v) {
+            int maxVisible = getMaxVisible();
+            while (maxVisible > 0) {
+                pop(false);
+                maxVisible--;
+            }
+            notifyController();
         } else {
             // pop until view matches crumb view
             while (v != getTopCrumb().crumbView) {
@@ -397,10 +423,10 @@
 
         private TextView makeCrumbView(String name) {
             TextView tv = new TextView(mContext);
-            tv.setTextAppearance(mContext, R.style.BookmarkText);
+            tv.setTextAppearance(mContext, R.style.BookmarkPathText);
             tv.setPadding(mCrumbPadding, 0, mCrumbPadding, 0);
             tv.setGravity(Gravity.CENTER_VERTICAL);
-            tv.setText(name);
+            tv.setText(name + " >");
             tv.setLayoutParams(new LayoutParams(LayoutParams.WRAP_CONTENT,
                     LayoutParams.MATCH_PARENT));
             tv.setSingleLine();
diff --git a/src/com/android/browser/BrowserBookmarksPage.java b/src/com/android/browser/BrowserBookmarksPage.java
index 59d4a68..935bdc6 100644
--- a/src/com/android/browser/BrowserBookmarksPage.java
+++ b/src/com/android/browser/BrowserBookmarksPage.java
@@ -723,7 +723,8 @@
         long id = cursor.getLong(BookmarksLoader.COLUMN_INDEX_ID);
         String title = cursor.getString(BookmarksLoader.COLUMN_INDEX_TITLE);
         Context context = getActivity();
-        BookmarkUtils.displayRemoveBookmarkDialog(id, title, context, null);
+        BookmarkUtils.displayRemoveBookmarkDialog(id, title, context, null,
+                (cursor.getInt(BookmarksLoader.COLUMN_INDEX_IS_FOLDER) == 1));
     }
 
     private String getUrl(BrowserBookmarksAdapter adapter, int position) {
diff --git a/src/com/android/browser/Controller.java b/src/com/android/browser/Controller.java
index 5c6a9b8..6337237 100644
--- a/src/com/android/browser/Controller.java
+++ b/src/com/android/browser/Controller.java
@@ -261,6 +261,8 @@
     private PowerConnectionReceiver mLowPowerReceiver;
     private PowerConnectionReceiver mPowerChangeReceiver;
 
+    private boolean mCurrentPageBookmarked;
+
     public Controller(Activity browser) {
         mActivity = browser;
         mSettings = BrowserSettings.getInstance();
@@ -1947,7 +1949,8 @@
 
         String title = w.getTitle();
         String url = w.getUrl();
-        if (title != null && url != null && lookupBookmark(title, url) > 0) {
+        mCurrentPageBookmarked = (lookupBookmark(title, url) > 0);
+        if (title != null && url != null && mCurrentPageBookmarked) {
             bookmark_icon.setChecked(true);
         } else {
             bookmark_icon.setChecked(false);
@@ -2348,7 +2351,7 @@
             WebView w = getCurrentTopWebView();
             if (w == null)
                 return;
-            final Intent i = createBookmarkCurrentPageIntent(false);
+            final Intent i = createBookmarkCurrentPageIntent(mCurrentPageBookmarked);
             mActivity.startActivity(i);
         }
     }
diff --git a/src/com/android/browser/view/BookmarkExpandableView.java b/src/com/android/browser/view/BookmarkExpandableView.java
index 5e68565..3ed000c 100644
--- a/src/com/android/browser/view/BookmarkExpandableView.java
+++ b/src/com/android/browser/view/BookmarkExpandableView.java
@@ -82,6 +82,9 @@
                 .getInteger(R.integer.max_bookmark_columns);
         setScrollBarStyle(SCROLLBARS_OUTSIDE_OVERLAY);
         mAdapter = new BookmarkAccountAdapter(mContext);
+        if (mAdapter.getGroupCount() < 2) {
+            setGroupIndicator(null);
+        }
         super.setAdapter(mAdapter);
     }
 
@@ -251,6 +254,10 @@
 
         @Override
         public void onClick(View v) {
+            if (mAdapter.getGroupCount() < 2) {
+                return;
+            }
+
             int groupPosition = (Integer) v.getTag(R.id.group_position);
             if (isGroupExpanded(groupPosition)) {
                 collapseGroup(groupPosition);
@@ -402,6 +409,7 @@
                 View view, ViewGroup parent) {
             if (view == null) {
                 view = mInflater.inflate(R.layout.bookmark_group_view, parent, false);
+                view.setEnabled(false);
                 view.setOnClickListener(mGroupOnClickListener);
             }
             view.setTag(R.id.group_position, groupPosition);
@@ -411,13 +419,19 @@
             if (crumbs.getParent() != null) {
                 ((ViewGroup)crumbs.getParent()).removeView(crumbs);
             }
+            crumbs.setVisibility(VISIBLE);
             crumbHolder.addView(crumbs);
+
+            TextView overflowView = (TextView) view.findViewById(R.id.crumb_overflow);
+            crumbs.addOverflowLabel(overflowView);
+/*
             TextView name = (TextView) view.findViewById(R.id.group_name);
             String groupName = mGroups.get(groupPosition);
             if (groupName == null) {
-                groupName = mContext.getString(R.string.local_bookmarks);
+                groupName = mContext.getString(R.string.bookmarks);
             }
             name.setText(groupName);
+*/
             return view;
         }
 
@@ -427,8 +441,8 @@
                 crumbs = (BreadCrumbView)
                         mInflater.inflate(R.layout.bookmarks_header, null);
                 crumbs.setController(BookmarkExpandableView.this);
-                crumbs.setUseBackButton(true);
-                crumbs.setMaxVisible(1);
+                //crumbs.setUseBackButton(true);
+                crumbs.setMaxVisible(2);
                 String bookmarks = mContext.getString(R.string.bookmarks);
                 crumbs.pushView(bookmarks, false,
                         BrowserContract.Bookmarks.CONTENT_URI_DEFAULT_FOLDER);
