diff --git a/src/com/android/browser/BrowserHomepagePreference.java b/src/com/android/browser/BrowserHomepagePreference.java
deleted file mode 100644
index cbe5b0d..0000000
--- a/src/com/android/browser/BrowserHomepagePreference.java
+++ /dev/null
@@ -1,132 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.browser;
-
-import android.content.Context;
-import android.content.DialogInterface;
-import android.os.Bundle;
-import android.preference.EditTextPreference;
-import android.util.AttributeSet;
-import android.view.KeyEvent;
-import android.view.LayoutInflater;
-import android.view.View;
-import android.view.View.OnClickListener;
-import android.view.ViewGroup;
-import android.view.Window;
-import android.view.WindowManager;
-import android.view.inputmethod.EditorInfo;
-import android.widget.EditText;
-import android.widget.TextView;
-import android.widget.TextView.OnEditorActionListener;
-
-public class BrowserHomepagePreference extends EditTextPreference
-        implements OnEditorActionListener {
-    private String mCurrentPage;
-
-    public BrowserHomepagePreference(Context context, AttributeSet attrs,
-            int defStyle) {
-        super(context, attrs, defStyle);
-    }
-
-    public BrowserHomepagePreference(Context context, AttributeSet attrs) {
-        super(context, attrs);
-    }
-
-    public BrowserHomepagePreference(Context context) {
-        super(context);
-    }
-
-    @Override
-    protected void onAddEditTextToDialogView(View dialogView,
-            EditText editText) {
-        super.onAddEditTextToDialogView(dialogView, editText);
-        editText.setSelectAllOnFocus(true);
-        editText.setSingleLine(true);
-        editText.setImeActionLabel(null, EditorInfo.IME_ACTION_DONE);
-        editText.setOnEditorActionListener(this);
-        // Now the EditText has a parent.  Add a button to set to the current
-        // page.
-        createButtons((ViewGroup) editText.getParent());
-    }
-
-    @Override
-    public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
-        if (actionId == EditorInfo.IME_ACTION_DONE) {
-            onClick(getDialog(), DialogInterface.BUTTON_POSITIVE);
-            getDialog().dismiss();
-            return true;
-        }
-        return false;
-    }
-
-    void createButtons(ViewGroup parent) {
-        LayoutInflater inflater = (LayoutInflater) getContext()
-                .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
-        View v = inflater.inflate(R.layout.pref_homepage_buttons, parent);
-        v.findViewById(R.id.use_current).setOnClickListener(mOnClick);
-        v.findViewById(R.id.use_default).setOnClickListener(mOnClick);
-    }
-
-    OnClickListener mOnClick = new OnClickListener() {
-        @Override
-        public void onClick(View v) {
-            switch (v.getId()) {
-            case R.id.use_current:
-                getEditText().setText(mCurrentPage);
-                break;
-            case R.id.use_default:
-                getEditText().setText(
-                        BrowserSettings.getFactoryResetHomeUrl(getContext()));
-                break;
-            }
-        }
-    };
-
-    @Override
-    protected void onDialogClosed(boolean positiveResult) {
-        if (positiveResult) {
-            String url = getEditText().getText().toString().trim();
-            if (url.length() > 0) {
-                url = UrlUtils.smartUrlFilter(url);
-            }
-            getEditText().setText(url);
-        }
-        super.onDialogClosed(positiveResult);
-    }
-
-    /**
-     * Set the current page of the browser.
-     * @param currentPage This String will replace the text in the EditText
-     *          when the user clicks the "Use current page" button.
-     */
-    public void setCurrentPage(String currentPage) {
-        mCurrentPage = currentPage;
-    }
-
-    @Override
-    protected void showDialog(Bundle state) {
-        super.showDialog(state);
-        // The dialog has its width set to wrap_content.  Change it to
-        // match_parent so there is more room to type in a url.
-        Window window = getDialog().getWindow();
-        View decorView = window.getDecorView();
-        WindowManager.LayoutParams params
-                = (WindowManager.LayoutParams) decorView.getLayoutParams();
-        params.width = ViewGroup.LayoutParams.MATCH_PARENT;
-        window.getWindowManager().updateViewLayout(decorView, params);
-    }
-}
diff --git a/src/com/android/browser/BrowserSettings.java b/src/com/android/browser/BrowserSettings.java
index fae59e2..4928e61 100644
--- a/src/com/android/browser/BrowserSettings.java
+++ b/src/com/android/browser/BrowserSettings.java
@@ -279,7 +279,7 @@
         }
     }
 
