diff --git a/tests/tests/webkit/src/android/webkit/cts/WebHistoryItemTest.java b/tests/tests/webkit/src/android/webkit/cts/WebHistoryItemTest.java
index 016d566..71ba504 100644
--- a/tests/tests/webkit/src/android/webkit/cts/WebHistoryItemTest.java
+++ b/tests/tests/webkit/src/android/webkit/cts/WebHistoryItemTest.java
@@ -104,42 +104,6 @@
         assertTrue(firstId != secondId);
     }
 
-    @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "getOriginalUrl",
-            args = {}
-    )
-    @ToBeFixed(explanation = "History item does not have the original URL set after a redirect.")
-    @BrokenTest(value = "Bug 2121787: Test times out on the host side. Not 100% reproducible.")
-    public void testRedirect() throws InterruptedException {
-        final WebView view = getActivity().getWebView();
-        view.setWebChromeClient(new WebChromeClient());
-        // set the web view client so that redirects are loaded in the WebView itself
-        view.setWebViewClient(new WebViewClient());
-        WebBackForwardList list = view.copyBackForwardList();
-        assertEquals(0, list.getSize());
-
-        String url = mWebServer.getAssetUrl(TestHtmlConstants.HELLO_WORLD_URL);
-        String redirect = mWebServer.getRedirectingAssetUrl(TestHtmlConstants.HELLO_WORLD_URL);
-        assertLoadUrlSuccessfully(view, redirect);
-        // wait for the redirect to take place
-        new DelayedCheck(10000) {
-            @Override
-            protected boolean check() {
-                WebBackForwardList list = view.copyBackForwardList();
-                return list.getSize() >= 1;
-            }
-        }.run();
-        list = view.copyBackForwardList();
-        assertEquals(1, list.getSize());
-        WebHistoryItem item = list.getCurrentItem();
-        assertNotNull(item);
-        assertEquals(url, item.getUrl());
-        assertEquals(TestHtmlConstants.HELLO_WORLD_TITLE, item.getTitle());
-        // To be fixed: item.getOriginalUrl() returns null
-        // assertEquals(redirect, item.getOriginalUrl());
-    }
-
     private void assertLoadUrlSuccessfully(final WebView view, String url) {
         view.loadUrl(url);
         // wait for the page load to complete
diff --git a/tests/tests/webkit/src/android/webkit/cts/WebIconDatabaseTest.java b/tests/tests/webkit/src/android/webkit/cts/WebIconDatabaseTest.java
deleted file mode 100644
index 64b5204..0000000
--- a/tests/tests/webkit/src/android/webkit/cts/WebIconDatabaseTest.java
+++ /dev/null
@@ -1,262 +0,0 @@
-/*
- * Copyright (C) 2009 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 android.webkit.cts;
-
-import dalvik.annotation.BrokenTest;
-import dalvik.annotation.TestLevel;
-import dalvik.annotation.TestTargetClass;
-import dalvik.annotation.TestTargetNew;
-import dalvik.annotation.TestTargets;
-
-import android.graphics.Bitmap;
-import android.test.ActivityInstrumentationTestCase2;
-import android.test.UiThreadTest;
-import android.view.animation.cts.DelayedCheck;
-import android.webkit.WebIconDatabase;
-import android.webkit.WebView;
-
-import java.io.File;
-
-@TestTargetClass(android.webkit.WebIconDatabase.class)
-public class WebIconDatabaseTest extends
-                 ActivityInstrumentationTestCase2<WebViewStubActivity> {
-    private static final long ICON_FETCH_TIMEOUT = 15000;
-    private static final String DATA_FOLDER = "/webkittest/";
-    private String mFilePath;
-    private WebView mWebView;
-    private CtsTestServer mWebServer;
-
-    /**
-     * Instantiates a new text view test.
-     */
-    public WebIconDatabaseTest() {
-        super("com.android.cts.stub", WebViewStubActivity.class);
-    }
-
-    @Override
-    protected void setUp() throws Exception {
-        super.setUp();
-        WebViewStubActivity activity = (WebViewStubActivity) getActivity();
-        mFilePath = activity.getFilesDir().toString() + DATA_FOLDER;
-        clearDatabasePath();
-
-        mWebView = activity.getWebView();
-        mWebView.clearCache(true);
-    }
-
-    @Override
-    protected void tearDown() throws Exception {
-        clearDatabasePath();
-        if (mWebServer != null) {
-            mWebServer.shutdown();
-        }
-        super.tearDown();
-    }
-
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "open",
-            args = {String.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "close",
-            args = {}
-        )
-    })
-    @BrokenTest(value="intermittently fails bug 2250024")
-    public void testOpen() {
-        final WebIconDatabase webIconDatabase = WebIconDatabase.getInstance();
-
-        final File path = new File(mFilePath);
-        // To assure no files under the directory
-        assertNull(path.listFiles());
-        // open() should create and open database file for storing icon related datum.
-        webIconDatabase.open(mFilePath);
-
-        // Need to wait for a moment, let the internal Handler complete the operation
-        new DelayedCheck(10000) {
-            @Override
-            protected boolean check() {
-                return path.listFiles() != null;
-            }
-        }.run();
-
-        assertTrue(path.listFiles().length > 0);
-
-        webIconDatabase.close();
-    }
-
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "getInstance",
-        args = {}
-    )
-    @UiThreadTest
-    public void testGetInstance() {
-        WebIconDatabase webIconDatabase1 = WebIconDatabase.getInstance();
-        WebIconDatabase webIconDatabase2 = WebIconDatabase.getInstance();
-
-        assertSame(webIconDatabase1, webIconDatabase2);
-    }
-
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "retainIconForPageUrl",
-            args = {String.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "requestIconForPageUrl",
-            args = {String.class, WebIconDatabase.IconListener.class}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "releaseIconForPageUrl",
-            args = {String.class}
-        )
-    })
-    @BrokenTest(value="intermittently fails bug 2250024")
-    public void testRetainIconForPageUrl() throws Exception {
-        final WebIconDatabase webIconDatabase = WebIconDatabase.getInstance();
-        webIconDatabase.open(mFilePath);
-
-        mWebServer = new CtsTestServer(getActivity());
-        String url = mWebServer.getAssetUrl(TestHtmlConstants.HELLO_WORLD_URL);
-        assertLoadUrlSuccessfully(mWebView, url);
-
-        MyIconListener listener = new MyIconListener();
-
-        webIconDatabase.retainIconForPageUrl(url);
-
-        webIconDatabase.requestIconForPageUrl(url, listener);
-
-        listener.waitForIcon(ICON_FETCH_TIMEOUT);
-        assertTrue(listener.hasReceivedStatus());
-        assertNotNull(listener.getIcon());
-
-        // release the icon.
-        webIconDatabase.releaseIconForPageUrl(url);
-
-        listener = new MyIconListener();
-        webIconDatabase.requestIconForPageUrl(url, listener);
-
-        listener.waitForIcon(ICON_FETCH_TIMEOUT);
-
-        assertTrue(listener.hasReceivedStatus());
-        assertNotNull(listener.getIcon());
-
-        webIconDatabase.close();
-    }
-
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
-        method = "removeAllIcons",
-        args = {}
-    )
-    @BrokenTest(value="intermittently fails bug 2250024")
-    public void testRemoveAllIcons() throws Exception {
-        final WebIconDatabase webIconDatabase = WebIconDatabase.getInstance();
-        webIconDatabase.open(mFilePath);
-
-        mWebServer = new CtsTestServer(getActivity());
-        String url = mWebServer.getAssetUrl(TestHtmlConstants.HELLO_WORLD_URL);
-        assertLoadUrlSuccessfully(mWebView, url);
-
-        MyIconListener listener = new MyIconListener();
-
-        webIconDatabase.retainIconForPageUrl(url);
-
-        webIconDatabase.requestIconForPageUrl(url, listener);
-
-        listener.waitForIcon(ICON_FETCH_TIMEOUT);
-        assertTrue(listener.hasReceivedStatus());
-        assertNotNull(listener.getIcon());
-
-        // remove all icons.
-        webIconDatabase.removeAllIcons();
-        
-        listener = new MyIconListener();
-        webIconDatabase.requestIconForPageUrl(url, listener);
-
-        listener.waitForIcon(ICON_FETCH_TIMEOUT);
-
-        assertFalse(listener.hasReceivedStatus());
-        assertNull(listener.getIcon());
-
-        webIconDatabase.close();
-    }
-
-    private static class MyIconListener implements WebIconDatabase.IconListener {
-        private Bitmap mIcon;
-        private String mUrl;
-        private boolean mHasReceivedIcon = false;
-
-        public synchronized void onReceivedIcon(String url, Bitmap icon) {
-            mHasReceivedIcon = true;
-            mIcon = icon;
-            mUrl = url;
-            notifyAll();
-        }
-
-        public synchronized void waitForIcon(long timeout) throws InterruptedException {
-            if (!mHasReceivedIcon) {
-                wait(timeout);
-            }
-        }
-
-        public boolean hasReceivedStatus() {
-            return mHasReceivedIcon;
-        }
-
-        public Bitmap getIcon() {
-            return mIcon;
-        }
-
-        public String getUrl() {
-            return mUrl;
-        }
-    }
-
-    private void clearDatabasePath() throws InterruptedException {
-        File path = new File(mFilePath);
-        if (path.exists()) {
-            // FIXME: WebIconDatabase.close() is asynchronous, so some files may still be in use
-            // after we return. Wait some time for the files to be closed.
-            Thread.sleep(1000);
-            File[] files = path.listFiles();
-            if (files != null) {
-                for (int i = 0; i < files.length; i++) {
-                    assertTrue(files[i].delete());
-                }
-            }
-            path.delete();
-        }
-    }
-
-    private void assertLoadUrlSuccessfully(final WebView view, String url) {
-        view.loadUrl(url);
-        new DelayedCheck(10000) {
-            @Override
-            protected boolean check() {
-                return view.getProgress() == 100;
-            }
-        }.run();
-    }
-}
diff --git a/tests/tests/webkit/src/android/webkit/cts/WebViewTest.java b/tests/tests/webkit/src/android/webkit/cts/WebViewTest.java
index b9d054f..b29cc84 100644
--- a/tests/tests/webkit/src/android/webkit/cts/WebViewTest.java
+++ b/tests/tests/webkit/src/android/webkit/cts/WebViewTest.java
@@ -1352,39 +1352,6 @@
 
     @TestTargetNew(
         level = TestLevel.COMPLETE,
-        method = "clearFormData",
-        args = {}
-    )
-    @BrokenTest(value = "Causes the process to crash some time after test completion.")
-    public void testClearFormData() throws Throwable {
-        String form = "<form><input type=\"text\" name=\"testClearFormData\"></form>";
-        mWebView.loadData("<html><body>" + form + "</body></html>", "text/html", "UTF-8");
-        waitForLoadComplete(mWebView, TEST_TIMEOUT);
-        moveFocusDown();
-        getInstrumentation().sendStringSync("test");
-        sendKeys(KeyEvent.KEYCODE_ENTER);
-
-        mWebView.reload();
-        waitForLoadComplete(mWebView, TEST_TIMEOUT);
-        moveFocusDown();
-        View input = mWebView.findFocus();
-        assertTrue(input instanceof AutoCompleteTextView);
-        getInstrumentation().sendStringSync("te");
-        assertTrue(((AutoCompleteTextView) input).isPopupShowing());
-
-        mWebView.reload();
-        waitForLoadComplete(mWebView, TEST_TIMEOUT);
-        moveFocusDown();
-        mWebView.clearFormData();
-        // no auto completion choice after clearing
-        input = mWebView.findFocus();
-        assertTrue(input instanceof AutoCompleteTextView);
-        getInstrumentation().sendStringSync("te");
-        assertFalse(((AutoCompleteTextView) input).isPopupShowing());
-    }
-
-    @TestTargetNew(
-        level = TestLevel.COMPLETE,
         method = "getHitTestResult",
         args = {}
     )
