diff --git a/src/com/android/browser/BrowserActivity.java b/src/com/android/browser/BrowserActivity.java
index 7db2a8d..b62862b 100644
--- a/src/com/android/browser/BrowserActivity.java
+++ b/src/com/android/browser/BrowserActivity.java
@@ -1281,28 +1281,10 @@
 
     @Override
     public ActionMode onStartActionMode(ActionMode.Callback callback) {
-        ActionMode mode = super.onStartActionMode(callback);
-        if (callback instanceof FindActionModeCallback
-                || callback instanceof SelectActionModeCallback) {
-            // For find and select, hide extra title bars.  They will
-            // be replaced in onEndActionMode.
-            Tab tab = mTabControl.getCurrentTab();
-            if (tab.getSubWebView() == null) {
-                // If the find or select is being performed on the main webview,
-                // remove the embedded title bar.
-                WebView mainView = tab.getWebView();
-                if (mainView != null) {
-                    mainView.setEmbeddedTitleBar(null);
-                }
-            }
-            hideFakeTitleBar();
-            mActionMode = mode;
-        } else {
-            // Do not store other ActionModes, since we are unable to determine
-            // when they finish.
-            mActionMode = null;
-        }
-        return mode;
+        mActionMode = super.onStartActionMode(callback);
+        hideFakeTitleBar();
+        // Would like to change the MENU, but onEndActionMode may not be called
+        return mActionMode;
     }
 
     @Override
@@ -1403,7 +1385,7 @@
                 break;
 
             case R.id.find_menu_id:
-                showFindDialog(null);
+                getTopWindow().showFindDialog(null);
                 break;
 
             case R.id.save_webarchive_menu_id:
@@ -1519,11 +1501,13 @@
     }
 
     /*
-     * End the current ActionMode.  Only works for find and select.
+     * End the current ActionMode.
      */
     void endActionMode() {
         if (mActionMode != null) {
-            mActionMode.finish();
+            ActionMode mode = mActionMode;
+            onEndActionMode();
+            mode.finish();
         }
     }
 
@@ -1533,59 +1517,21 @@
      */
     public void onEndActionMode() {
         if (!isInCustomActionMode()) return;
-        // If the Find was being performed in the main WebView, replace the
-        // embedded title bar.
-        Tab currentTab = mTabControl.getCurrentTab();
-        if (currentTab.getSubWebView() == null) {
-            WebView mainView = currentTab.getWebView();
-            if (mainView != null) {
-                mainView.setEmbeddedTitleBar(mTitleBar);
-            }
-        }
         if (mInLoad) {
             // The title bar was hidden, because otherwise it would cover up the
             // find or select dialog. Now that the dialog has been removed,
             // show the fake title bar once again.
             showFakeTitleBar();
         }
+        // Would like to return the menu state to normal, but this does not
+        // necessarily get called.
         mActionMode = null;
     }
 
-    private FindActionModeCallback mFindCallback;
-    private SelectActionModeCallback mSelectCallback;
-
     // For select and find, we keep track of the ActionMode so that
     // finish() can be called as desired.
     private ActionMode mActionMode;
 
