diff --git a/src/com/android/browser/BrowserActivity.java b/src/com/android/browser/BrowserActivity.java
index 084ace0..690e29f 100644
--- a/src/com/android/browser/BrowserActivity.java
+++ b/src/com/android/browser/BrowserActivity.java
@@ -65,24 +65,6 @@
             return;
         }
 
-        BrowserSettings settings = BrowserSettings.getInstance();
-
-        // render the browser in OpenGL
-        if (settings.isHardwareAccelerated()) {
-            // Set the flag in the activity's window
-            this.getWindow().setFlags(WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED,
-                    WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED);
-        } else {
-            // Clear the flag in the activity's window
-            this.getWindow().setFlags(0, WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED);
-        }
-
-        AccessibilityManager accessibilityManager = (AccessibilityManager)
-                getSystemService(ACCESSIBILITY_SERVICE);
-        if (accessibilityManager != null && accessibilityManager.isEnabled()) {
-            setDefaultKeyMode(DEFAULT_KEYS_DISABLE);
-        }
-
         mController = new Controller(this, icicle == null);
         boolean xlarge = isTablet(this);
         if (xlarge) {
diff --git a/src/com/android/browser/BrowserSettings.java b/src/com/android/browser/BrowserSettings.java
index ad42146..d4f1ba3 100644
--- a/src/com/android/browser/BrowserSettings.java
+++ b/src/com/android/browser/BrowserSettings.java
@@ -405,7 +405,6 @@
     }
 
     public boolean isDebugEnabled() {
-        requireInitialization();
         return mPrefs.getBoolean(PREF_DEBUG_MENU, false);
     }
 
diff --git a/src/com/android/browser/Controller.java b/src/com/android/browser/Controller.java
index 24072c9..51bcda2 100644
--- a/src/com/android/browser/Controller.java
+++ b/src/com/android/browser/Controller.java
@@ -87,7 +87,6 @@
 import com.android.common.Search;
 
 import java.io.ByteArrayOutputStream;
-import java.io.File;
 import java.net.URLEncoder;
 import java.util.ArrayList;
 import java.util.Calendar;
@@ -215,20 +214,6 @@
 
     private boolean mBlockEvents;
 
-    private static class ClearThumbnails extends AsyncTask<File, Void, Void> {
-        @Override
-        public Void doInBackground(File... files) {
-            if (files != null) {
-                for (File f : files) {
-                    if (!f.delete()) {
-                        Log.e(LOGTAG, f.getPath() + " was not deleted");
-                    }
-                }
-            }
-            return null;
-        }
-    }
-
     public Controller(Activity browser, boolean preloadCrashState) {
         mActivity = browser;
         mSettings = BrowserSettings.getInstance();
@@ -354,11 +339,6 @@
             // Handle the intent
             mIntentHandler.onNewIntent(intent);
         }
