diff --git a/src/com/android/browser/BrowserSettings.java b/src/com/android/browser/BrowserSettings.java
index 101effa..3aef08f 100644
--- a/src/com/android/browser/BrowserSettings.java
+++ b/src/com/android/browser/BrowserSettings.java
@@ -83,6 +83,11 @@
             HONEYCOMB_USERAGENT,
     };
 
+    // The minimum min font size
+    // Aka, the lower bounds for the min font size range
+    // which is 1:5..24
+    private static final int MIN_FONT_SIZE_OFFSET = 5;
+
     private static BrowserSettings sInstance;
 
     private Context mContext;
@@ -423,7 +428,12 @@
     }
 
     public int getMinimumFontSize() {
-        return mPrefs.getInt(PREF_MIN_FONT_SIZE, 1);
+        int minFont = mPrefs.getInt(PREF_MIN_FONT_SIZE, 0);
+        minFont++; // Preference starts at 0, min font at 1
+        if (minFont > 1) {
+            minFont += MIN_FONT_SIZE_OFFSET;
+        }
+        return minFont;
     }
 
     public boolean forceEnableUserScalable() {
diff --git a/src/com/android/browser/preferences/AccessibilityPreferencesFragment.java b/src/com/android/browser/preferences/AccessibilityPreferencesFragment.java
index 99bd687..d083f43 100644
--- a/src/com/android/browser/preferences/AccessibilityPreferencesFragment.java
+++ b/src/com/android/browser/preferences/AccessibilityPreferencesFragment.java
@@ -43,7 +43,6 @@
     @Override
     public void onViewCreated(View view, Bundle savedInstanceState) {
         super.onViewCreated(view, savedInstanceState);
-        getListView().setItemsCanFocus(true);
     }
 
     @Override
diff --git a/src/com/android/browser/preferences/FontSizePreference.java b/src/com/android/browser/preferences/FontSizePreference.java
new file mode 100644
index 0000000..266a584
--- /dev/null
+++ b/src/com/android/browser/preferences/FontSizePreference.java
@@ -0,0 +1,49 @@
+/*
+ * Copyright (C) 2011 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.preferences;
+
+import android.content.Context;
+import android.preference.SeekBarPreference;
+import android.util.AttributeSet;
+import android.widget.SeekBar;
+
+public class FontSizePreference extends SeekBarPreference {
+
+    public FontSizePreference(
+            Context context, AttributeSet attrs, int defStyle) {
+        super(context, attrs, defStyle);
+    }
+
+    public FontSizePreference(Context context, AttributeSet attrs) {
+        super(context, attrs);
+    }
+
+    public FontSizePreference(Context context) {
+        super(context);
+    }
+
+    @Override
+    public void onStartTrackingTouch(SeekBar seekBar) {
+        // Intentionally blank - prevent super.onStartTrackingTouch from running
+    }
+
+    @Override
+    public void onStopTrackingTouch(SeekBar seekBar) {
+        // Intentionally blank - prevent onStopTrackingTouch from running
+    }
+
+}
diff --git a/src/com/android/browser/preferences/MinFontSizePreference.java b/src/com/android/browser/preferences/MinFontSizePreference.java
deleted file mode 100644
index 22092b0..0000000
--- a/src/com/android/browser/preferences/MinFontSizePreference.java
+++ /dev/null
@@ -1,170 +0,0 @@
-/*
- * Copyright (C) 2011 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.preferences;
-
-import com.android.browser.R;
-
-import android.content.Context;
-import android.os.Parcel;
-import android.os.Parcelable;
-import android.preference.Preference;
-import android.util.AttributeSet;
-import android.view.LayoutInflater;
-import android.view.View;
-import android.view.ViewGroup;
-import android.widget.SeekBar;
-import android.widget.SeekBar.OnSeekBarChangeListener;
-
-public class MinFontSizePreference extends Preference implements OnSeekBarChangeListener {
-
-    // range from 1:6..24
-    static final int MIN = 5;
-    static final int MAX = 23;
-    private int mProgress;
-    View mRoot;
-
-    public MinFontSizePreference(
-            Context context, AttributeSet attrs, int defStyle) {
-        super(context, attrs, defStyle);
-    }
-
-    public MinFontSizePreference(Context context, AttributeSet attrs) {
-        super(context, attrs);
-    }
-
-    public MinFontSizePreference(Context context) {
-        super(context);
-    }
-
-    @Override
-    public View getView(View convertView, ViewGroup parent) {
-        if (mRoot == null) {
-            LayoutInflater inflater = LayoutInflater.from(getContext());
-            mRoot = inflater.inflate(R.layout.min_font_size, parent, false);
-            SeekBar seek = (SeekBar) mRoot.findViewById(R.id.seekbar);
-            seek.setMax((MAX - MIN));
-            seek.setProgress(mProgress);
-            seek.setOnSeekBarChangeListener(this);
-        }
-        return mRoot;
-    }
-
-    @Override
-    protected void onSetInitialValue(boolean restoreValue, Object defaultValue) {
-        mProgress = restoreValue ? getPersistedInt(mProgress)
-                : (Integer) defaultValue;
-        mProgress -= 1;
-    }
-
-    @Override
-    public void onProgressChanged(
-            SeekBar seekBar, int progress, boolean fromUser) {
-        if (fromUser) {
-            if (progress == 0) {
-                persistInt(1);
-            } else {
-                persistInt(progress + MIN + 1);
-            }
-        }
-        mRoot.invalidate();
-    }
-
-    @Override
-    public void onStartTrackingTouch(SeekBar seekBar) {
-    }
-
-    @Override
-    public void onStopTrackingTouch(SeekBar seekBar) {
-    }
-
-
-    @Override
-    protected Parcelable onSaveInstanceState() {
-        /*
-         * Suppose a client uses this preference type without persisting. We
-         * must save the instance state so it is able to, for example, survive
-         * orientation changes.
-         */
-
-        final Parcelable superState = super.onSaveInstanceState();
-        if (isPersistent()) {
-            // No need to save instance state since it's persistent
-            return superState;
-        }
-
-        // Save the instance state
-        final SavedState myState = new SavedState(superState);
-        myState.progress = mProgress;
-        return myState;
-    }
-
-    @Override
-    protected void onRestoreInstanceState(Parcelable state) {
-        if (!state.getClass().equals(SavedState.class)) {
-            // Didn't save state for us in onSaveInstanceState
-            super.onRestoreInstanceState(state);
-            return;
-        }
-
-        // Restore the instance state
-        SavedState myState = (SavedState) state;
-        super.onRestoreInstanceState(myState.getSuperState());
-        mProgress = myState.progress;
-        notifyChanged();
-    }
-
-    /**
-     * SavedState, a subclass of {@link BaseSavedState}, will store the state
-     * of MyPreference, a subclass of Preference.
-     * <p>
-     * It is important to always call through to super methods.
-     */
-    private static class SavedState extends BaseSavedState {
-        int progress;
-
-        public SavedState(Parcel source) {
-            super(source);
-
-            // Restore the click counter
-            progress = source.readInt();
-        }
-
-        @Override
-        public void writeToParcel(Parcel dest, int flags) {
-            super.writeToParcel(dest, flags);
-
-            // Save the click counter
-            dest.writeInt(progress);
-        }
-
-        public SavedState(Parcelable superState) {
-            super(superState);
-        }
-
-        public static final Parcelable.Creator<SavedState> CREATOR =
-                new Parcelable.Creator<SavedState>() {
-            public SavedState createFromParcel(Parcel in) {
-                return new SavedState(in);
-            }
-
-            public SavedState[] newArray(int size) {
-                return new SavedState[size];
-            }
-        };
-    }
-
-}
diff --git a/src/com/android/browser/preferences/WebViewPreview.java b/src/com/android/browser/preferences/WebViewPreview.java
index a269dbd..dca4d19 100644
--- a/src/com/android/browser/preferences/WebViewPreview.java
+++ b/src/com/android/browser/preferences/WebViewPreview.java
@@ -26,7 +26,6 @@
 import android.preference.Preference;
 import android.preference.PreferenceManager;
 import android.util.AttributeSet;