@@ -1669,42 +1636,6 @@
         mWebView.clearSslPreferences();
     }
 
-    @TestTargets({
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "pauseTimers",
-            args = {}
-        ),
-        @TestTargetNew(
-            level = TestLevel.COMPLETE,
-            method = "resumeTimers",
-            args = {}
-        )
-    })
-    @ToBeFixed(explanation = "WebView.pauseTimers() does not pause javascript timers")
-    @BrokenTest(value = "Frequently crashes the process some time after test completion.")
-    public void testPauseTimers() throws Exception {
-        WebSettings settings = mWebView.getSettings();
-        settings.setJavaScriptEnabled(true);
-        startWebServer(false);
-        // load a page which increments the number in its title every second
-        String url = mWebServer.getAssetUrl(TestHtmlConstants.TEST_TIMER_URL);
-        assertLoadUrlSuccessfully(mWebView, url);
-        int counter = Integer.parseInt(mWebView.getTitle());
-        Thread.sleep(2000);
-        assertTrue(Integer.parseInt(mWebView.getTitle()) > counter);
-        mWebView.pauseTimers();
-        Thread.sleep(2000); // give the implementation time to stop the timer
-        counter = Integer.parseInt(mWebView.getTitle());
-        Thread.sleep(2000);
-        // ToBeFixed: Uncomment the following line once pauseTimers() is fixed
-        // assertEquals(counter, Integer.parseInt(mWebView.getTitle()));
-        mWebView.resumeTimers();
-        Thread.sleep(2000);
-        assertTrue(Integer.parseInt(mWebView.getTitle()) > counter);
-    }
-
-
     @TestTargetNew(
         level = TestLevel.COMPLETE,
         method = "requestChildRectangleOnScreen",
