diff --git a/src/com/android/browser/BrowserPreferencesPage.java b/src/com/android/browser/BrowserPreferencesPage.java
index c6ce8a6..3a9505f 100644
--- a/src/com/android/browser/BrowserPreferencesPage.java
+++ b/src/com/android/browser/BrowserPreferencesPage.java
@@ -71,29 +71,25 @@
         e.setOnPreferenceClickListener(this);
 
         PreferenceScreen manageDatabases = (PreferenceScreen)
-            findPreference(BrowserSettings.PREF_WEBSTORAGE_SETTINGS);
+            findPreference(BrowserSettings.PREF_WEBSITE_SETTINGS);
+        Intent intent = new Intent(this, WebsiteSettingsActivity.class);
+        manageDatabases.setIntent(intent);
+    }
 
-        Preference clearDatabases =
-            findPreference(BrowserSettings.PREF_WEBSTORAGE_CLEAR_ALL);
-
-        Vector origins = WebStorage.getInstance().getOrigins();
+    /*
+     * We need to set the manageDatabases PreferenceScreen state
+     * in the onResume(), as the number of origins with databases
+     * could have changed after calling the WebsiteSettingsActivity.
+     */
+    @Override
+    protected void onResume() {
+        super.onResume();
+        PreferenceScreen manageDatabases = (PreferenceScreen)
+            findPreference(BrowserSettings.PREF_WEBSITE_SETTINGS);
         manageDatabases.setEnabled(false);
-        clearDatabases.setEnabled(false);
-        if (origins != null) {
-            if (origins.size() > 0) {
-                manageDatabases.setEnabled(true);
-                clearDatabases.setEnabled(true);
-            }
-            for (int i = 0;  i < origins.size(); i++) {
-                OriginSettings origin =
-                    new OriginSettings(this, (String) origins.get(i));
-                PreferenceScreen screen =
-                    getPreferenceManager().createPreferenceScreen(this);
-                origin.setScreen(screen);
-                origin.setRootScreen(manageDatabases);
-                origin.setup();
-                manageDatabases.addPreference(screen);
-            }
+        Vector origins = WebStorage.getInstance().getOrigins();
+        if ((origins != null) && (origins.size() > 0)) {
+            manageDatabases.setEnabled(true);
         }
     }
 
diff --git a/src/com/android/browser/BrowserQuotaPreference.java b/src/com/android/browser/BrowserQuotaPreference.java
deleted file mode 100644
index e635bb2..0000000
--- a/src/com/android/browser/BrowserQuotaPreference.java
+++ /dev/null
@@ -1,99 +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 com.android.browser;
-
-import android.preference.ListPreference;
-import android.content.Context;
-import android.preference.PreferenceScreen;
-import android.util.AttributeSet;
-import android.util.Log;
-import android.view.View;
-import android.webkit.WebStorage;
-
-import java.util.Vector;
-
-/**
- * Utility class to display and manage the choosen quota
- * for an origin (HTML5 WebStorage feature)
- */
-class BrowserQuotaPreference extends ListPreference {
-
-    private String TAG = "BrowserQuotaPreference";
-    private OriginSettings mOrigin = null;
-    private static long sOneMB = 1024 * 1024;
-
-    // This is the constructor called by the inflater
-    public BrowserQuotaPreference(Context context, AttributeSet attrs) {
-        super(context, attrs);
-    }
-
-    public BrowserQuotaPreference(Context context, OriginSettings origin) {
-        super(context);
-        mOrigin = origin;
-    }
-
-    /**
-     * Find the minimum quota fitting the current usage
-     * and only show larger quotas in the list
-     */
-    public void setQuotaList () {
-        CharSequence[] entries = getEntries();
-        CharSequence[] values = getEntryValues();
-        Vector<CharSequence> listEntries = new Vector<CharSequence>();
-        Vector<CharSequence> listValues = new Vector<CharSequence>();
-        long usage = 0;
-        if (mOrigin != null) {
-          usage = mOrigin.getUsage();
-        }
-        for (int i = 0; i < values.length; i++) {
-            long value = Long.parseLong(values[i].toString());
-            value *= sOneMB; // the string array is expressed in MB
-            if (value >= usage) {
-                listEntries.add(entries[i]);
-                listValues.add(values[i]);
-            }
-        }
-        CharSequence[] newEntries = new CharSequence[listEntries.size()];
-        CharSequence[] newValues = new CharSequence[listValues.size()];
-        for (int i = 0; i < listEntries.size(); i++) {
-            newEntries[i] = listEntries.get(i);
-            newValues[i] = listValues.get(i);
-        }
-        setEntries(newEntries);
-        setEntryValues(newValues);
-        setValueIndex(0);
-    }
-
-    @Override
-    protected View onCreateDialogView() {
-        setQuotaList();
-        return super.onCreateDialogView();
-    }
-
-    @Override
-    protected void onDialogClosed(boolean positiveResult) {
-        super.onDialogClosed(positiveResult);
-        if (mOrigin == null) {
-            return;
-        }
-        if (positiveResult) {
-            long quota = Long.parseLong(getValue());
-            quota *= sOneMB; // getValue() is in MB
-            mOrigin.setQuota(quota);
-        }
-    }
-}
diff --git a/src/com/android/browser/BrowserSettings.java b/src/com/android/browser/BrowserSettings.java
index 5276ef9..2d2d39b 100644
--- a/src/com/android/browser/BrowserSettings.java
+++ b/src/com/android/browser/BrowserSettings.java
@@ -114,20 +114,13 @@
             "privacy_clear_form_data";
     public final static String PREF_CLEAR_PASSWORDS =
             "privacy_clear_passwords";
-    public final static String PREF_CLEAR_DATABASES =
-            "webstorage_clear_databases";
-    public final static String PREF_CLEAR_ALL_DATA =
-            "webstorage_clear_all_data";
-    public final static String PREF_MANAGE_QUOTA =
-            "webstorage_manage_quota";
     public final static String PREF_DEFAULT_QUOTA =
             "webstorage_default_quota";
     public final static String PREF_EXTRAS_RESET_DEFAULTS =
             "reset_default_preferences";
     public final static String PREF_DEBUG_SETTINGS = "debug_menu";
     public final static String PREF_GEARS_SETTINGS = "gears_settings";
-    public final static String PREF_WEBSTORAGE_SETTINGS = "webstorage_manage_databases";
-    public final static String PREF_WEBSTORAGE_CLEAR_ALL = "webstorage_clear_databases";
+    public final static String PREF_WEBSITE_SETTINGS = "website_settings";
     public final static String PREF_TEXT_SIZE = "text_size";
     public final static String PREF_DEFAULT_TEXT_ENCODING =
             "default_text_encoding";
@@ -491,7 +484,7 @@
         // Remove all listed databases from the preferences
         PreferenceActivity activity = (PreferenceActivity) context;
         PreferenceScreen screen = (PreferenceScreen)
-            activity.findPreference(BrowserSettings.PREF_WEBSTORAGE_SETTINGS);
+            activity.findPreference(BrowserSettings.PREF_WEBSITE_SETTINGS);
         screen.removeAll();
         screen.setEnabled(false);
     }
