diff --git a/res/drawable-hdpi/ic_go_holo_dark.png b/res/drawable-hdpi/ic_go_holo_dark.png
deleted file mode 100644
index b1412e8..0000000
--- a/res/drawable-hdpi/ic_go_holo_dark.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-hdpi/ic_voice_search_holo_dark.png b/res/drawable-hdpi/ic_voice_search_holo_dark.png
deleted file mode 100644
index 73bcafc..0000000
--- a/res/drawable-hdpi/ic_voice_search_holo_dark.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-mdpi/ic_go_holo_dark.png b/res/drawable-mdpi/ic_go_holo_dark.png
deleted file mode 100644
index 2e2a449..0000000
--- a/res/drawable-mdpi/ic_go_holo_dark.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-mdpi/ic_voice_search_holo_dark.png b/res/drawable-mdpi/ic_voice_search_holo_dark.png
deleted file mode 100644
index e7e4f68..0000000
--- a/res/drawable-mdpi/ic_voice_search_holo_dark.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-xhdpi/ic_go_holo_dark.png b/res/drawable-xhdpi/ic_go_holo_dark.png
deleted file mode 100644
index e4b59b3..0000000
--- a/res/drawable-xhdpi/ic_go_holo_dark.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-xhdpi/ic_voice_search_holo_dark.png b/res/drawable-xhdpi/ic_voice_search_holo_dark.png
deleted file mode 100644
index bfeb7aa..0000000
--- a/res/drawable-xhdpi/ic_voice_search_holo_dark.png
+++ /dev/null
Binary files differ
diff --git a/res/layout-sw600dp/title_bar_nav.xml b/res/layout-sw600dp/title_bar_nav.xml
index e628a81..300b740 100644
--- a/res/layout-sw600dp/title_bar_nav.xml
+++ b/res/layout-sw600dp/title_bar_nav.xml
@@ -103,22 +103,6 @@
             style="@style/HoloButton" />
     </LinearLayout>
     <ImageButton
-        android:id="@+id/go"
-        android:src="@drawable/ic_go_holo_dark"
-        android:layout_width="wrap_content"
-        android:layout_height="match_parent"
-        android:visibility="gone"
-        android:gravity="center_vertical"
-            android:contentDescription="@string/accessibility_button_go"
-        style="@style/HoloButton" />
-    <ImageButton
-        android:id="@+id/voicesearch"
-        android:src="@drawable/ic_voice_search_holo_dark"
-        android:layout_width="wrap_content"
-        android:layout_height="match_parent"
-            android:contentDescription="@string/accessibility_button_voice"
-        style="@style/HoloButton" />
-    <ImageButton
         android:id="@+id/search"
         android:src="@drawable/ic_search_holo_dark"
         android:layout_width="wrap_content"
diff --git a/res/layout/title_bar_nav.xml b/res/layout/title_bar_nav.xml
index 15568c3..31e47bc 100644
--- a/res/layout/title_bar_nav.xml
+++ b/res/layout/title_bar_nav.xml
@@ -89,15 +89,6 @@
             style="@style/Suggestions"
             android:background="@null" />
         <ImageView
-            android:id="@+id/voice"
-            android:layout_width="wrap_content"
-            android:layout_height="match_parent"
-            android:paddingRight="4dip"
-            android:contentDescription="@string/accessibility_button_voice"
-            android:src="@drawable/ic_voice_search_holo_dark"
-            style="@style/HoloButton"
-            android:visibility="gone" />
-        <ImageView
             android:id="@+id/clear"
             android:layout_width="wrap_content"
             android:layout_height="match_parent"
diff --git a/res/xml/searchable.xml b/res/xml/searchable.xml
index bb578c6..3397a40 100644
--- a/res/xml/searchable.xml
+++ b/res/xml/searchable.xml
@@ -26,7 +26,6 @@
     android:voiceSearchMode="showVoiceSearchButton|launchWebSearch"
     android:inputType="textUri"
     android:imeOptions="actionGo"
-    
     android:searchSuggestAuthority="browser"
     android:searchSuggestSelection="url LIKE ?"
     android:searchSuggestIntentAction="android.intent.action.VIEW"
diff --git a/src/com/android/browser/BaseUi.java b/src/com/android/browser/BaseUi.java
index 01c7da6..42c7206 100644
--- a/src/com/android/browser/BaseUi.java
+++ b/src/com/android/browser/BaseUi.java
@@ -500,19 +500,6 @@
     }
 
     @Override
-    public void showVoiceTitleBar(String title, List<String> results) {
-        mNavigationBar.setInVoiceMode(true, results);
-        mNavigationBar.setDisplayTitle(title);
-    }
-
-    @Override
-    public void revertVoiceTitleBar(Tab tab) {
-        mNavigationBar.setInVoiceMode(false, null);
-        String url = tab.getUrl();
-        mNavigationBar.setDisplayTitle(url);
-    }
-
-    @Override
     public void showComboView(ComboViews startingView, Bundle extras) {
         Intent intent = new Intent(mActivity, ComboViewActivity.class);
         intent.putExtra(ComboViewActivity.EXTRA_INITIAL_VIEW, startingView.name());
@@ -625,7 +612,6 @@
         if (TextUtils.isEmpty(title)) {
             title = url;
         }
-        if (tab.isInVoiceSearchMode()) return;
         if (tab.inForeground()) {
             mNavigationBar.setDisplayTitle(url);
         }
diff --git a/src/com/android/browser/BrowserSettings.java b/src/com/android/browser/BrowserSettings.java
index cddeda6..76dc48f 100644
--- a/src/com/android/browser/BrowserSettings.java
+++ b/src/com/android/browser/BrowserSettings.java
@@ -429,17 +429,6 @@
         String searchEngineName = getSearchEngineName();
         if (force || mSearchEngine == null ||
                 !mSearchEngine.getName().equals(searchEngineName)) {
-            if (mSearchEngine != null) {
-                if (mSearchEngine.supportsVoiceSearch()) {
-                     // One or more tabs could have been in voice search mode.
-                     // Clear it, since the new SearchEngine may not support
-                     // it, or may handle it differently.
-                     for (int i = 0; i < mController.getTabControl().getTabCount(); i++) {
-                         mController.getTabControl().getTab(i).revertVoiceSearchMode();
-                     }
-                 }
-                mSearchEngine.close();
-             }
             mSearchEngine = SearchEngines.get(mContext, searchEngineName);
          }
     }
diff --git a/src/com/android/browser/Controller.java b/src/com/android/browser/Controller.java
index 0c86988..ba74e56 100644
--- a/src/com/android/browser/Controller.java
+++ b/src/com/android/browser/Controller.java
@@ -17,7 +17,6 @@
 package com.android.browser;
 
 import android.app.Activity;
-import android.app.AlertDialog;
 import android.app.Dialog;
 import android.app.DownloadManager;
 import android.app.ProgressDialog;
@@ -56,7 +55,6 @@
 import android.provider.BrowserContract.Images;
 import android.provider.ContactsContract;
 import android.provider.ContactsContract.Intents.Insert;
-import android.speech.RecognizerIntent;
 import android.text.TextUtils;
 import android.util.Log;
 import android.util.Patterns;
@@ -1107,31 +1105,6 @@
         mUi.editUrl(false, true);
     }
 