-        // clear up the thumbnail directory, which is no longer used;
-        // ideally this should only be run once after an upgrade from
-        // a previous version of the browser
-        new ClearThumbnails().execute(mTabControl.getThumbnailDir()
-                .listFiles());
         // Read JavaScript flags if it exists.
         String jsFlags = getSettings().getJsEngineFlags();
         if (jsFlags.trim().length() != 0) {
diff --git a/src/com/android/browser/Tab.java b/src/com/android/browser/Tab.java
index abc2467..d7ce29b 100644
--- a/src/com/android/browser/Tab.java
+++ b/src/com/android/browser/Tab.java
@@ -1664,6 +1664,7 @@
 
     void resume() {
         if (mMainView != null) {
+            setupHwAcceleration(mMainView);
             mMainView.onResume();
             if (mSubView != null) {
                 mSubView.onResume();
@@ -1671,6 +1672,16 @@
         }
     }
 
+    private void setupHwAcceleration(View web) {
+        if (web == null) return;
+        BrowserSettings settings = BrowserSettings.getInstance();
+        if (settings.isHardwareAccelerated()) {
+            web.setLayerType(View.LAYER_TYPE_NONE, null);
+        } else {
+            web.setLayerType(View.LAYER_TYPE_SOFTWARE, null);
+        }
+    }
+
     void pause() {
         if (mMainView != null) {
             mMainView.onPause();
diff --git a/src/com/android/browser/TabControl.java b/src/com/android/browser/TabControl.java
index 38a46a8..e99071a 100644
--- a/src/com/android/browser/TabControl.java
+++ b/src/com/android/browser/TabControl.java
@@ -20,7 +20,6 @@
 import android.util.Log;
 import android.webkit.WebView;
 
-import java.io.File;
 import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.List;
@@ -51,7 +50,6 @@
     // the main browser controller
     private final Controller mController;
 
-    private final File mThumbnailDir;
     private OnThumbnailUpdatedListener mOnThumbnailUpdatedListener;
 
     /**
@@ -59,8 +57,6 @@
      */
     TabControl(Controller controller) {
         mController = controller;
-        mThumbnailDir = mController.getActivity()
-                .getDir("thumbnails", 0);
         mMaxTabs = mController.getMaxTabs();
         mTabs = new ArrayList<Tab>(mMaxTabs);
         mTabQueue = new ArrayList<Tab>(mMaxTabs);
@@ -70,10 +66,6 @@
         return sNextId++;
     }
 
-    File getThumbnailDir() {
-        return mThumbnailDir;
-    }
-
     /**
      * Return the current tab's main WebView. This will always return the main
      * WebView for a given tab and not a subwindow.
diff --git a/src/com/android/browser/preferences/DebugPreferencesFragment.java b/src/com/android/browser/preferences/DebugPreferencesFragment.java
index 566eee2..24821d1 100644
--- a/src/com/android/browser/preferences/DebugPreferencesFragment.java
+++ b/src/com/android/browser/preferences/DebugPreferencesFragment.java
@@ -16,21 +16,18 @@
 
 package com.android.browser.preferences;
 
-import com.android.browser.BrowserActivity;
+import android.os.Bundle;
+import android.preference.Preference;
+import android.preference.Preference.OnPreferenceClickListener;
+import android.preference.PreferenceFragment;
+
 import com.android.browser.BrowserSettings;
 import com.android.browser.GoogleAccountLogin;
 import com.android.browser.PreferenceKeys;
 import com.android.browser.R;
 
-import android.content.Intent;
-import android.os.Bundle;
-import android.preference.Preference;
-import android.preference.Preference.OnPreferenceChangeListener;
-import android.preference.Preference.OnPreferenceClickListener;
-import android.preference.PreferenceFragment;
-
 public class DebugPreferencesFragment extends PreferenceFragment
-        implements OnPreferenceChangeListener, OnPreferenceClickListener {
+        implements OnPreferenceClickListener {
     @Override
     public void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
@@ -38,21 +35,11 @@
         // Load the XML preferences file
         addPreferencesFromResource(R.xml.debug_preferences);
 
-        Preference e = findPreference(PreferenceKeys.PREF_ENABLE_HARDWARE_ACCEL);
-        e.setOnPreferenceChangeListener(this);
-        e = findPreference(PreferenceKeys.PREF_RESET_PRELOGIN);
+        Preference e = findPreference(PreferenceKeys.PREF_RESET_PRELOGIN);
         e.setOnPreferenceClickListener(this);
     }
 
     @Override
-    public boolean onPreferenceChange(Preference preference, Object newValue) {
-        // Attempt to restart
-        startActivity(new Intent(BrowserActivity.ACTION_RESTART, null,
-                getActivity(), BrowserActivity.class));
-        return true;
-    }
-
-    @Override
     public boolean onPreferenceClick(Preference preference) {
         if (PreferenceKeys.PREF_RESET_PRELOGIN.equals(preference.getKey())) {
             BrowserSettings.getInstance().getPreferences().edit()