diff --git a/src/com/android/browser/BrowserYesNoPreference.java b/src/com/android/browser/BrowserYesNoPreference.java
index 11a577b..ae93882 100644
--- a/src/com/android/browser/BrowserYesNoPreference.java
+++ b/src/com/android/browser/BrowserYesNoPreference.java
@@ -23,21 +23,11 @@
 
 class BrowserYesNoPreference extends YesNoPreference {
 
-    // This is used for the HTML5 pref UI, where we construct
-    // BrowserYesNoPreference objects on the fly and where we need
-    // to save the corresponding origin.
-    OriginSettings mOrigin = null;
-
     // This is the constructor called by the inflater
     public BrowserYesNoPreference(Context context, AttributeSet attrs) {
         super(context, attrs);
     }
 
-    public BrowserYesNoPreference(Context context, OriginSettings origin) {
-        super(context);
-        mOrigin = origin;
-    }
-
     @Override
     protected void onDialogClosed(boolean positiveResult) {
         super.onDialogClosed(positiveResult);
@@ -48,6 +38,7 @@
             Context context = getContext();
             if (BrowserSettings.PREF_CLEAR_CACHE.equals(getKey())) {
                 BrowserSettings.getInstance().clearCache(context);
+                BrowserSettings.getInstance().clearDatabases(context);
             } else if (BrowserSettings.PREF_CLEAR_COOKIES.equals(getKey())) {
                 BrowserSettings.getInstance().clearCookies(context);
             } else if (BrowserSettings.PREF_CLEAR_HISTORY.equals(getKey())) {
@@ -56,12 +47,6 @@
                 BrowserSettings.getInstance().clearFormData(context);
             } else if (BrowserSettings.PREF_CLEAR_PASSWORDS.equals(getKey())) {
                 BrowserSettings.getInstance().clearPasswords(context);
-            } else if (BrowserSettings.PREF_CLEAR_DATABASES.equals(getKey())) {
-                BrowserSettings.getInstance().clearDatabases(context);
-            } else if (BrowserSettings.PREF_CLEAR_ALL_DATA.equals(getKey())) {
-                if (mOrigin != null) {
-                    mOrigin.delete();
-                }
             } else if (BrowserSettings.PREF_EXTRAS_RESET_DEFAULTS.equals(
                     getKey())) {
                 BrowserSettings.getInstance().resetDefaultPreferences(context);
diff --git a/src/com/android/browser/OriginSettings.java b/src/com/android/browser/OriginSettings.java
deleted file mode 100644
index e80888a..0000000
--- a/src/com/android/browser/OriginSettings.java
+++ /dev/null
@@ -1,146 +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 com.android.browser;
-
-import android.content.Context;
-import android.preference.Preference;
-import android.preference.PreferenceActivity;
-import android.preference.PreferenceScreen;
-import android.util.Log;
-import android.webkit.WebStorage;
-
-/**
- * Manage the settings for an origin.
- * We use it to keep track of the HTML5 settings, i.e. database (webstorage).
- */
-class OriginSettings {
-
-    private String TAG = "OriginSettings";
-    private String mOrigin = null;
-    private long mQuota = 0;
-    private long mUsage = 0;
-    private PreferenceScreen mInfoScreen;
-    private PreferenceScreen mRootScreen;
-    private PreferenceActivity mActivity;
-
-    private static String sMBUsed = null;
-    private static String sNoQuotaLeft = null;
-    private static String sMBLeft = null;
-
-    public OriginSettings(PreferenceActivity activity, String origin) {
-        mOrigin = origin;
-        mUsage = WebStorage.getInstance().getUsageForOrigin(mOrigin);
-        mQuota = WebStorage.getInstance().getQuotaForOrigin(mOrigin);
-        mActivity = activity;
-        if (sMBUsed == null) {
-          sMBUsed = mActivity.getString(
-              R.string.webstorage_origin_summary_mb_used);
-          sNoQuotaLeft = mActivity.getString(
-              R.string.webstorage_origin_summary_no_quota_left);
-          sMBLeft = mActivity.getString(
-              R.string.webstorage_origin_summary_mb_left);
-        }
-    }
-
-    public String getOrigin() {
-        return mOrigin;
-    }
-
-    public long getQuota() {
-        return mQuota;
-    }
-
-    public long getUsage() {
-        return mUsage;
-    }
-
-    public void setScreen(PreferenceScreen screen) {
-        mInfoScreen = screen;
-    }
-
-    public void setRootScreen(PreferenceScreen screen) {
-        mRootScreen = screen;
-    }
-
-    private String sizeValueToString(long value) {
-        float mb = (float) value / (1024.0F * 1024.0F);
-        int val = (int) (mb * 10);
-        float ret = (float) (val / 10.0F);
-        if (ret <= 0) {
-            return "0";
-        }
-        return String.valueOf(ret);
-    }
-
-    public void updateSummary() {
-        String summary = sizeValueToString(mUsage) + " " + sMBUsed;
-        if ((mQuota <= 0) || ((mQuota - mUsage) <= 0)) {
-            summary += ", " + sNoQuotaLeft;
-        } else {
-            summary += " (" + sizeValueToString(mQuota - mUsage);
-            summary += " " + sMBLeft + ")";
-        }
-        mInfoScreen.setSummary(summary);
-        mActivity.onContentChanged();
-    }
-
-    public void setup() {
-        mInfoScreen.setTitle(mOrigin);
-        mInfoScreen.setKey(mOrigin);
-        updateSummary();
-
-        BrowserQuotaPreference manageSite = new BrowserQuotaPreference(mActivity, this);
-        BrowserYesNoPreference clearAllData = new BrowserYesNoPreference(mActivity, this);
-
-        manageSite.setTitle(R.string.webstorage_manage_quota_title);
-        manageSite.setSummary(R.string.webstorage_manage_quota_summary);
-        manageSite.setKey(BrowserSettings.PREF_MANAGE_QUOTA);
-        manageSite.setEntries(R.array.webstorage_quota_entries);
-        manageSite.setEntryValues(R.array.webstorage_quota_entries_values);
-
-        clearAllData.setTitle(R.string.webstorage_clear_data_title);
-        clearAllData.setSummary(R.string.webstorage_clear_data_summary);
-        clearAllData.setKey(BrowserSettings.PREF_CLEAR_ALL_DATA);
-        clearAllData.setDialogTitle(R.string.webstorage_clear_data_dialog_title);
-        clearAllData.setDialogMessage(R.string.webstorage_clear_data_dialog_message);
-        clearAllData.setDialogIcon(android.R.drawable.ic_dialog_alert);
-
-        mInfoScreen.addPreference(manageSite);
-        mInfoScreen.addPreference(clearAllData);
-    }
-
-    public void setQuota(long quota) {
-        mQuota = quota;
-        WebStorage.getInstance().setQuotaForOrigin(mOrigin, mQuota);
-        mInfoScreen.getDialog().dismiss();
-        updateSummary();
-    }
-
-    public void delete() {
-        WebStorage.getInstance().deleteOrigin(mOrigin);
-        mInfoScreen.removeAll();
-        mRootScreen.removePreference(mInfoScreen);
-        mInfoScreen.getDialog().dismiss();
-        if (mRootScreen.getPreferenceCount() == 0) {
-            mRootScreen.getDialog().dismiss();
-            mRootScreen.setEnabled(false);
-            Preference clearDatabases = mActivity.findPreference(
-                    BrowserSettings.PREF_WEBSTORAGE_CLEAR_ALL);
-            clearDatabases.setEnabled(false);
-        }
-    }
-}
diff --git a/src/com/android/browser/WebsiteSettingsActivity.java b/src/com/android/browser/WebsiteSettingsActivity.java
new file mode 100644
index 0000000..7fea766
--- /dev/null
+++ b/src/com/android/browser/WebsiteSettingsActivity.java
@@ -0,0 +1,291 @@
+/*
+ * 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 com.android.browser;
+
+import android.app.AlertDialog;
+import android.app.ListActivity;
+import android.content.Context;
+import android.content.DialogInterface;
+import android.database.Cursor;
+import android.graphics.Bitmap;
+import android.graphics.BitmapFactory;
+import android.net.Uri;
+import android.os.Bundle;
+import android.provider.Browser;
+import android.util.Log;
+import android.view.KeyEvent;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.webkit.WebIconDatabase;
+import android.webkit.WebStorage;
+import android.widget.ArrayAdapter;
+import android.widget.AdapterView;
+import android.widget.AdapterView.OnItemClickListener;
+import android.widget.ImageView;
+import android.widget.TextView;
+
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.Set;
+import java.util.Vector;
+
+/**
+ * Manage the settings for an origin.
+ * We use it to keep track of the HTML5 settings, i.e. database (webstorage).
+ */
+public class WebsiteSettingsActivity extends ListActivity {
+
+    private String LOGTAG = "WebsiteSettingsActivity";
+    private static String sMBStored = null;
+    private SiteAdapter mAdapter = null;
+
+    class Site {
+        private String mOrigin;
+        private String mTitle;
+        private Bitmap mIcon;
+
+        public Site(String origin, String title, Bitmap icon) {
+            mOrigin = origin;
+            mTitle = title;
+            mIcon = icon;
+        }
+
+        public String getOrigin() {
+            return mOrigin;
+        }
+
+        public void setTitle(String title) {
+            mTitle = title;
+        }
+
+        public String getTitle() {
+            return mTitle;
+        }
+
+        public void setIcon(Bitmap icon) {
+            mIcon = icon;
+        }
+
+        public Bitmap getIcon() {
+            return mIcon;
+        }
+    }
+
+    class SiteAdapter extends ArrayAdapter<Site>
+            implements AdapterView.OnItemClickListener {
+        private int mResource;
+        private LayoutInflater mInflater;
+        private Bitmap mDefaultIcon;
+        private Site mCurrentSite;
+        private final static int STORED_DATA = 0;
+
+        public SiteAdapter(Context context, int rsc) {
+            super(context, rsc);
+            mResource = rsc;
+            mInflater = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
+            mDefaultIcon = BitmapFactory.decodeResource(getResources(),
+                    R.drawable.ic_launcher_shortcut_browser_bookmark);
+            populateOrigins();
+        }
+
+        public void populateOrigins() {
+            clear();
+
+            // Get the list of origins we want to display
+            HashMap<String, Site> uris = new HashMap<String, Site>();
+            Vector origins = WebStorage.getInstance().getOrigins();
+            if (origins != null) {
+                for (int i = 0;  i < origins.size(); i++) {
+                    String origin = (String) origins.get(i);
+                    Site site = new Site(origin, origin, null);
+                    uris.put(Uri.parse(origin).getHost(), site);
+                }
+            }
+
+            // Check the bookmark db -- if one of our origin matches,
+            // we set its title and favicon
+            Cursor c = getContext().getContentResolver().query(Browser.BOOKMARKS_URI,
+                    new String[] { Browser.BookmarkColumns.URL, Browser.BookmarkColumns.TITLE,
+                    Browser.BookmarkColumns.FAVICON }, "bookmark = 1", null, null);
+
+            if ((c != null) && c.moveToFirst()) {
+                int urlIndex = c.getColumnIndex(Browser.BookmarkColumns.URL);
+                int titleIndex = c.getColumnIndex(Browser.BookmarkColumns.TITLE);
+                int faviconIndex = c.getColumnIndex(Browser.BookmarkColumns.FAVICON);
+                do {
+                    String url = c.getString(urlIndex);
+                    String host = Uri.parse(url).getHost();
+                    if (uris.containsKey(host)) {
+                        String title = c.getString(titleIndex);
+                        Site site = uris.get(host);
+                        site.setTitle(title);
+                        byte[] data = c.getBlob(faviconIndex);
+                        if (data != null) {
+                            Bitmap bmp = BitmapFactory.decodeByteArray(data, 0, data.length);
+                            if (bmp != null) {
+                                site.setIcon(bmp);
+                            }
+                        }
+                    }
+                } while (c.moveToNext());
+            }
+
+            // We can now simply populate our array with Site instances
+            Set keys = uris.keySet();
+            Iterator iter = keys.iterator();
+            while (iter.hasNext()) {
+                String origin = (String) iter.next();
+                Site site = uris.get(origin);
+                add(site);
+            }
+
+            if (getCount() == 0) {
+                finish(); // we close the screen
+            }
+        }
+
+        public int getCount() {
+            if (mCurrentSite == null) {
+                return super.getCount();
+            }
+            return 1; // db view
+        }
+
+        public String sizeValueToString(long value) {
+            float mb = (float) value / (1024.0F * 1024.0F);
+            int val = (int) (mb * 10);
+            float ret = (float) (val / 10.0F);
+            if (ret <= 0) {
+                return "0";
+            }
+            return String.valueOf(ret);
+        }
+
+        /*
+         * If we receive the back event and are displaying
+         * site's settings, we want to go back to the main
+         * list view. If not, we just do nothing (see
+         * dispatchKeyEvent() below).
+         */
+        public boolean backKeyPressed() {
+            if (mCurrentSite != null) {
+                mCurrentSite = null;
+                populateOrigins();
+                notifyDataSetChanged();
+                return true;
+            }
+            return false;
+        }
+
+        public View getView(int position, View convertView, ViewGroup parent) {
+            View view;
+            TextView title;
+            TextView subtitle;
+            ImageView icon;
+
+            if (convertView == null) {
+                view = mInflater.inflate(mResource, parent, false);
+            } else {
+                view = convertView;
+            }
+
+            title = (TextView) view.findViewById(R.id.title);
+            subtitle = (TextView) view.findViewById(R.id.subtitle);
+            icon = (ImageView) view.findViewById(R.id.icon);
+
+            if (mCurrentSite == null) {
+                Site site = getItem(position);
+                title.setText(site.getTitle());
+                subtitle.setText(site.getOrigin());
+                icon.setVisibility(View.VISIBLE);
+                Bitmap bmp = site.getIcon();
+                if (bmp == null) {
+                    bmp = mDefaultIcon;
+                }
+                icon.setImageBitmap(bmp);
+                // We set the site as the view's tag,
+                // so that we can get it in onItemClick()
+                view.setTag(site);
+            } else {
+                icon.setVisibility(View.GONE);
+                if (position == STORED_DATA) {
+                    String origin = mCurrentSite.getOrigin();
+                    long usageValue = WebStorage.getInstance().getUsageForOrigin(origin);
+                    String usage = sizeValueToString(usageValue) + " " + sMBStored;
+
+                    title.setText(R.string.webstorage_clear_data_title);
+                    subtitle.setText(usage);
+                }
+            }
+
+            return view;
+        }
+
+        public void onItemClick(AdapterView<?> parent,
+                                View view,
+                                int position,
+                                long id) {
+            if (mCurrentSite != null) {
+                if (position == STORED_DATA) {
+                    new AlertDialog.Builder(getContext())
+                        .setTitle(R.string.webstorage_clear_data_dialog_title)
+                        .setMessage(R.string.webstorage_clear_data_dialog_message)
+                        .setPositiveButton(R.string.webstorage_clear_data_dialog_ok_button,
+                                           new AlertDialog.OnClickListener() {
+                            public void onClick(DialogInterface dlg, int which) {
+                                WebStorage.getInstance().deleteOrigin(mCurrentSite.getOrigin());
+                                mCurrentSite = null;
+                                populateOrigins();
+                                notifyDataSetChanged();
+                            }})
+                        .setNegativeButton(R.string.webstorage_clear_data_dialog_cancel_button, null)
+                        .setIcon(android.R.drawable.ic_dialog_alert)
+                        .show();
+                }
+            } else {
+                mCurrentSite = (Site) view.getTag();
+                notifyDataSetChanged();
+            }
+        }
+    }
+
+    /**
+     * Intercepts the back key to immediately notify
+     * NativeDialog that we are done.
+     */
+    public boolean dispatchKeyEvent(KeyEvent event) {
+        if ((event.getKeyCode() == KeyEvent.KEYCODE_BACK)
+            && (event.getAction() == KeyEvent.ACTION_DOWN)) {
+            if ((mAdapter != null) && (mAdapter.backKeyPressed())){
+                return true; // event consumed
+            }
+        }
+        return super.dispatchKeyEvent(event);
+    }
+
+    @Override
+    protected void onCreate(Bundle icicle) {
+        super.onCreate(icicle);
+        if (sMBStored == null) {
+            sMBStored = getString(R.string.webstorage_origin_summary_mb_stored);
+        }
+        mAdapter = new SiteAdapter(this, R.layout.application);
+        setListAdapter(mAdapter);
+        getListView().setOnItemClickListener(mAdapter);
+    }
+}