-    public void startVoiceSearch() {
-        Intent intent = new Intent(RecognizerIntent.ACTION_WEB_SEARCH);
-        intent.putExtra(RecognizerIntent.EXTRA_LANGUAGE_MODEL,
-                RecognizerIntent.LANGUAGE_MODEL_WEB_SEARCH);
-        intent.putExtra(RecognizerIntent.EXTRA_CALLING_PACKAGE,
-                mActivity.getComponentName().flattenToString());
-        intent.putExtra(SEND_APP_ID_EXTRA, false);
-        intent.putExtra(RecognizerIntent.EXTRA_WEB_SEARCH_ONLY, true);
-        mActivity.startActivity(intent);
-    }
-
-    @Override
-    public void activateVoiceSearchMode(String title, List<String> results) {
-        mUi.showVoiceTitleBar(title, results);
-    }
-
-    public void revertVoiceSearchMode(Tab tab) {
-        mUi.revertVoiceTitleBar(tab);
-    }
-
-    public boolean supportsVoiceSearch() {
-        SearchEngine searchEngine = getSettings().getSearchEngine();
-        return (searchEngine != null && searchEngine.supportsVoiceSearch());
-    }
-
     public void showCustomView(Tab tab, View view, int requestedOrientation,
             WebChromeClient.CustomViewCallback callback) {
         if (tab.inForeground()) {
@@ -2541,9 +2514,7 @@
      */
     protected void loadUrlDataIn(Tab t, UrlData data) {
         if (data != null) {
-            if (data.mVoiceIntent != null) {
-                t.activateVoiceSearchMode(data.mVoiceIntent);
-            } else if (data.isPreloaded()) {
+            if (data.isPreloaded()) {
                 // this isn't called for preloaded tabs
             } else {
                 loadUrl(t, data.mUrl, data.mHeaders);
@@ -2601,47 +2572,6 @@
     }
 
     /**
-     * Feed the previously stored results strings to the BrowserProvider so that
-     * the SearchDialog will show them instead of the standard searches.
-     * @param result String to show on the editable line of the SearchDialog.
-     */
-    @Override
-    public void showVoiceSearchResults(String result) {
-        ContentProviderClient client = mActivity.getContentResolver()
-                .acquireContentProviderClient(Browser.BOOKMARKS_URI);
-        ContentProvider prov = client.getLocalContentProvider();
-        BrowserProvider bp = (BrowserProvider) prov;
-        bp.setQueryResults(mTabControl.getCurrentTab().getVoiceSearchResults());
-        client.release();
-
-        Bundle bundle = createGoogleSearchSourceBundle(
-                GOOGLE_SEARCH_SOURCE_SEARCHKEY);
-        bundle.putBoolean(SearchManager.CONTEXT_IS_VOICE, true);
-        startSearch(result, false, bundle, false);
-    }
-
-    private void startSearch(String initialQuery, boolean selectInitialQuery,
-            Bundle appSearchData, boolean globalSearch) {
-        if (appSearchData == null) {
-            appSearchData = createGoogleSearchSourceBundle(
-                    GOOGLE_SEARCH_SOURCE_TYPE);
-        }
-
-        SearchEngine searchEngine = mSettings.getSearchEngine();
-        if (searchEngine != null && !searchEngine.supportsVoiceSearch()) {
-            appSearchData.putBoolean(SearchManager.DISABLE_VOICE_SEARCH, true);
-        }
-        mActivity.startSearch(initialQuery, selectInitialQuery, appSearchData,
-                globalSearch);
-    }
-
-    private Bundle createGoogleSearchSourceBundle(String source) {
-        Bundle bundle = new Bundle();
-        bundle.putString(Search.SOURCE, source);
-        return bundle;
-    }
-
-    /**
      * helper method for key handler
      * returns the current tab if it can't advance
      */
diff --git a/src/com/android/browser/IntentHandler.java b/src/com/android/browser/IntentHandler.java
index b21c688..47cab70 100644
--- a/src/com/android/browser/IntentHandler.java
+++ b/src/com/android/browser/IntentHandler.java
@@ -28,14 +28,12 @@
 import android.os.Bundle;
 import android.provider.Browser;
 import android.provider.MediaStore;
-import android.speech.RecognizerResultsIntent;
 import android.text.TextUtils;
 import android.util.Patterns;
 
 import com.android.browser.UI.ComboViews;
 import com.android.browser.search.SearchEngine;
 import com.android.common.Search;
-import com.android.common.speech.LoggingEvents;
 
 import java.util.HashMap;
 import java.util.Iterator;
@@ -93,37 +91,11 @@
         // In case the SearchDialog is open.
         ((SearchManager) mActivity.getSystemService(Context.SEARCH_SERVICE))
                 .stopSearch();
-        boolean activateVoiceSearch = RecognizerResultsIntent
-                .ACTION_VOICE_SEARCH_RESULTS.equals(action);
         if (Intent.ACTION_VIEW.equals(action)
                 || NfcAdapter.ACTION_NDEF_DISCOVERED.equals(action)
                 || Intent.ACTION_SEARCH.equals(action)
                 || MediaStore.INTENT_ACTION_MEDIA_SEARCH.equals(action)
-                || Intent.ACTION_WEB_SEARCH.equals(action)
-                || activateVoiceSearch) {
-            if (current.isInVoiceSearchMode()) {
-                String title = current.getVoiceDisplayTitle();
-                if (title != null && title.equals(intent.getStringExtra(
-                        SearchManager.QUERY))) {
-                    // The user submitted the same search as the last voice
-                    // search, so do nothing.
-                    return;
-                }
-                if (Intent.ACTION_SEARCH.equals(action)
-                        && current.voiceSearchSourceIsGoogle()) {
-                    Intent logIntent = new Intent(
-                            LoggingEvents.ACTION_LOG_EVENT);
-                    logIntent.putExtra(LoggingEvents.EXTRA_EVENT,
-                            LoggingEvents.VoiceSearch.QUERY_UPDATED);
-                    logIntent.putExtra(
-                            LoggingEvents.VoiceSearch.EXTRA_QUERY_UPDATED_VALUE,
-                            intent.getDataString());
-                    mActivity.sendBroadcast(logIntent);
-                    // Note, onPageStarted will revert the voice title bar
-                    // When http://b/issue?id=2379215 is fixed, we should update
-                    // the title bar here.
-                }
-            }
+                || Intent.ACTION_WEB_SEARCH.equals(action)) {
             // If this was a search request (e.g. search query directly typed into the address bar),
             // pass it on to the default web search provider.
             if (handleWebSearchIntent(mActivity, mController, intent)) {
@@ -143,11 +115,9 @@
             /*
              * TODO: Don't allow javascript URIs
              * 0) If this is a javascript: URI, *always* open a new tab
-             * 1) If this is a voice search, re-use tab for appId
-             *    If there is no appId, use current tab
-             * 2) If the URL is already opened, switch to that tab
-             * 3-phone) Reuse tab with same appId
-             * 3-tablet) Open new tab
+             * 1) If the URL is already opened, switch to that tab
+             * 2-phone) Reuse tab with same appId
+             * 2-tablet) Open new tab
              */
             final String appId = intent
                     .getStringExtra(Browser.EXTRA_APPLICATION_ID);
@@ -167,12 +137,9 @@
                     return;
                 }
             }
-            if ((Intent.ACTION_VIEW.equals(action)
-                    // If a voice search has no appId, it means that it came
-                    // from the browser.  In that case, reuse the current tab.
-                    || (activateVoiceSearch && appId != null))
-                    && !mActivity.getPackageName().equals(appId)) {
-                if (activateVoiceSearch || !BrowserActivity.isTablet(mActivity)) {
+            if (Intent.ACTION_VIEW.equals(action)
+                     && !mActivity.getPackageName().equals(appId)) {
+                if (!BrowserActivity.isTablet(mActivity)) {
                     Tab appTab = mTabControl.getTabFromAppId(appId);
                     if (appTab != null) {
                         mController.reuseTab(appTab, urlData);
@@ -301,10 +268,6 @@
 
         String url = null;
         final String action = intent.getAction();
-        if (RecognizerResultsIntent.ACTION_VOICE_SEARCH_RESULTS.equals(
-                action)) {
-            return false;
-        }
         if (Intent.ACTION_VIEW.equals(action)) {
             Uri data = intent.getData();
             if (data != null) url = data.toString();
@@ -369,14 +332,12 @@
     static class UrlData {
         final String mUrl;
         final Map<String, String> mHeaders;
-        final Intent mVoiceIntent;
         final PreloadedTabControl mPreloadedTab;
         final String mSearchBoxQueryToSubmit;
 
         UrlData(String url) {
             this.mUrl = url;
             this.mHeaders = null;
-            this.mVoiceIntent = null;
             this.mPreloadedTab = null;
             this.mSearchBoxQueryToSubmit = null;
         }
@@ -389,18 +350,12 @@
                 PreloadedTabControl preloaded, String searchBoxQueryToSubmit) {
             this.mUrl = url;
             this.mHeaders = headers;
-            if (RecognizerResultsIntent.ACTION_VOICE_SEARCH_RESULTS
-                    .equals(intent.getAction())) {
-                this.mVoiceIntent = intent;
-            } else {
-                this.mVoiceIntent = null;
-            }
             this.mPreloadedTab = preloaded;
             this.mSearchBoxQueryToSubmit = searchBoxQueryToSubmit;
         }
 
         boolean isEmpty() {
-            return mVoiceIntent == null && (mUrl == null || mUrl.length() == 0);
+            return (mUrl == null || mUrl.length() == 0);
         }
 
         boolean isPreloaded() {
diff --git a/src/com/android/browser/NavigationBarBase.java b/src/com/android/browser/NavigationBarBase.java
index d66c877..cf61c45 100644
--- a/src/com/android/browser/NavigationBarBase.java
+++ b/src/com/android/browser/NavigationBarBase.java
@@ -45,7 +45,6 @@
     protected TitleBar mTitleBar;
     protected UiController mUiController;
     protected UrlInputView mUrlInput;
-    protected boolean mInVoiceMode = false;
 
     private ImageView mFavicon;
     private ImageView mLockIcon;
@@ -108,9 +107,6 @@
         }
         if (hasFocus) {
             mBaseUi.showTitleBar();
-            if (mInVoiceMode) {
-                mUrlInput.forceFilter();
-            }
         } else if (!mUrlInput.needsUpdate()) {
             mUrlInput.dismissDropDown();
             mUrlInput.hideIME();
@@ -128,8 +124,6 @@
     protected void setFocusState(boolean focus) {
     }
 
-    protected void setSearchMode(boolean voiceSearchEnabled) {}
-
     public boolean isEditingUrl() {
         return mUrlInput.hasFocus();
     }
@@ -144,13 +138,6 @@
         }
     }
 
-    // voicesearch
-
-    public void setInVoiceMode(boolean voicemode, List<String> voiceResults) {
-        mInVoiceMode = voicemode;
-        mUrlInput.setVoiceResults(voiceResults);
-    }
-
     void setIncognitoMode(boolean incognito) {
         mUrlInput.setIncognitoMode(incognito);
     }
@@ -183,13 +170,7 @@
             }
         }
         Intent i = new Intent();
-        String action = null;
-        if (UrlInputView.VOICE.equals(source)) {
-            action = RecognizerResultsIntent.ACTION_VOICE_SEARCH_RESULTS;
-            source = null;
-        } else {
-            action = Intent.ACTION_SEARCH;
-        }
+        String action = Intent.ACTION_SEARCH;
         i.setAction(action);
         i.putExtra(SearchManager.QUERY, text);
         if (extra != null) {
@@ -211,7 +192,7 @@
         post(new Runnable() {
             public void run() {
                 clearFocus();
-                if ((currentTab != null) && !mInVoiceMode) {
+                if (currentTab != null) {
                     setDisplayTitle(currentTab.getUrl());
                 }
             }
@@ -258,8 +239,6 @@
         }
         if (clearInput) {
             mUrlInput.setText("");
-        } else if (mInVoiceMode) {
-            mUrlInput.showDropDown();
         }
         if (forceIME) {
             mUrlInput.showIME();
@@ -283,12 +262,7 @@
     public void beforeTextChanged(CharSequence s, int start, int count, int after) { }
 
     @Override
-    public void onTextChanged(CharSequence s, int start, int before, int count) {
-        if (mUrlInput.hasFocus()) {
-            // clear voice mode when user types
-            setInVoiceMode(false, null);
-        }
-    }
+    public void onTextChanged(CharSequence s, int start, int before, int count) { }
 
     @Override
     public void afterTextChanged(Editable s) { }
diff --git a/src/com/android/browser/NavigationBarPhone.java b/src/com/android/browser/NavigationBarPhone.java
index 60b228d..2517d62 100644
--- a/src/com/android/browser/NavigationBarPhone.java
+++ b/src/com/android/browser/NavigationBarPhone.java
@@ -36,7 +36,6 @@
         StateListener, OnMenuItemClickListener, OnDismissListener {
 
     private ImageView mStopButton;
-    private ImageView mVoiceButton;
     private ImageView mMagnify;
     private ImageView mClearButton;
     private Drawable mStopDrawable;
@@ -70,8 +69,6 @@
         super.onFinishInflate();
         mStopButton = (ImageView) findViewById(R.id.stop);
         mStopButton.setOnClickListener(this);
-        mVoiceButton = (ImageView) findViewById(R.id.voice);
-        mVoiceButton.setOnClickListener(this);
         mClearButton = (ImageView) findViewById(R.id.clear);
         mClearButton.setOnClickListener(this);
         mMagnify = (ImageView) findViewById(R.id.magnify);
@@ -96,14 +93,6 @@
     }
 
     @Override
-    protected void setSearchMode(boolean voiceSearchEnabled) {
-        boolean showvoicebutton = voiceSearchEnabled &&
-                mUiController.supportsVoiceSearch();
-        mVoiceButton.setVisibility(showvoicebutton ? View.VISIBLE :
-                View.GONE);
-    }
-
-    @Override
     public void onProgressStarted() {
         super.onProgressStarted();
         if (mStopButton.getDrawable() != mStopDrawable) {
@@ -157,8 +146,6 @@
                     web.reload();
                 }
             }
-        } else if (v == mVoiceButton) {
-            mUiController.startVoiceSearch();
         } else if (v == mTabSwitcher) {
             ((PhoneUi) mBaseUi).toggleNavScreen();
         } else if (mMore == v) {
@@ -229,7 +216,6 @@
             mStopButton.setVisibility(View.GONE);
             mClearButton.setVisibility(View.GONE);
             mMagnify.setVisibility(View.GONE);
-            setSearchMode(mInVoiceMode);
             mTabSwitcher.setVisibility(View.VISIBLE);
             mTitleContainer.setBackgroundDrawable(null);
             mMore.setVisibility(mNeedsMenu ? View.VISIBLE : View.GONE);
@@ -239,7 +225,6 @@
             mStopButton.setVisibility(View.VISIBLE);
             mClearButton.setVisibility(View.GONE);
             mMagnify.setVisibility(View.GONE);
-            setSearchMode(true);
             mTabSwitcher.setVisibility(View.GONE);
             mMore.setVisibility(View.GONE);
             mTitleContainer.setBackgroundDrawable(mTextfieldBgDrawable);
@@ -249,7 +234,6 @@
             mStopButton.setVisibility(View.GONE);
             mClearButton.setVisibility(View.VISIBLE);
             mMagnify.setVisibility(View.VISIBLE);
-            setSearchMode(false);
             mTabSwitcher.setVisibility(View.GONE);
             mMore.setVisibility(View.GONE);
             mTitleContainer.setBackgroundDrawable(mTextfieldBgDrawable);
diff --git a/src/com/android/browser/NavigationBarTablet.java b/src/com/android/browser/NavigationBarTablet.java
index 37b1f17..b9c86e3 100644
--- a/src/com/android/browser/NavigationBarTablet.java
+++ b/src/com/android/browser/NavigationBarTablet.java
@@ -48,11 +48,9 @@
     private ImageView mStar;
     private ImageView mUrlIcon;
     private ImageView mSearchButton;
-    private View mGoButton;
     private ImageView mStopButton;
     private View mAllButton;
     private View mClearButton;
-    private ImageView mVoiceSearch;
     private View mNavButtons;
     private Drawable mFocusDrawable;
     private Drawable mUnfocusDrawable;
@@ -100,9 +98,7 @@
         mStar = (ImageView) findViewById(R.id.star);
         mStopButton = (ImageView) findViewById(R.id.stop);
         mSearchButton = (ImageView) findViewById(R.id.search);
-        mGoButton = findViewById(R.id.go);
         mClearButton = findViewById(R.id.clear);
-        mVoiceSearch = (ImageView) findViewById(R.id.voicesearch);
         mUrlContainer = findViewById(R.id.urlbar_focused);
         mBackButton.setOnClickListener(this);
         mForwardButton.setOnClickListener(this);
@@ -110,9 +106,7 @@
         mAllButton.setOnClickListener(this);
         mStopButton.setOnClickListener(this);
         mSearchButton.setOnClickListener(this);
-        mGoButton.setOnClickListener(this);
         mClearButton.setOnClickListener(this);
-        mVoiceSearch.setOnClickListener(this);
         mUrlInput.setContainer(mUrlContainer);
     }
 
@@ -177,18 +171,11 @@
         } else if (mAllButton == v) {
             mUiController.bookmarksOrHistoryPicker(ComboViews.Bookmarks);
         } else if (mSearchButton == v) {
-            mBaseUi.editUrl(true, false);
+            mBaseUi.editUrl(true, true);
         } else if (mStopButton == v) {
             stopOrRefresh();
-        } else if (mGoButton == v) {
-            if (!TextUtils.isEmpty(mUrlInput.getText())) {
-                onAction(mUrlInput.getText().toString(), null,
-                        UrlInputView.TYPED);
-            }
         } else if (mClearButton == v) {
             clearOrClose();
-        } else if (mVoiceSearch == v) {
-            mUiController.startVoiceSearch();
         } else {
             super.onClick(v);
         }
@@ -214,14 +201,10 @@
         if (mUrlInput.hasFocus()) {
             mUrlIcon.setImageResource(R.drawable.ic_search_holo_dark);
         } else {
-            if (mInVoiceMode) {
-                mUrlIcon.setImageResource(R.drawable.ic_search_holo_dark);
-            } else {
-                if (mFaviconDrawable == null) {
-                    mFaviconDrawable = mBaseUi.getFaviconDrawable(null);
-                }
-                mUrlIcon.setImageDrawable(mFaviconDrawable);
+            if (mFaviconDrawable == null) {
+                mFaviconDrawable = mBaseUi.getFaviconDrawable(null);
             }
+            mUrlIcon.setImageDrawable(mFaviconDrawable);
         }
     }
 
@@ -236,13 +219,10 @@
             mStar.setVisibility(View.GONE);
             mClearButton.setVisibility(View.VISIBLE);
             mUrlIcon.setImageResource(R.drawable.ic_search_holo_dark);
-            updateSearchMode(false);
         } else {
             if (mHideNavButtons) {
                 showNavButtons();
             }
-            mGoButton.setVisibility(View.GONE);
-            mVoiceSearch.setVisibility(View.GONE);
             showHideStar(mUiController.getCurrentTab());
             mClearButton.setVisibility(View.GONE);
             if (mTitleBar.useQuickControls()) {
@@ -279,28 +259,6 @@
         mStopButton.setContentDescription(mRefreshDescription);
     }
 
-    protected void updateSearchMode(boolean userEdited) {
-        setSearchMode(!userEdited || TextUtils.isEmpty(mUrlInput.getText()));
-    }
-
-    @Override
-    protected void setSearchMode(boolean voiceSearchEnabled) {
-        boolean showvoicebutton = voiceSearchEnabled &&
-                mUiController.supportsVoiceSearch();
-        mVoiceSearch.setVisibility(showvoicebutton ? View.VISIBLE :
-                View.GONE);
-        mGoButton.setVisibility(voiceSearchEnabled ? View.GONE :
-                View.VISIBLE);
-    }
-
-    @Override
-    public void setInVoiceMode(boolean voicemode, List<String> voiceResults) {
-        super.setInVoiceMode(voicemode, voiceResults);
-        if (voicemode) {
-            mUrlIcon.setImageDrawable(mSearchButton.getDrawable());
-        }
-    }
-
     private void hideNavButtons() {
         int awidth = mNavButtons.getMeasuredWidth();
         Animator anim1 = ObjectAnimator.ofFloat(mNavButtons, View.TRANSLATION_X, 0, - awidth);
diff --git a/src/com/android/browser/PhoneUi.java b/src/com/android/browser/PhoneUi.java
index ed63daa..eb6032d 100644
--- a/src/com/android/browser/PhoneUi.java
+++ b/src/com/android/browser/PhoneUi.java
@@ -146,11 +146,6 @@
         } else {
             view.setTitleBar(mTitleBar);
         }
-        if (tab.isInVoiceSearchMode()) {
-            showVoiceTitleBar(tab.getVoiceDisplayTitle(), tab.getVoiceSearchResults());
-        } else {
-            revertVoiceTitleBar(tab);
-        }
         // update nav bar state
         mNavigationBar.onStateChanged(StateListener.STATE_NORMAL);
         updateLockIconToLatest(tab);
diff --git a/src/com/android/browser/PreloadController.java b/src/com/android/browser/PreloadController.java
index 66b89f4..a7feaee 100644
--- a/src/com/android/browser/PreloadController.java
+++ b/src/com/android/browser/PreloadController.java
@@ -31,8 +31,6 @@
 import android.webkit.WebChromeClient.CustomViewCallback;
 import android.webkit.WebView;
 
-import java.util.List;
-
 public class PreloadController implements WebViewController {
 
     private static final boolean LOGD_ENABLED = false;
@@ -194,16 +192,6 @@
     }
 
     @Override
-    public void activateVoiceSearchMode(String title, List<String> results) {
-        if (LOGD_ENABLED) Log.d(LOGTAG, "activateVoiceSearchMode()");
-    }
-
-    @Override
-    public void revertVoiceSearchMode(Tab tab) {
-        if (LOGD_ENABLED) Log.d(LOGTAG, "revertVoiceSearchMode()");
-    }
-
-    @Override
     public boolean shouldShowErrorConsole() {
         if (LOGD_ENABLED) Log.d(LOGTAG, "shouldShowErrorConsole()");
         return false;
diff --git a/src/com/android/browser/SuggestionsAdapter.java b/src/com/android/browser/SuggestionsAdapter.java
index 7400b5d..9f66e3c 100644
--- a/src/com/android/browser/SuggestionsAdapter.java
+++ b/src/com/android/browser/SuggestionsAdapter.java
@@ -16,10 +16,6 @@
 
 package com.android.browser;
 
-import com.android.browser.provider.BrowserProvider2;
-import com.android.browser.provider.BrowserProvider2.OmniboxSuggestions;
-import com.android.browser.search.SearchEngine;
-
 import android.app.SearchManager;
 import android.content.Context;
 import android.database.Cursor;
@@ -38,6 +34,9 @@
 import android.widget.ImageView;
 import android.widget.TextView;
 
+import com.android.browser.provider.BrowserProvider2.OmniboxSuggestions;
+import com.android.browser.search.SearchEngine;
+
 import java.util.ArrayList;
 import java.util.List;
 
@@ -52,7 +51,6 @@
     public static final int TYPE_SUGGEST_URL = 2;
     public static final int TYPE_SEARCH = 3;
     public static final int TYPE_SUGGEST = 4;
-    public static final int TYPE_VOICE_SEARCH = 5;
 
     private static final String[] COMBINED_PROJECTION = {
             OmniboxSuggestions._ID,
@@ -74,7 +72,6 @@
     final int mLinesPortrait;
     final int mLinesLandscape;
     final Object mResultsLock = new Object();
-    List<String> mVoiceResults;
     boolean mIncognitoMode;
     BrowserSettings mSettings;
 
@@ -99,11 +96,6 @@
         addSource(new CombinedCursor());
     }
 
-    void setVoiceResults(List<String> voiceResults) {
-        mVoiceResults = voiceResults;
-        notifyDataSetChanged();
-    }
-
     public void setLandscapeMode(boolean mode) {
         mLandscapeMode = mode;
         notifyDataSetChanged();
@@ -135,20 +127,11 @@
 
     @Override
     public int getCount() {
-        if (mVoiceResults != null) {
-            return mVoiceResults.size();
-        }
         return (mMixedResults == null) ? 0 : mMixedResults.getLineCount();
     }
 
     @Override
     public SuggestItem getItem(int position) {
-        if (mVoiceResults != null) {
-            SuggestItem item = new SuggestItem(mVoiceResults.get(position),
-                    null, TYPE_VOICE_SEARCH);
-            item.extra = Integer.toString(position);
-            return item;
-        }
         if (mMixedResults == null) {
             return null;
         }
@@ -192,7 +175,6 @@
         switch (item.type) {
             case TYPE_SUGGEST:
             case TYPE_SEARCH:
-            case TYPE_VOICE_SEARCH:
                 id = R.drawable.ic_search_category_suggest;
                 break;
             case TYPE_BOOKMARK:
@@ -211,8 +193,7 @@
             ic1.setImageDrawable(mContext.getResources().getDrawable(id));
         }
         ic2.setVisibility(((TYPE_SUGGEST == item.type)
-                || (TYPE_SEARCH == item.type)
-                || (TYPE_VOICE_SEARCH == item.type))
+                || (TYPE_SEARCH == item.type))
                 ? View.VISIBLE : View.GONE);
         div.setVisibility(ic2.getVisibility());
         ic2.setOnClickListener(this);
@@ -292,30 +273,25 @@
         @Override
         protected FilterResults performFiltering(CharSequence constraint) {
             FilterResults res = new FilterResults();
-            if (mVoiceResults == null) {
-                if (TextUtils.isEmpty(constraint) && !shouldProcessEmptyQuery()) {
-                    res.count = 0;
-                    res.values = null;
-                    return res;
-                }
-                startSuggestionsAsync(constraint);
-                List<SuggestItem> filterResults = new ArrayList<SuggestItem>();
-                if (constraint != null) {
-                    for (CursorSource sc : mSources) {
-                        sc.runQuery(constraint);
-                    }
-                    mixResults(filterResults);
-                }
-                synchronized (mResultsLock) {
-                    mFilterResults = filterResults;
-                }
-                SuggestionResults mixed = buildSuggestionResults();
-                res.count = mixed.getLineCount();
-                res.values = mixed;
-            } else {
-                res.count = mVoiceResults.size();
-                res.values = mVoiceResults;
+            if (TextUtils.isEmpty(constraint) && !shouldProcessEmptyQuery()) {
+                res.count = 0;
+                res.values = null;
+                return res;
             }
+            startSuggestionsAsync(constraint);
+            List<SuggestItem> filterResults = new ArrayList<SuggestItem>();
+            if (constraint != null) {
+                for (CursorSource sc : mSources) {
+                    sc.runQuery(constraint);
+                }
+                mixResults(filterResults);
+            }
+            synchronized (mResultsLock) {
+                mFilterResults = filterResults;
+            }
+            SuggestionResults mixed = buildSuggestionResults();
+            res.count = mixed.getLineCount();
+            res.values = mixed;
             return res;
         }
 
diff --git a/src/com/android/browser/Tab.java b/src/com/android/browser/Tab.java
index 73f5b9e..712e30a 100644
--- a/src/com/android/browser/Tab.java
+++ b/src/com/android/browser/Tab.java
@@ -18,13 +18,11 @@
 
 import android.app.Activity;
 import android.app.AlertDialog;
-import android.app.SearchManager;
 import android.content.ContentResolver;
 import android.content.ContentValues;
 import android.content.Context;
 import android.content.DialogInterface;
 import android.content.DialogInterface.OnCancelListener;
-import android.content.Intent;
 import android.graphics.Bitmap;
 import android.graphics.Bitmap.CompressFormat;
 import android.graphics.BitmapFactory;
@@ -42,7 +40,6 @@
 import android.os.SystemClock;
 import android.security.KeyChain;
 import android.security.KeyChainAliasCallback;
-import android.speech.RecognizerResultsIntent;
 import android.text.TextUtils;
 import android.util.Log;
 import android.view.KeyEvent;
@@ -73,16 +70,12 @@
 import com.android.browser.TabControl.OnThumbnailUpdatedListener;
 import com.android.browser.homepages.HomeProvider;
 import com.android.browser.provider.SnapshotProvider.Snapshots;
-import com.android.common.speech.LoggingEvents;
 
 import java.io.ByteArrayOutputStream;
 import java.io.File;
 import java.io.IOException;
 import java.io.OutputStream;
 import java.nio.ByteBuffer;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.Iterator;
 import java.util.LinkedList;
 import java.util.Map;
 import java.util.UUID;
@@ -256,234 +249,6 @@
     static final String USERAGENT = "useragent";
     static final String CLOSEFLAG = "closeOnBack";
 
-    // -------------------------------------------------------------------------
-
-    /**
-     * Private information regarding the latest voice search.  If the Tab is not
-     * in voice search mode, this will be null.
-     */
-    private VoiceSearchData mVoiceSearchData;
-    /**
-     * Remove voice search mode from this tab.
-     */
-    public void revertVoiceSearchMode() {
-        if (mVoiceSearchData != null) {
-            mVoiceSearchData = null;
-            if (mInForeground) {
-                mWebViewController.revertVoiceSearchMode(this);
-            }
-        }
-    }
-
-    /**
-     * Return whether the tab is in voice search mode.
-     */
-    public boolean isInVoiceSearchMode() {
-        return mVoiceSearchData != null;
-    }
-    /**
-     * Return true if the Tab is in voice search mode and the voice search
-     * Intent came with a String identifying that Google provided the Intent.
-     */
-    public boolean voiceSearchSourceIsGoogle() {
-        return mVoiceSearchData != null && mVoiceSearchData.mSourceIsGoogle;
-    }
-    /**
-     * Get the title to display for the current voice search page.  If the Tab
-     * is not in voice search mode, return null.
-     */
-    public String getVoiceDisplayTitle() {
-        if (mVoiceSearchData == null) return null;
-        return mVoiceSearchData.mLastVoiceSearchTitle;
-    }
-    /**
-     * Get the latest array of voice search results, to be passed to the
-     * BrowserProvider.  If the Tab is not in voice search mode, return null.
-     */
-    public ArrayList<String> getVoiceSearchResults() {
-        if (mVoiceSearchData == null) return null;
-        return mVoiceSearchData.mVoiceSearchResults;
-    }
-    /**
-     * Activate voice search mode.
-     * @param intent Intent which has the results to use, or an index into the
-     *      results when reusing the old results.
-     */
-    /* package */ void activateVoiceSearchMode(Intent intent) {
-        int index = 0;
-        ArrayList<String> results = intent.getStringArrayListExtra(
-                    RecognizerResultsIntent.EXTRA_VOICE_SEARCH_RESULT_STRINGS);
-        if (results != null) {
-            ArrayList<String> urls = intent.getStringArrayListExtra(
-                        RecognizerResultsIntent.EXTRA_VOICE_SEARCH_RESULT_URLS);
-            ArrayList<String> htmls = intent.getStringArrayListExtra(
-                        RecognizerResultsIntent.EXTRA_VOICE_SEARCH_RESULT_HTML);
-            ArrayList<String> baseUrls = intent.getStringArrayListExtra(
-                        RecognizerResultsIntent
-                        .EXTRA_VOICE_SEARCH_RESULT_HTML_BASE_URLS);
-            // This tab is now entering voice search mode for the first time, or
-            // a new voice search was done.
-            int size = results.size();
-            if (urls == null || size != urls.size()) {
-                throw new AssertionError("improper extras passed in Intent");
-            }
-            if (htmls == null || htmls.size() != size || baseUrls == null ||
-                    (baseUrls.size() != size && baseUrls.size() != 1)) {
-                // If either of these arrays are empty/incorrectly sized, ignore
-                // them.
-                htmls = null;
-                baseUrls = null;
-            }
-            mVoiceSearchData = new VoiceSearchData(results, urls, htmls,
-                    baseUrls);
-            mVoiceSearchData.mHeaders = intent.getParcelableArrayListExtra(
-                    RecognizerResultsIntent
-                    .EXTRA_VOICE_SEARCH_RESULT_HTTP_HEADERS);
-            mVoiceSearchData.mSourceIsGoogle = intent.getBooleanExtra(
-                    VoiceSearchData.SOURCE_IS_GOOGLE, false);
-            mVoiceSearchData.mVoiceSearchIntent = new Intent(intent);
-        }
-        String extraData = intent.getStringExtra(
-                SearchManager.EXTRA_DATA_KEY);
-        if (extraData != null) {
-            index = Integer.parseInt(extraData);
-            if (index >= mVoiceSearchData.mVoiceSearchResults.size()) {
-                throw new AssertionError("index must be less than "
-                        + "size of mVoiceSearchResults");
-            }
-            if (mVoiceSearchData.mSourceIsGoogle) {
-                Intent logIntent = new Intent(
-                        LoggingEvents.ACTION_LOG_EVENT);
-                logIntent.putExtra(LoggingEvents.EXTRA_EVENT,
-                        LoggingEvents.VoiceSearch.N_BEST_CHOOSE);
-                logIntent.putExtra(
-                        LoggingEvents.VoiceSearch.EXTRA_N_BEST_CHOOSE_INDEX,
-                        index);
-                mContext.sendBroadcast(logIntent);
-            }
-            if (mVoiceSearchData.mVoiceSearchIntent != null) {
-                // Copy the Intent, so that each history item will have its own
-                // Intent, with different (or none) extra data.
-                Intent latest = new Intent(mVoiceSearchData.mVoiceSearchIntent);
-                latest.putExtra(SearchManager.EXTRA_DATA_KEY, extraData);
-                mVoiceSearchData.mVoiceSearchIntent = latest;
-            }
-        }
-        mVoiceSearchData.mLastVoiceSearchTitle
-                = mVoiceSearchData.mVoiceSearchResults.get(index);
-        if (mInForeground) {
-            mWebViewController.activateVoiceSearchMode(
-                    mVoiceSearchData.mLastVoiceSearchTitle,
-                    mVoiceSearchData.mVoiceSearchResults);
-        }
-        if (mVoiceSearchData.mVoiceSearchHtmls != null) {
-            // When index was found it was already ensured that it was valid
-            String uriString = mVoiceSearchData.mVoiceSearchHtmls.get(index);
-            if (uriString != null) {
-                Uri dataUri = Uri.parse(uriString);
-                if (RecognizerResultsIntent.URI_SCHEME_INLINE.equals(
-                        dataUri.getScheme())) {
-                    // If there is only one base URL, use it.  If there are
-                    // more, there will be one for each index, so use the base
-                    // URL corresponding to the index.
-                    String baseUrl = mVoiceSearchData.mVoiceSearchBaseUrls.get(
-                            mVoiceSearchData.mVoiceSearchBaseUrls.size() > 1 ?
-                            index : 0);
-                    mVoiceSearchData.mLastVoiceSearchUrl = baseUrl;
-                    mMainView.loadDataWithBaseURL(baseUrl,
-                            uriString.substring(RecognizerResultsIntent
-                            .URI_SCHEME_INLINE.length() + 1), "text/html",
-                            "utf-8", baseUrl);
-                    return;
-                }
-            }
-        }
-        mVoiceSearchData.mLastVoiceSearchUrl
-                = mVoiceSearchData.mVoiceSearchUrls.get(index);
-        if (null == mVoiceSearchData.mLastVoiceSearchUrl) {
-            mVoiceSearchData.mLastVoiceSearchUrl = UrlUtils.smartUrlFilter(
-                    mVoiceSearchData.mLastVoiceSearchTitle);
-        }
-        Map<String, String> headers = null;
-        if (mVoiceSearchData.mHeaders != null) {
-            int bundleIndex = mVoiceSearchData.mHeaders.size() == 1 ? 0
-                    : index;
-            Bundle bundle = mVoiceSearchData.mHeaders.get(bundleIndex);
-            if (bundle != null && !bundle.isEmpty()) {
-                Iterator<String> iter = bundle.keySet().iterator();
-                headers = new HashMap<String, String>();
-                while (iter.hasNext()) {
-                    String key = iter.next();
-                    headers.put(key, bundle.getString(key));
-                }
-            }
-        }
-        mMainView.loadUrl(mVoiceSearchData.mLastVoiceSearchUrl, headers);
-    }
-    /* package */ static class VoiceSearchData {
-        public VoiceSearchData(ArrayList<String> results,
-                ArrayList<String> urls, ArrayList<String> htmls,
-                ArrayList<String> baseUrls) {
-            mVoiceSearchResults = results;
-            mVoiceSearchUrls = urls;
-            mVoiceSearchHtmls = htmls;
-            mVoiceSearchBaseUrls = baseUrls;
-        }
-        /*
-         * ArrayList of suggestions to be displayed when opening the
-         * SearchManager
-         */
-        public ArrayList<String> mVoiceSearchResults;
-        /*
-         * ArrayList of urls, associated with the suggestions in
-         * mVoiceSearchResults.
-         */
-        public ArrayList<String> mVoiceSearchUrls;
-        /*
-         * ArrayList holding content to load for each item in
-         * mVoiceSearchResults.
-         */
-        public ArrayList<String> mVoiceSearchHtmls;
-        /*
-         * ArrayList holding base urls for the items in mVoiceSearchResults.
-         * If non null, this will either have the same size as
-         * mVoiceSearchResults or have a size of 1, in which case all will use
-         * the same base url
-         */
-        public ArrayList<String> mVoiceSearchBaseUrls;
-        /*
-         * The last url provided by voice search.  Used for comparison to see if
-         * we are going to a page by some method besides voice search.
-         */
-        public String mLastVoiceSearchUrl;
-        /**
-         * The last title used for voice search.  Needed to update the title bar
-         * when switching tabs.
-         */
-        public String mLastVoiceSearchTitle;
-        /**
-         * Whether the Intent which turned on voice search mode contained the
-         * String signifying that Google was the source.
-         */
-        public boolean mSourceIsGoogle;
-        /**
-         * List of headers to be passed into the WebView containing location
-         * information
-         */
-        public ArrayList<Bundle> mHeaders;
-        /**
-         * The Intent used to invoke voice search.  Placed on the
-         * WebHistoryItem so that when coming back to a previous voice search
-         * page we can again activate voice search.
-         */
-        public Intent mVoiceSearchIntent;
-        /**
-         * String used to identify Google as the source of voice search.
-         */
-        public static String SOURCE_IS_GOOGLE
-                = "android.speech.extras.SOURCE_IS_GOOGLE";
-    }
-
     // Container class for the next error dialog that needs to be displayed
     private class ErrorDialog {
         public final int mTitle;
@@ -573,16 +338,6 @@
             mCurrentState = new PageState(mContext,
                     view.isPrivateBrowsingEnabled(), url, favicon);
             mLoadStartTime = SystemClock.uptimeMillis();
-            if (mVoiceSearchData != null
-                    && providersDiffer(url, mVoiceSearchData.mLastVoiceSearchUrl)) {
-                if (mVoiceSearchData.mSourceIsGoogle) {
-                    Intent i = new Intent(LoggingEvents.ACTION_LOG_EVENT);
-                    i.putExtra(LoggingEvents.EXTRA_FLUSH, true);
-                    mContext.sendBroadcast(i);
-                }
-                revertVoiceSearchMode();
-            }
-
 
             // If we start a touch icon load and then load a new page, we don't
             // want to cancel the current touch icon loader. But, we do want to
@@ -626,18 +381,6 @@
         // return true if want to hijack the url to let another app to handle it
         @Override
         public boolean shouldOverrideUrlLoading(WebView view, String url) {
-            if (voiceSearchSourceIsGoogle()) {
-                // This method is called when the user clicks on a link.
-                // VoiceSearchMode is turned off when the user leaves the
-                // Google results page, so at this point the user must be on
-                // that page.  If the user clicked a link on that page, assume
-                // that the voice search was effective, and broadcast an Intent
-                // so a receiver can take note of that fact.
-                Intent logIntent = new Intent(LoggingEvents.ACTION_LOG_EVENT);
-                logIntent.putExtra(LoggingEvents.EXTRA_EVENT,
-                        LoggingEvents.VoiceSearch.RESULT_CLICKED);
-                mContext.sendBroadcast(logIntent);
-            }
             if (mInForeground) {
                 return mWebViewController.shouldOverrideUrlLoading(Tab.this,
                         view, url);
@@ -1420,9 +1163,6 @@
         mWebBackForwardListClient = new WebBackForwardListClient() {
             @Override
             public void onNewHistoryItem(WebHistoryItem item) {
-                if (isInVoiceSearchMode()) {
-                    item.setCustomData(mVoiceSearchData.mVoiceSearchIntent);
-                }
                 if (mClearHistoryUrlPattern != null) {
                     boolean match =
                         mClearHistoryUrlPattern.matcher(item.getOriginalUrl()).matches();
@@ -1439,13 +1179,6 @@
                     mClearHistoryUrlPattern = null;
                 }
             }
-            @Override
-            public void onIndexChanged(WebHistoryItem item, int index) {
-                Object data = item.getCustomData();
-                if (data != null && data instanceof Intent) {
-                    activateVoiceSearchMode((Intent) data);
-                }
-            }
         };
 
         mCaptureWidth = mContext.getResources().getDimensionPixelSize(
diff --git a/src/com/android/browser/UI.java b/src/com/android/browser/UI.java
index 034f136..aeab746 100644
--- a/src/com/android/browser/UI.java
+++ b/src/com/android/browser/UI.java
@@ -93,10 +93,6 @@
 
     public boolean isCustomViewShowing();
 
-    public void showVoiceTitleBar(String title, List<String> results);
-
-    public void revertVoiceTitleBar(Tab tab);
-
     public boolean onPrepareOptionsMenu(Menu menu);
 
     public void updateMenuState(Tab tab, Menu menu);
diff --git a/src/com/android/browser/UiController.java b/src/com/android/browser/UiController.java
index 46c0432..5be2343 100644
--- a/src/com/android/browser/UiController.java
+++ b/src/com/android/browser/UiController.java
@@ -67,12 +67,6 @@
 
     void bookmarkCurrentPage();
 
-    void startVoiceSearch();
-
-    boolean supportsVoiceSearch();
-
-    void showVoiceSearchResults(String title);
-
     void editUrl();
 
     void handleNewIntent(Intent intent);
diff --git a/src/com/android/browser/UrlInputView.java b/src/com/android/browser/UrlInputView.java
index 1ba26fe..02bba3c 100644
--- a/src/com/android/browser/UrlInputView.java
+++ b/src/com/android/browser/UrlInputView.java
@@ -55,7 +55,6 @@
 
     static final String TYPED = "browser-type";
     static final String SUGGESTED = "browser-suggest";
-    static final String VOICE = "voice-search";
 
     static final int POST_DELAY = 100;
 
@@ -195,10 +194,6 @@
         return mState;
     }
 
-    void setVoiceResults(List<String> voiceResults) {
-        mAdapter.setVoiceResults(voiceResults);
-    }
-
     @Override
     protected void onConfigurationChanged(Configuration config) {
         super.onConfigurationChanged(config);
@@ -298,8 +293,7 @@
 
     @Override
     public void onSelect(String url, int type, String extra) {
-        finishInput(url, extra, (type == SuggestionsAdapter.TYPE_VOICE_SEARCH)
-                ? VOICE : SUGGESTED);
+        finishInput(url, extra, SUGGESTED);
     }
 
     @Override
diff --git a/src/com/android/browser/WebViewController.java b/src/com/android/browser/WebViewController.java
index 235fe97..fef6964 100644
--- a/src/com/android/browser/WebViewController.java
+++ b/src/com/android/browser/WebViewController.java
@@ -89,10 +89,6 @@
 
     void onUserCanceledSsl(Tab tab);
 
-    void activateVoiceSearchMode(String title, List<String> results);
-
-    void revertVoiceSearchMode(Tab tab);
-
     boolean shouldShowErrorConsole();
 
     void onUpdatedSecurityState(Tab tab);
diff --git a/src/com/android/browser/XLargeUi.java b/src/com/android/browser/XLargeUi.java
index 8e874e9..3b8245a 100644
--- a/src/com/android/browser/XLargeUi.java
+++ b/src/com/android/browser/XLargeUi.java
@@ -156,11 +156,6 @@
             return;
         }
         mTabBar.onSetActiveTab(tab);
-        if (tab.isInVoiceSearchMode()) {
-            showVoiceTitleBar(tab.getVoiceDisplayTitle(), tab.getVoiceSearchResults());
-        } else {
-            revertVoiceTitleBar(tab);
-        }
         updateLockIconToLatest(tab);
         mTitleBar.setSkipTitleBarAnimations(false);
     }
diff --git a/src/com/android/browser/provider/BrowserProvider.java b/src/com/android/browser/provider/BrowserProvider.java
index b55b84a..744032c 100644
--- a/src/com/android/browser/provider/BrowserProvider.java
+++ b/src/com/android/browser/provider/BrowserProvider.java
@@ -16,10 +16,6 @@
 
 package com.android.browser.provider;
 
-import com.android.browser.BrowserSettings;
-import com.android.browser.R;
-import com.android.browser.search.SearchEngine;
-
 import android.app.SearchManager;
 import android.app.backup.BackupManager;
 import android.content.ContentProvider;
@@ -42,14 +38,16 @@
 import android.preference.PreferenceManager;
 import android.provider.Browser;
 import android.provider.Browser.BookmarkColumns;
-import android.speech.RecognizerResultsIntent;
 import android.text.TextUtils;
 import android.util.Log;
 import android.util.Patterns;
 
+import com.android.browser.BrowserSettings;
+import com.android.browser.R;
+import com.android.browser.search.SearchEngine;
+
 import java.io.File;
 import java.io.FilenameFilter;
-import java.util.ArrayList;
 import java.util.Date;
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
@@ -751,105 +749,6 @@
 
     }
 
-    private static class ResultsCursor extends AbstractCursor {
-        // Array indices for RESULTS_COLUMNS
-        private static final int RESULT_ACTION_ID = 1;
-        private static final int RESULT_DATA_ID = 2;
-        private static final int RESULT_TEXT_ID = 3;
-        private static final int RESULT_ICON_ID = 4;
-        private static final int RESULT_EXTRA_ID = 5;
-
-        private static final String[] RESULTS_COLUMNS = new String[] {
-                "_id",
-                SearchManager.SUGGEST_COLUMN_INTENT_ACTION,
-                SearchManager.SUGGEST_COLUMN_INTENT_DATA,
-                SearchManager.SUGGEST_COLUMN_TEXT_1,
-                SearchManager.SUGGEST_COLUMN_ICON_1,
-                SearchManager.SUGGEST_COLUMN_INTENT_EXTRA_DATA
-        };
-        private final ArrayList<String> mResults;
-        public ResultsCursor(ArrayList<String> results) {
-            mResults = results;
-        }
-        @Override
-        public int getCount() { return mResults.size(); }
-
-        @Override
-        public String[] getColumnNames() {
-            return RESULTS_COLUMNS;
-        }
-
-        @Override
-        public String getString(int column) {
-            switch (column) {
-                case RESULT_ACTION_ID:
-                    return RecognizerResultsIntent.ACTION_VOICE_SEARCH_RESULTS;
-                case RESULT_TEXT_ID:
-                // The data is used when the phone is in landscape mode.  We
-                // still want to show the result string.
-                case RESULT_DATA_ID:
-                    return mResults.get(mPos);
-                case RESULT_EXTRA_ID:
-                    // The Intent's extra data will store the index into
-                    // mResults so the BrowserActivity will know which result to
-                    // use.
-                    return Integer.toString(mPos);
-                case RESULT_ICON_ID:
-                    return Integer.valueOf(R.drawable.magnifying_glass)
-                            .toString();
-                default:
-                    return null;
-            }
-        }
-        @Override
-        public short getShort(int column) {
-            throw new UnsupportedOperationException();
-        }
-        @Override
-        public int getInt(int column) {
-            throw new UnsupportedOperationException();
-        }
-        @Override
-        public long getLong(int column) {
-            if ((mPos != -1) && column == 0) {
-                return mPos;        // use row# as the _id
-            }
-            throw new UnsupportedOperationException();
-        }
-        @Override
-        public float getFloat(int column) {
-            throw new UnsupportedOperationException();
-        }
-        @Override
-        public double getDouble(int column) {
-            throw new UnsupportedOperationException();
-        }
-        @Override
-        public boolean isNull(int column) {
-            throw new UnsupportedOperationException();
-        }
-    }
-
-    /** Contains custom suggestions results set by the UI */
-    private ResultsCursor mResultsCursor;
-    /** Locks access to {@link #mResultsCursor} */
-    private Object mResultsCursorLock = new Object();
-
-    /**
-     * Provide a set of results to be returned to query, intended to be used
-     * by the SearchDialog when the BrowserActivity is in voice search mode.
-     * @param results Strings to display in the dropdown from the SearchDialog
-     */
-    public /* package */ void setQueryResults(ArrayList<String> results) {
-        synchronized (mResultsCursorLock) {
-            if (results == null) {
-                mResultsCursor = null;
-            } else {
-                mResultsCursor = new ResultsCursor(results);
-            }
-        }
-    }
-
     @Override
     public Cursor query(Uri url, String[] projectionIn, String selection,
             String[] selectionArgs, String sortOrder)
@@ -859,15 +758,6 @@
             throw new IllegalArgumentException("Unknown URL");
         }
 
-        // If results for the suggestion are already ready just return them directly
-        synchronized (mResultsCursorLock) {
-            if (match == URI_MATCH_SUGGEST && mResultsCursor != null) {
-                Cursor results = mResultsCursor;
-                mResultsCursor = null;
-                return results;
-            }
-        }
-
         if (match == URI_MATCH_SUGGEST || match == URI_MATCH_BOOKMARKS_SUGGEST) {
             // Handle suggestions
             return doSuggestQuery(selection, selectionArgs, match == URI_MATCH_BOOKMARKS_SUGGEST);
diff --git a/src/com/android/browser/search/DefaultSearchEngine.java b/src/com/android/browser/search/DefaultSearchEngine.java
index a575404..e4e0e96 100644
--- a/src/com/android/browser/search/DefaultSearchEngine.java
+++ b/src/com/android/browser/search/DefaultSearchEngine.java
@@ -118,10 +118,6 @@
     public void close() {
     }
 
-    public boolean supportsVoiceSearch() {
-        return getName().equals(SearchEngine.GOOGLE);
-    }
-
     @Override
     public String toString() {
         return "ActivitySearchEngine{" + mSearchable + "}";
diff --git a/src/com/android/browser/search/OpenSearchSearchEngine.java b/src/com/android/browser/search/OpenSearchSearchEngine.java
index 50585c0..e600aa9 100644
--- a/src/com/android/browser/search/OpenSearchSearchEngine.java
+++ b/src/com/android/browser/search/OpenSearchSearchEngine.java
@@ -195,10 +195,6 @@
         mHttpClient.close();
     }
 
-    public boolean supportsVoiceSearch() {
-        return getName().equals(SearchEngine.GOOGLE);
-    }
-
     private boolean isNetworkConnected(Context context) {
         NetworkInfo networkInfo = getActiveNetworkInfo(context);
         return networkInfo != null && networkInfo.isConnected();
diff --git a/src/com/android/browser/search/SearchEngine.java b/src/com/android/browser/search/SearchEngine.java
index 3643005..8f2d58d 100644
--- a/src/com/android/browser/search/SearchEngine.java
+++ b/src/com/android/browser/search/SearchEngine.java
@@ -58,11 +58,6 @@
     public void close();
 
     /**
-     * Checks whether this search engine supports voice search.
-     */
-    public boolean supportsVoiceSearch();
-
-    /**
      * Checks whether this search engine should be sent zero char query.
      */
     public boolean wantsEmptyQuery();