-    static String getFactoryResetHomeUrl(Context context) {
+    public static String getFactoryResetHomeUrl(Context context) {
         String url = context.getResources().getString(R.string.homepage_base);
         if (url.indexOf("{CID}") != -1) {
             url = url.replace("{CID}",
@@ -545,9 +545,6 @@
     // -----------------------------
 
     public String getHomePage() {
-        if (useMostVisitedHomepage()) {
-            return HomeProvider.MOST_VISITED;
-        }
         return mPrefs.getString(PREF_HOMEPAGE, getFactoryResetHomeUrl(mContext));
     }
 
@@ -657,7 +654,7 @@
     }
 
     public boolean useMostVisitedHomepage() {
-        return mPrefs.getBoolean(PREF_USE_MOST_VISITED_HOMEPAGE, false);
+        return HomeProvider.MOST_VISITED.equals(getHomePage());
     }
 
     public boolean useInstantSearch() {
diff --git a/src/com/android/browser/PreferenceKeys.java b/src/com/android/browser/PreferenceKeys.java
index c90213f..bc8d38f 100644
--- a/src/com/android/browser/PreferenceKeys.java
+++ b/src/com/android/browser/PreferenceKeys.java
@@ -76,7 +76,6 @@
     // Keys for lab_preferences.xml
     // ----------------------
     static final String PREF_ENABLE_QUICK_CONTROLS = "enable_quick_controls";
-    static final String PREF_USE_MOST_VISITED_HOMEPAGE = "use_most_visited_homepage";
     static final String PREF_USE_INSTANT_SEARCH = "use_instant_search";
     static final String PREF_FULLSCREEN = "fullscreen";
 
diff --git a/src/com/android/browser/UrlUtils.java b/src/com/android/browser/UrlUtils.java
index ccf9710..26f8e0e 100644
--- a/src/com/android/browser/UrlUtils.java
+++ b/src/com/android/browser/UrlUtils.java
@@ -84,7 +84,7 @@
      * @return Original or modified URL
      *
      */
-    protected static String smartUrlFilter(String url) {
+    public static String smartUrlFilter(String url) {
 
         String inUrl = url.trim();
         boolean hasSpace = inUrl.indexOf(' ') != -1;
diff --git a/src/com/android/browser/preferences/GeneralPreferencesFragment.java b/src/com/android/browser/preferences/GeneralPreferencesFragment.java
index af0fc50..05aa1a7 100644
--- a/src/com/android/browser/preferences/GeneralPreferencesFragment.java
+++ b/src/com/android/browser/preferences/GeneralPreferencesFragment.java
@@ -16,34 +16,65 @@
 
 package com.android.browser.preferences;
 
+import android.app.AlertDialog;
+import android.content.DialogInterface;
+import android.content.DialogInterface.OnClickListener;
+import android.content.res.Resources;
 import android.os.Bundle;
+import android.preference.ListPreference;
 import android.preference.Preference;
 import android.preference.PreferenceFragment;
 import android.preference.PreferenceScreen;
+import android.text.InputType;
+import android.text.TextUtils;
 import android.util.Log;
+import android.view.KeyEvent;
+import android.view.inputmethod.EditorInfo;
+import android.widget.EditText;
+import android.widget.TextView;
+import android.widget.TextView.OnEditorActionListener;
 
-import com.android.browser.BrowserHomepagePreference;
 import com.android.browser.BrowserPreferencesPage;
+import com.android.browser.BrowserSettings;
 import com.android.browser.PreferenceKeys;
 import com.android.browser.R;
+import com.android.browser.UrlUtils;
+import com.android.browser.homepages.HomeProvider;
 
 public class GeneralPreferencesFragment extends PreferenceFragment
         implements Preference.OnPreferenceChangeListener {
+
     static final String TAG = "PersonalPreferencesFragment";
 
+    static final String BLANK_URL = "about:blank";
+    static final String CURRENT = "current";
+    static final String BLANK = "blank";
+    static final String DEFAULT = "default";
+    static final String MOST_VISITED = "most_visited";
+    static final String OTHER = "other";
+
+    static final String PREF_HOMEPAGE_PICKER = "homepage_picker";
+
+    String[] mChoices, mValues;
+    String mCurrentPage;
+
     @Override
     public void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
+        Resources res = getActivity().getResources();
+        mChoices = res.getStringArray(R.array.pref_homepage_choices);
+        mValues = res.getStringArray(R.array.pref_homepage_values);
+        mCurrentPage = getActivity().getIntent()
+                .getStringExtra(BrowserPreferencesPage.CURRENT_PAGE);
 
         // Load the XML preferences file
         addPreferencesFromResource(R.xml.general_preferences);
 
-        Preference e = findPreference(PreferenceKeys.PREF_HOMEPAGE);
-        e.setOnPreferenceChangeListener(this);
-        e.setSummary(getPreferenceScreen().getSharedPreferences()
-                .getString(PreferenceKeys.PREF_HOMEPAGE, null));
-        ((BrowserHomepagePreference) e).setCurrentPage(
-                getActivity().getIntent().getStringExtra(BrowserPreferencesPage.CURRENT_PAGE));
+        ListPreference pref = (ListPreference) findPreference(PREF_HOMEPAGE_PICKER);
+        pref.setSummary(getHomepageSummary());
+        pref.setPersistent(false);
+        pref.setValue(getHomepageValue());
+        pref.setOnPreferenceChangeListener(this);
     }
 
     @Override
@@ -55,12 +86,114 @@
             return false;
         }
 
-        if (pref.getKey().equals(PreferenceKeys.PREF_HOMEPAGE)) {
-            pref.setSummary((String) objValue);
-            return true;
+        if (pref.getKey().equals(PREF_HOMEPAGE_PICKER)) {
+            BrowserSettings settings = BrowserSettings.getInstance();
+            if (CURRENT.equals(objValue)) {
+                settings.setHomePage(mCurrentPage);
+            }
+            if (BLANK.equals(objValue)) {
+                settings.setHomePage(BLANK_URL);
+            }
+            if (DEFAULT.equals(objValue)) {
+                settings.setHomePage(BrowserSettings.getFactoryResetHomeUrl(
+                        getActivity()));
+            }
+            if (MOST_VISITED.equals(objValue)) {
+                settings.setHomePage(HomeProvider.MOST_VISITED);
+            }
+            if (OTHER.equals(objValue)) {
+                promptForHomepage((ListPreference) pref);
+                return false;
+            }
+            pref.setSummary(getHomepageSummary());
+            ((ListPreference)pref).setValue(getHomepageValue());
+            return false;
         }
 
-        return false;
+        return true;
+    }
+
+    void promptForHomepage(final ListPreference pref) {
+        final BrowserSettings settings = BrowserSettings.getInstance();
+        final EditText editText = new EditText(getActivity());
+        editText.setInputType(InputType.TYPE_CLASS_TEXT
+                | InputType.TYPE_TEXT_VARIATION_URI);
+        editText.setText(settings.getHomePage());
+        editText.setSelectAllOnFocus(true);
+        editText.setSingleLine(true);
+        editText.setImeActionLabel(null, EditorInfo.IME_ACTION_DONE);
+        final AlertDialog dialog = new AlertDialog.Builder(getActivity())
+                .setView(editText)
+                .setPositiveButton(android.R.string.ok, new OnClickListener() {
+                    @Override
+                    public void onClick(DialogInterface dialog, int which) {
+                        String homepage = editText.getText().toString().trim();
+                        homepage = UrlUtils.smartUrlFilter(homepage);
+                        settings.setHomePage(homepage);
+                        pref.setValue(getHomepageValue());
+                        pref.setSummary(getHomepageSummary());
+                    }
+                })
+                .setNegativeButton(android.R.string.cancel, new OnClickListener() {
+                    @Override
+                    public void onClick(DialogInterface dialog, int which) {
+                        dialog.cancel();
+                    }
+                })
+                .setTitle(R.string.pref_set_homepage_to)
+                .create();
+        editText.setOnEditorActionListener(new OnEditorActionListener() {
+            @Override
+            public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
+                if (actionId == EditorInfo.IME_ACTION_DONE) {
+                    dialog.getButton(AlertDialog.BUTTON_POSITIVE).performClick();
+                    return true;
+                }
+                return false;
+            }
+        });
+        dialog.show();
+    }
+
+    String getHomepageValue() {
+        BrowserSettings settings = BrowserSettings.getInstance();
+        String homepage = settings.getHomePage();
+        if (TextUtils.isEmpty(homepage) || BLANK_URL.endsWith(homepage)) {
+            return BLANK;
+        }
+        if (HomeProvider.MOST_VISITED.equals(homepage)) {
+            return MOST_VISITED;
+        }
+        String defaultHomepage = BrowserSettings.getFactoryResetHomeUrl(
+                getActivity());
+        if (TextUtils.equals(defaultHomepage, homepage)) {
+            return DEFAULT;
+        }
+        if (TextUtils.equals(mCurrentPage, homepage)) {
+            return CURRENT;
+        }
+        return OTHER;
+    }
+
+    String getHomepageSummary() {
+        BrowserSettings settings = BrowserSettings.getInstance();
+        if (settings.useMostVisitedHomepage()) {
+            return getHomepageLabel(MOST_VISITED);
+        }
+        String homepage = settings.getHomePage();
+        if (TextUtils.isEmpty(homepage) || BLANK_URL.equals(homepage)) {
+            return getHomepageLabel(BLANK);
+        }
+        return homepage;
+    }
+
+    String getHomepageLabel(String value) {
+        for (int i = 0; i < mValues.length; i++) {
+            if (value.equals(mValues[i])) {
+                return mChoices[i];
+            }
+        }
+        return null;
     }
 
     @Override