-import android.view.LayoutInflater;
 import android.view.View;
 import android.view.ViewGroup;
 import android.webkit.WebSettings;
@@ -34,11 +33,9 @@
 
 public class WebViewPreview extends Preference implements OnSharedPreferenceChangeListener {
 
-    // 80 char line width limit? Rules are made to be broken.
     static final String HTML_FORMAT = "<html><head><style type=\"text/css\">p { margin: 2px auto;}</style><body><p style=\"font-size: .4em\">%s</p><p style=\"font-size: .7em\">%s</p><p style=\"font-size: 1em\">%s</p><p style=\"font-size: 1.3em\">%s</p><p style=\"font-size: 1.6em\">%s</p></body></html>";
 
-    String HTML;
-    private View mRoot;
+    String mHtml;
     private WebView mWebView;
 
     public WebViewPreview(
@@ -60,7 +57,8 @@
     void init(Context context) {
         Resources res = context.getResources();
         Object[] visualNames = res.getStringArray(R.array.pref_text_size_choices);
-        HTML = String.format(HTML_FORMAT, visualNames);
+        mHtml = String.format(HTML_FORMAT, visualNames);
+        setLayoutResource(R.layout.webview_preview);
     }
 
     void updatePreview() {
@@ -70,19 +68,23 @@
         BrowserSettings bs = BrowserSettings.getInstance();
         ws.setMinimumFontSize(bs.getMinimumFontSize());
         ws.setTextSize(bs.getTextSize());
-        mWebView.loadData(HTML, "text/html", "utf-8");
+        mWebView.loadData(mHtml, "text/html", "utf-8");
     }
 
     @Override
-    public View getView(View convertView, ViewGroup parent) {
-        if (mWebView == null) {
-            LayoutInflater inflater = LayoutInflater.from(getContext());
-            mRoot = inflater.inflate(R.layout.webview_preview, parent, false);
-            mWebView = (WebView) mRoot.findViewById(R.id.webview);
-            mWebView.setLayerType(View.LAYER_TYPE_SOFTWARE, null);
-        }
+    protected View onCreateView(ViewGroup parent) {
+        View root = super.onCreateView(parent);
+        WebView webView = (WebView) root.findViewById(R.id.webview);
+        webView.setFocusable(false);
+        webView.setLayerType(View.LAYER_TYPE_SOFTWARE, null);
+        return root;
+    }
+
+    @Override
+    protected void onBindView(View view) {
+        super.onBindView(view);
+        mWebView = (WebView) view.findViewById(R.id.webview);
         updatePreview();
-        return mRoot;
     }
 
     @Override