-    /*
-     * Open the find ActionMode.
-     * @param text If non null, will be placed in find to be searched for.
-     */
-    public void showFindDialog(String text) {
-        if (null == mFindCallback) {
-            mFindCallback = new FindActionModeCallback(this);
-        }
-        WebView webView = getTopWindow();
-        webView.setFindIsUp(true);
-        mFindCallback.setWebView(webView);
-        startActionMode(mFindCallback);
-        if (text != null) mFindCallback.setText(text);
-    }
-
-    /*
-     * Show the select ActionMode.
-     */
-    public void showSelectDialog() {
-        if (null == mSelectCallback) {
-            mSelectCallback = new SelectActionModeCallback(this);
-        }
-        WebView webView = getTopWindow();
-        webView.setUpSelect();
-        mSelectCallback.setWebView(webView);
-        startActionMode(mSelectCallback);
-    }
-
     @Override
     public boolean onPrepareOptionsMenu(Menu menu) {
         // This happens when the user begins to hold down the menu key, so
diff --git a/src/com/android/browser/FindActionModeCallback.java b/src/com/android/browser/FindActionModeCallback.java
deleted file mode 100644
index 0b0fdae..0000000
--- a/src/com/android/browser/FindActionModeCallback.java
+++ /dev/null
@@ -1,219 +0,0 @@
-/*
- * Copyright (C) 2010 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.browser;
-
-import android.content.Context;
-import android.content.res.Resources;
-import android.text.Editable;
-import android.text.Selection;
-import android.text.Spannable;
-import android.text.TextWatcher;
-import android.webkit.WebView;
-import android.widget.EditText;
-import android.widget.TextView;
-import android.view.ActionMode;
-import android.view.LayoutInflater;
-import android.view.Menu;
-import android.view.MenuInflater;
-import android.view.MenuItem;
-import android.view.View;
-import android.view.inputmethod.InputMethodManager;
-
-class FindActionModeCallback implements ActionMode.Callback, TextWatcher,
-        View.OnLongClickListener {
-    private View mCustomView;
-    private EditText mEditText;
-    private TextView mMatches;
-    private WebView mWebView;
-    private InputMethodManager mInput;
-    private Resources mResources;
-    private boolean mMatchesFound;
-    private int mNumberOfMatches;
-    private BrowserActivity mBrowserActivity;
-
-    FindActionModeCallback(BrowserActivity context) {
-        mCustomView = LayoutInflater.from(context).inflate(
-                R.layout.browser_find, null);
-        mEditText = (EditText) mCustomView.findViewById(R.id.edit);
-        // Override long click so that select ActionMode is not opened, which
-        // would exit find ActionMode.
-        mEditText.setOnLongClickListener(this);
-        Spannable span = (Spannable) mEditText.getText();
-        int length = span.length();
-        span.setSpan(this, 0, length, Spannable.SPAN_INCLUSIVE_INCLUSIVE);
-        mMatches = (TextView) mCustomView.findViewById(R.id.matches);
-        mInput = (InputMethodManager)
-                context.getSystemService(Context.INPUT_METHOD_SERVICE);
-        mResources = context.getResources();
-        mBrowserActivity = context;
-    }
-
-    /*
-     * Place text in the text field so it can be searched for.  Need to press
-     * the find next or find previous button to find all of the matches.
-     */
-    void setText(String text) {
-        mEditText.setText(text);
-        Spannable span = (Spannable) mEditText.getText();
-        int length = span.length();
-        // Ideally, we would like to set the selection to the whole field,
-        // but this brings up the Text selection CAB, which dismisses this
-        // one.
-        Selection.setSelection(span, length, length);
-        // Necessary each time we set the text, so that this will watch
-        // changes to it.
-        span.setSpan(this, 0, length, Spannable.SPAN_INCLUSIVE_INCLUSIVE);
-        mMatchesFound = false;
-    }
-
-    /*
-     * Set the WebView to search.  Must be non null, and set before calling
-     * startActionMode.
-     */
-    void setWebView(WebView webView) {
-        if (null == webView) {
-            throw new AssertionError("WebView supplied to "
-                    + "FindActionModeCallback cannot be null");
-        }
-        mWebView = webView;
-    }
-
-    /*
-     * Move the highlight to the next match.
-     * @param next If true, find the next match further down in the document.
-     *             If false, find the previous match, up in the document.
-     */
-    private void findNext(boolean next) {
-        if (mWebView == null) {
-            throw new AssertionError(
-                    "No WebView for FindActionModeCallback::findNext");
-        }
-        mWebView.findNext(next);
-    }
-
-    /*
-     * Highlight all the instances of the string from mEditText in mWebView.
-     */
-    private void findAll() {
-        if (mWebView == null) {
-            throw new AssertionError(
-                    "No WebView for FindActionModeCallback::findAll");
-        }
-        CharSequence find = mEditText.getText();
-        if (0 == find.length()) {
-            mWebView.clearMatches();
-            mMatches.setVisibility(View.INVISIBLE);
-            mMatchesFound = false;
-        } else {
-            mMatchesFound = true;
-            mMatches.setVisibility(View.VISIBLE);
-            mNumberOfMatches = mWebView.findAll(find.toString());
-            if (0 == mNumberOfMatches) {
-                mMatches.setText(mResources.getString(R.string.no_matches));
-            } else {
-                updateMatchesString();
-            }
-        }
-    }
-
-    /*
-     * Update the string which tells the user how many matches were found, and
-     * which match is currently highlighted.
-     */
-    private void updateMatchesString() {
-        String template = mResources.getQuantityString(R.plurals.matches_found,
-                mNumberOfMatches, mWebView.findIndex() + 1, mNumberOfMatches);
-
-        mMatches.setText(template);
-    }
-
-    // OnLongClickListener implementation
-
-    @Override
-    public boolean onLongClick(View v) { return true; }
-
-    // ActionMode.Callback implementation
-
-    @Override
-    public boolean onCreateActionMode(ActionMode mode, Menu menu) {
-        mode.setCustomView(mCustomView);
-        mode.getMenuInflater().inflate(R.menu.find, menu);
-        // Ideally, we would like to preserve the old find text, but it
-        // brings up the Text selection CAB, and therefore dismisses
-        // find
-        setText("");
-        mMatches.setVisibility(View.INVISIBLE);
-        mMatchesFound = false;
-        mMatches.setText("0");
-        mEditText.requestFocus();
-        mInput.showSoftInput(mEditText, 0);
-        return true;
-    }
-
-    @Override
-    public void onDestroyActionMode(ActionMode mode) {
-        mBrowserActivity.onEndActionMode();
-        mWebView.notifyFindDialogDismissed();
-        mInput.hideSoftInputFromWindow(mWebView.getWindowToken(), 0);
-    }
-
-    @Override
-    public boolean onPrepareActionMode(ActionMode mode, Menu menu) {
-        return false;
-    }
-
-    @Override
-    public boolean onActionItemClicked(ActionMode mode, MenuItem item) {
-        if (!mMatchesFound) {
-            findAll();
-            return true;
-        }
-        switch(item.getItemId()) {
-            case R.id.find_prev:
-                findNext(false);
-                break;
-            case R.id.find_next:
-                findNext(true);
-                break;
-            default:
-                return false;
-        }
-        updateMatchesString();
-        return true;
-    }
-
-    // TextWatcher methods
-
-    @Override
-    public void beforeTextChanged(CharSequence s,
-                                  int start,
-                                  int count,
-                                  int after) {
-    }
-
-    @Override
-    public void onTextChanged(CharSequence s,
-                              int start,
-                              int before,
-                              int count) {
-        findAll();
-    }
-
-    @Override
-    public void afterTextChanged(Editable s) { }
-
-}
diff --git a/src/com/android/browser/SelectActionModeCallback.java b/src/com/android/browser/SelectActionModeCallback.java
deleted file mode 100644
index 4c2554f..0000000
--- a/src/com/android/browser/SelectActionModeCallback.java
+++ /dev/null
@@ -1,89 +0,0 @@
-/*
- * Copyright (C) 2010 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.browser;
-
-import android.provider.Browser;
-import android.webkit.WebView;
-import android.view.ActionMode;
-import android.view.Menu;
-import android.view.MenuItem;
-
-class SelectActionModeCallback implements ActionMode.Callback {
-    private WebView mWebView;
-    private BrowserActivity mBrowserActivity;
-
-    SelectActionModeCallback(BrowserActivity context) {
-        mBrowserActivity = context;
-    }
-
-    /*
-     * Set the WebView to be copied from.
-     */
-    void setWebView(WebView webView) {
-        mWebView = webView;
-    }
-
-    // ActionMode.Callback implementation
-
-    @Override
-    public boolean onCreateActionMode(ActionMode mode, Menu menu) {
-        mode.getMenuInflater().inflate(R.menu.copy, menu);
-        mode.setTitle(R.string.text_selection_title);
-        return true;
-    }
-
-    @Override
-    public boolean onPrepareActionMode(ActionMode mode, Menu menu) {
-        return true;
-    }
-
-    @Override
-    public boolean onActionItemClicked(ActionMode mode, MenuItem item) {
-        switch(item.getItemId()) {
-            case R.id.copy:
-                mWebView.copySelection();
-                mode.finish();
-                break;
-
-            case R.id.share:
-                String selection = mWebView.getSelection();
-                Browser.sendString(mBrowserActivity, selection);
-                mode.finish();
-                break;
-
-            case R.id.select_all:
-                mWebView.selectAll();
-                break;
-
-            case R.id.find:
-                String sel= mWebView.getSelection();
-                mode.finish();
-                mBrowserActivity.showFindDialog(sel);
-                break;
-
-            default:
-                return false;
-        }
-        return true;
-    }
-
-    @Override
-    public void onDestroyActionMode(ActionMode mode) {
-        mBrowserActivity.onEndActionMode();
-        mWebView.notifySelectDialogDismissed();
-    }
-}
diff --git a/src/com/android/browser/Tab.java b/src/com/android/browser/Tab.java
index e7309a6..a9ab058 100644
--- a/src/com/android/browser/Tab.java
+++ b/src/com/android/browser/Tab.java
@@ -1045,16 +1045,6 @@
         }
 
         @Override
-        public void onSelectionDone(WebView view) {
-            if (mInForeground) mActivity.endActionMode();
-        }
-
-        @Override
-        public void onSelectionStart(WebView view) {
-            if (mInForeground) mActivity.showSelectDialog();
-        }
-
-        @Override
         public void onShowCustomView(View view,
                 WebChromeClient.CustomViewCallback callback) {
             if (mInForeground) mActivity.onShowCustomView(view, callback);
