diff --git a/src/com/android/browser/BrowserBookmarksAdapter.java b/src/com/android/browser/BrowserBookmarksAdapter.java
index 16bcda5..b3f8d98 100644
--- a/src/com/android/browser/BrowserBookmarksAdapter.java
+++ b/src/com/android/browser/BrowserBookmarksAdapter.java
@@ -124,6 +124,10 @@
         mCurrentView = view;
     }
 
+    public int getViewMode() {
+        return mCurrentView;
+    }
+
     @Override
     public Cursor getItem(int position) {
         return (Cursor) super.getItem(position);
diff --git a/src/com/android/browser/BrowserBookmarksPage.java b/src/com/android/browser/BrowserBookmarksPage.java
index f2f7de3..b6a50da 100644
--- a/src/com/android/browser/BrowserBookmarksPage.java
+++ b/src/com/android/browser/BrowserBookmarksPage.java
@@ -49,19 +49,17 @@
 import android.view.MenuItem;
 import android.view.View;
 import android.view.ViewGroup;
-import android.webkit.WebIconDatabase.IconListener;
 import android.widget.ExpandableListView;
 import android.widget.ExpandableListView.OnChildClickListener;
 import android.widget.ImageView;
 import android.widget.LinearLayout;
-import android.widget.ListView;
 import android.widget.PopupMenu.OnMenuItemClickListener;
 import android.widget.Toast;
 
 import com.android.browser.BookmarkDragHandler.BookmarkDragController;
 import com.android.browser.BookmarkDragHandler.BookmarkDragState;
-import com.android.browser.view.BookmarkExpandableGridView;
-import com.android.browser.view.BookmarkExpandableGridView.BookmarkContextMenuInfo;
+import com.android.browser.view.BookmarkExpandableView;
+import com.android.browser.view.BookmarkExpandableView.BookmarkContextMenuInfo;
 
 import java.util.HashMap;
 
@@ -76,8 +74,8 @@
  *  View showing the user's bookmarks in the browser.
  */
 public class BrowserBookmarksPage extends Fragment implements View.OnCreateContextMenuListener,
-        LoaderManager.LoaderCallbacks<Cursor>, IconListener,
-        BreadCrumbView.Controller, OnMenuItemClickListener, OnChildClickListener {
+        LoaderManager.LoaderCallbacks<Cursor>, BreadCrumbView.Controller,
+        OnMenuItemClickListener, OnChildClickListener {
 
     public static class ExtraDragState {
         public int childPosition;
@@ -94,14 +92,13 @@
     static final String ACCOUNT_TYPE = "account_type";
     static final String ACCOUNT_NAME = "account_name";
 
-    static final int VIEW_THUMBNAILS = 1;
-    static final int VIEW_LIST = 2;
+    public static final int VIEW_THUMBNAILS = 1;
+    public static final int VIEW_LIST = 2;
     static final String PREF_SELECTED_VIEW = "bookmarks_view";
 
     BookmarksPageCallbacks mCallbacks;
     View mRoot;
-    BookmarkExpandableGridView mGrid;
-    ListView mList;
+    BookmarkExpandableView mGrid;
     boolean mDisableNewWindow;
     boolean mEnableContextMenu = true;
     View mEmptyView;
@@ -167,7 +164,6 @@
 
     @Override
     public void onLoaderReset(Loader<Cursor> loader) {
-        // TODO: Figure out what to do here (if anything?)
     }
 
     @Override
@@ -326,8 +322,6 @@
         SharedPreferences prefs = PreferenceManager
             .getDefaultSharedPreferences(getActivity());
         mCurrentView = prefs.getInt(PREF_SELECTED_VIEW, getDefaultView());
-        // TODO: Support list view
-        mCurrentView = VIEW_THUMBNAILS;
 
         Bundle args = getArguments();
         mDisableNewWindow = args == null ? false : args.getBoolean(EXTRA_DISABLE_WINDOW, false);
@@ -341,12 +335,10 @@
         mRoot = inflater.inflate(R.layout.bookmarks, container, false);
         mEmptyView = mRoot.findViewById(android.R.id.empty);
 
-        mGrid = (BookmarkExpandableGridView) mRoot.findViewById(R.id.grid);
+        mGrid = (BookmarkExpandableView) mRoot.findViewById(R.id.grid);
         mGrid.setOnChildClickListener(this);
         mGrid.setColumnWidthFromLayout(R.layout.bookmark_thumbnail);
         mGrid.setBreadcrumbController(this);
-        mList = (ListView) mRoot.findViewById(R.id.list);
-        // TODO: mList.setOnItemClickListener(this);
         setEnableContextMenu(mEnableContextMenu);
         mDragHandler = new BookmarkDragHandler(getActivity(), mDragController,
                 mGrid.getDragAdapter());
@@ -355,9 +347,6 @@
         LoaderManager lm = getLoaderManager();
         lm.restartLoader(LOADER_ACCOUNTS, null, this);
 
-        // Add our own listener in case there are favicons that have yet to be loaded.
-        CombinedBookmarkHistoryView.getIconListenerSet().addListener(this);
-
         return mRoot;
     }
 
@@ -378,34 +367,14 @@
             lm.destroyLoader(id);
         }
         mBookmarkAdapters.clear();
-
-        CombinedBookmarkHistoryView.getIconListenerSet().removeListener(this);
-    }
-
-    @Override
-    public void onReceivedIcon(String url, Bitmap icon) {
-        // A new favicon has been loaded, so let anything attached to the adapter know about it
-        // so new icons will be loaded.
-        // TODO: Notify all of data set changed
-        // TODO: Wait, is this even needed? Won't this trigger a DB change anyway?
     }
 
     private BrowserBookmarksAdapter getChildAdapter(int groupPosition) {
-        if (mCurrentView == VIEW_THUMBNAILS) {
-            return mGrid.getChildAdapter(groupPosition);
-        } else {
-            // TODO: Support expandable list
-            return null;
-        }
+        return mGrid.getChildAdapter(groupPosition);
     }
 
     private BreadCrumbView getBreadCrumbs(int groupPosition) {
-        if (mCurrentView == VIEW_THUMBNAILS) {
-            return mGrid.getBreadCrumbs(groupPosition);
-        } else {
-            // TODO: Support expandable list
-            return null;
-        }
+        return mGrid.getBreadCrumbs(groupPosition);
     }
 
     @Override
@@ -566,11 +535,10 @@
     }
 
     void selectView(int view) {
-        // TODO: Support list view
-        view = mCurrentView;
         if (view == mCurrentView) {
             return;
         }
+        mCurrentView = view;
         SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(getActivity());
         Editor edit = prefs.edit();
         edit.putInt(PREF_SELECTED_VIEW, mCurrentView);
@@ -578,31 +546,7 @@
         if (mEmptyView.getVisibility() == View.VISIBLE) {
             return;
         }
-        setupBookmarkView();
-    }
-
-    private void setupBookmarkView() {
-        // TODO: Support list view
-//        mAdapter.selectView(mCurrentView);
-//        switch (mCurrentView) {
-//        case VIEW_THUMBNAILS:
-//            mList.setAdapter(null);
-//            SharedPreferences prefs = PreferenceManager
-//                    .getDefaultSharedPreferences(getActivity());
-//            String accountName = prefs.getString(PREF_ACCOUNT_NAME, null);
-//            mGrid.addAccount(accountName, mAdapter);
-//            mGrid.setVisibility(View.VISIBLE);
-//            mList.setVisibility(View.GONE);
-//            break;
-//        case VIEW_LIST:
-//            mGrid.clearAccounts();
-//            if (mList.getAdapter() != mAdapter) {
-//                mList.setAdapter(mAdapter);
-//            }
-//            mGrid.setVisibility(View.GONE);
-//            mList.setVisibility(View.VISIBLE);
-//            break;
-//        }
+        mGrid.selectView(mCurrentView);
     }
 
     /**
@@ -662,14 +606,6 @@
                 mGrid.setLongClickable(false);
             }
         }
-        if (mList != null) {
-            if (mEnableContextMenu) {
-                registerForContextMenu(mList);
-            } else {
-                unregisterForContextMenu(mList);
-                mList.setLongClickable(false);
-            }
-        }
     }
 
     private BookmarkDragController mDragController = new BookmarkDragController() {
@@ -702,11 +638,7 @@
         @Override
         public void actionItemClicked(View v, BookmarkDragState state) {
             if (v.getId() == R.id.info) {
-                if (mCurrentView == VIEW_THUMBNAILS) {
-                    mGrid.showContextMenuForState(state);
-                } else {
-                    // TODO: Support expandable list
-                }
+                mGrid.showContextMenuForState(state);
             } else {
                 ExtraDragState extraState = (ExtraDragState) state.extraState;
                 handleContextItem(v.getId(), extraState.groupPosition,
diff --git a/src/com/android/browser/view/BookmarkExpandableGridView.java b/src/com/android/browser/view/BookmarkExpandableView.java
similarity index 89%
rename from src/com/android/browser/view/BookmarkExpandableGridView.java
rename to src/com/android/browser/view/BookmarkExpandableView.java
index c8811d1..6f5fdaa 100644
--- a/src/com/android/browser/view/BookmarkExpandableGridView.java
+++ b/src/com/android/browser/view/BookmarkExpandableView.java
@@ -38,6 +38,7 @@
 import com.android.browser.BookmarkDragHandler.BookmarkDragState;
 import com.android.browser.BreadCrumbView;
 import com.android.browser.BrowserBookmarksAdapter;
+import com.android.browser.BrowserBookmarksPage;
 import com.android.browser.BrowserBookmarksPage.ExtraDragState;
 import com.android.browser.R;
 import com.android.internal.view.menu.MenuBuilder;
@@ -45,7 +46,7 @@
 import java.util.ArrayList;
 import java.util.HashMap;
 
-public class BookmarkExpandableGridView extends ExpandableListView
+public class BookmarkExpandableView extends ExpandableListView
         implements BreadCrumbView.Controller {
 
     private BookmarkAccountAdapter mAdapter;
@@ -58,18 +59,19 @@
     private BreadCrumbView.Controller mBreadcrumbController;
     private BookmarkDragHandler mDragHandler;
     private int mMaxColumnCount;
+    private int mCurrentView = -1;
 
-    public BookmarkExpandableGridView(Context context) {
+    public BookmarkExpandableView(Context context) {
         super(context);
         init(context);
     }
 
-    public BookmarkExpandableGridView(Context context, AttributeSet attrs) {
+    public BookmarkExpandableView(Context context, AttributeSet attrs) {
         super(context, attrs);
         init(context);
     }
 
-    public BookmarkExpandableGridView(
+    public BookmarkExpandableView(
             Context context, AttributeSet attrs, int defStyle) {
         super(context, attrs, defStyle);
         init(context);
@@ -131,6 +133,9 @@
                 adapter.registerDataSetObserver(mAdapter.mObserver);
             }
         } else {
+            if (mCurrentView >= 0) {
+                adapter.selectView(mCurrentView);
+            }
             mAdapter.mGroups.add(accountName);
             mAdapter.mChildren.add(adapter);
             adapter.registerDataSetObserver(mAdapter.mObserver);
@@ -224,7 +229,7 @@
                 extraState.childPosition,
                 extraState.groupPosition);
         if (getParent() != null) {
-            getParent().showContextMenuForChild(BookmarkExpandableGridView.this);
+            getParent().showContextMenuForChild(BookmarkExpandableView.this);
         }
     }
 
@@ -252,7 +257,7 @@
             int childPosition = (Integer) v.getTag(R.id.child_position);
             long id = (Long) v.getTag(R.id.child_id);
             if (mOnChildClickListener != null) {
-                mOnChildClickListener.onChildClick(BookmarkExpandableGridView.this,
+                mOnChildClickListener.onChildClick(BookmarkExpandableView.this,
                         v, groupPosition, childPosition, id);
             }
         }
@@ -289,6 +294,14 @@
         return mAdapter.getBreadCrumbView(groupPosition);
     }
 
+    public void selectView(int view) {
+        mCurrentView = view;
+        for (BrowserBookmarksAdapter adapter : mAdapter.mChildren) {
+            adapter.selectView(mCurrentView);
+        }
+        mAdapter.notifyDataSetChanged();
+    }
+
     class BookmarkAccountAdapter extends BaseExpandableListAdapter {
         ArrayList<BrowserBookmarksAdapter> mChildren;
         ArrayList<String> mGroups;
@@ -339,17 +352,21 @@
             if (convertView == null) {
                 convertView = mInflater.inflate(R.layout.bookmark_grid_row, parent, false);
             }
-            LinearLayout row = (LinearLayout) convertView;
-            if (row.getChildCount() > mRowCount) {
-                row.removeViews(mRowCount, row.getChildCount() - mRowCount);
+            BrowserBookmarksAdapter childAdapter = mChildren.get(groupPosition);
+            int rowCount = mRowCount;
+            if (childAdapter.getViewMode() == BrowserBookmarksPage.VIEW_LIST) {
+                rowCount = 1;
             }
-            for (int i = 0; i < mRowCount; i++) {
+            LinearLayout row = (LinearLayout) convertView;
+            if (row.getChildCount() > rowCount) {
+                row.removeViews(rowCount, row.getChildCount() - rowCount);
+            }
+            for (int i = 0; i < rowCount; i++) {
                 View cv = null;
                 if (row.getChildCount() > i) {
                     cv = row.getChildAt(i);
                 }
-                int realChildPosition = (childPosition * mRowCount) + i;
-                BrowserBookmarksAdapter childAdapter = mChildren.get(groupPosition);
+                int realChildPosition = (childPosition * rowCount) + i;
                 if (realChildPosition < childAdapter.getCount()) {
                     View v = childAdapter.getView(realChildPosition, cv, row);
                     v.setTag(R.id.group_position, groupPosition);
@@ -378,8 +395,11 @@
 
         @Override
         public int getChildrenCount(int groupPosition) {
-            return (int) Math.ceil(
-                    mChildren.get(groupPosition).getCount() / (float)mRowCount);
+            BrowserBookmarksAdapter adapter = mChildren.get(groupPosition);
+            if (adapter.getViewMode() == BrowserBookmarksPage.VIEW_LIST) {
+                return adapter.getCount();
+            }
+            return (int) Math.ceil(adapter.getCount() / (float)mRowCount);
         }
 
         @Override
@@ -443,7 +463,7 @@
             if (crumbs == null) {
                 crumbs = (BreadCrumbView)
                         mInflater.inflate(R.layout.bookmarks_header, null);
-                crumbs.setController(BookmarkExpandableGridView.this);
+                crumbs.setController(BookmarkExpandableView.this);
                 crumbs.setUseBackButton(true);
                 crumbs.setMaxVisible(2);
                 String bookmarks = mContext.getString(R.string.bookmarks);
@@ -464,6 +484,20 @@
         public boolean isChildSelectable(int groupPosition, int childPosition) {
             return true;
         }
+
+        @Override
+        public int getChildTypeCount() {
+            return 2;
+        }
+
+        @Override
+        public int getChildType(int groupPosition, int childPosition) {
+            BrowserBookmarksAdapter adapter = mChildren.get(groupPosition);
+            if (adapter.getViewMode() == BrowserBookmarksPage.VIEW_LIST) {
+                return 1;
+            }
+            return 0;
+        }
     }
 
     public static class BookmarkContextMenuInfo implements ContextMenuInfo {
