diff --git a/res/values/strings.xml b/res/values/strings.xml
index b108bbc..0056555 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -333,15 +333,15 @@
     <!-- Confirmation dialog message -->
     <string name="pref_privacy_clear_passwords_dlg">All saved passwords will be cleared.</string>
     <!-- Settings label -->
-    <string name="pref_privacy_request_location">Enable location</string>
+    <string name="pref_privacy_enable_geolocation">Enable location</string>
     <!-- Settings summary -->
-    <string name="pref_privacy_request_location_summary">Allow sites to request access to your location</string>
+    <string name="pref_privacy_enable_geolocation_summary">Allow sites to request access to your location</string>
     <!-- Settings label -->
-    <string name="pref_privacy_clear_location_requests">Clear location access</string>
+    <string name="pref_privacy_clear_geolocation_access">Clear location access</string>
     <!-- Settings summary -->
-    <string name="pref_privacy_clear_location_requests_summary">Clear location access for all websites</string>
+    <string name="pref_privacy_clear_geolocation_access_summary">Clear location access for all websites</string>
     <!-- Confirmation dialog message -->
-    <string name="pref_privacy_clear_location_requests_dlg">Clear all previous location requests</string>
+    <string name="pref_privacy_clear_geolocation_access_dlg">Clear location access for all websites</string>
     <!-- Settings screen, section title -->
     <string name="pref_security_title">Security settings</string>
     <!-- Settings label -->
@@ -767,8 +767,9 @@
     <string name="default_button">OK</string>
 
     <!-- HTML5 dialogs -->
-    <!-- Used as a toast notification after the user close the html5 webstorage permission dialog -->
-    <string name="webstorage_notification">The quota for this site can be changed in the Local Storage section of the Browser settings</string>
+    <!-- Used as a status bar notification when the browser is running out of space trying to allocate or increase the database quota for an HTML5 databae or application cache. -->
+    <string name="webstorage_outofspace_notification_title">Browser storage full</string>
+    <string name="webstorage_outofspace_notification_text">Click to free up space.</string>
     <!-- Used in the Browser Settings -->
     <string name="webstorage_clear_data_title">Clear stored data</string>
     <string name="webstorage_clear_data_summary">Remove all databases associated with this website</string>
@@ -780,6 +781,17 @@
     <!-- Strings used in the summary of origins -->
     <string name="webstorage_origin_summary_mb_stored">MB stored on your phone</string>
 
+    <!-- Geolocation -->
+    <!-- Settings page, Advanced Settings -> Website settings -> <origin> -->
+    <string name="geolocation_settings_page_title">Clear location access</string>
+    <string name="geolocation_settings_page_summary_allowed">This site can currently access your location</string>
+    <string name="geolocation_settings_page_summary_not_allowed">This site cannot currently access your location</string>
+    <!-- Settings page dialog -->
+    <string name="geolocation_settings_page_dialog_title">Clear location access</string>
+    <string name="geolocation_settings_page_dialog_message">Location access for this website will be cleared</string>
+    <string name="geolocation_settings_page_dialog_ok_button">Clear access</string>
+    <string name="geolocation_settings_page_dialog_cancel_button">Cancel</string>
+
     <!-- Zoom-related strings --><skip />
     <!-- Caption for a button that is shown when the zoom widget is showing.  The button's action will switch to the zoom overview mode. -->
     <string name="zoom_overview_button_text">Overview</string>
@@ -788,4 +800,5 @@
     <string name="error_console_header_text_maximized" translatable="false">JavaScript Console</string>
     <string name="error_console_eval_text_hint" translatable="false">Evaluate JavaScript</string>
     <string name="error_console_eval_button_text" translatable="false">Evaluate</string>
+
 </resources>
diff --git a/res/xml/browser_preferences.xml b/res/xml/browser_preferences.xml
index dffb550..83c492e 100644
--- a/res/xml/browser_preferences.xml
+++ b/res/xml/browser_preferences.xml
@@ -134,23 +134,20 @@
                 android:dialogTitle="@string/clear" 
                 android:dialogIcon="@android:drawable/ic_dialog_alert"/>
 
-        <!-- below preferences will be shown when html5 location is implemented -->
-        <!--
-
         <CheckBoxPreference
-                android:key="request_location"
+                android:key="enable_geolocation"
                 android:defaultValue="true"
-                android:title="@string/pref_privacy_request_location"
-                android:summary="@string/pref_privacy_request_location_summary" />
+                android:title="@string/pref_privacy_enable_geolocation"
+                android:summary="@string/pref_privacy_enable_geolocation_summary" />
 
         <com.android.browser.BrowserYesNoPreference
-                android:key="privacy_clear_location_requests"
-                android:title="@string/pref_privacy_clear_location_requests"
-                android:summary="@string/pref_privacy_clear_location_requests_summary"
-                android:dialogMessage="@string/pref_privacy_clear_location_requests_dlg"
+                android:key="privacy_clear_geolocation_access"
+                android:dependency="enable_geolocation"
+                android:title="@string/pref_privacy_clear_geolocation_access"
+                android:summary="@string/pref_privacy_clear_geolocation_access_summary"
+                android:dialogMessage="@string/pref_privacy_clear_geolocation_access_dlg"
                 android:dialogTitle="@string/clear"
                 android:dialogIcon="@android:drawable/ic_dialog_alert"/>
-        -->
 
     </PreferenceCategory>
     
diff --git a/src/com/android/browser/BrowserActivity.java b/src/com/android/browser/BrowserActivity.java
index 7f40494..a2b5c88 100644
--- a/src/com/android/browser/BrowserActivity.java
+++ b/src/com/android/browser/BrowserActivity.java
@@ -894,10 +894,11 @@
             urlData.setPostData(intent
                     .getByteArrayExtra(Browser.EXTRA_POST_DATA));
 
-            if (Intent.ACTION_VIEW.equals(action) &&
-                    (flags & Intent.FLAG_ACTIVITY_BROUGHT_TO_FRONT) != 0) {
-                final String appId =
-                        intent.getStringExtra(Browser.EXTRA_APPLICATION_ID);
+            final String appId = intent
+                    .getStringExtra(Browser.EXTRA_APPLICATION_ID);
+            if (Intent.ACTION_VIEW.equals(action)
+                    && !getPackageName().equals(appId)
+                    && (flags & Intent.FLAG_ACTIVITY_BROUGHT_TO_FRONT) != 0) {
                 TabControl.Tab appTab = mTabControl.getTabFromId(appId);
                 if (appTab != null) {
                     Log.i(LOGTAG, "Reusing tab for " + appId);
@@ -1038,6 +1039,7 @@
         if (appData != null) {
             intent.putExtra(SearchManager.APP_DATA, appData);
         }
+        intent.putExtra(Browser.EXTRA_APPLICATION_ID, getPackageName());
         startActivity(intent);
 
         return true;
diff --git a/src/com/android/browser/BrowserPreferencesPage.java b/src/com/android/browser/BrowserPreferencesPage.java
index 4536b2c..2348af0 100644
--- a/src/com/android/browser/BrowserPreferencesPage.java
+++ b/src/com/android/browser/BrowserPreferencesPage.java
@@ -29,10 +29,10 @@
 import android.preference.PreferenceActivity;
 import android.preference.PreferenceScreen;
 import android.util.Log;
+import android.webkit.GeolocationPermissions;
 import android.webkit.Plugin;
 import android.webkit.WebStorage;
 import android.webkit.WebView;
-import android.webkit.Plugin;
 
 public class BrowserPreferencesPage extends PreferenceActivity
         implements Preference.OnPreferenceChangeListener, 
@@ -69,35 +69,36 @@
 
         e = findPreference(BrowserSettings.PREF_DEFAULT_TEXT_ENCODING);
         e.setOnPreferenceChangeListener(this);
-        
+
         if (BrowserSettings.getInstance().showDebugSettings()) {
             addPreferencesFromResource(R.xml.debug_preferences);
         }
-        
+
         e = findPreference(BrowserSettings.PREF_GEARS_SETTINGS);
         e.setOnPreferenceClickListener(this);
 
-        PreferenceScreen manageDatabases = (PreferenceScreen)
+        PreferenceScreen websiteSettings = (PreferenceScreen)
             findPreference(BrowserSettings.PREF_WEBSITE_SETTINGS);
         Intent intent = new Intent(this, WebsiteSettingsActivity.class);
-        manageDatabases.setIntent(intent);
+        websiteSettings.setIntent(intent);
     }
 
     /*
-     * 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.
+     * We need to set the PreferenceScreen state in onResume(), as the number of
+     * origins with active features (WebStorage, Geolocation etc) could have
+     * changed after calling the WebsiteSettingsActivity.
      */
     @Override
     protected void onResume() {
         super.onResume();
-        PreferenceScreen manageDatabases = (PreferenceScreen)
+        PreferenceScreen websiteSettings = (PreferenceScreen)
             findPreference(BrowserSettings.PREF_WEBSITE_SETTINGS);
-        manageDatabases.setEnabled(false);
-        Set origins = WebStorage.getInstance().getOrigins();
-        if ((origins != null) && (origins.size() > 0)) {
-            manageDatabases.setEnabled(true);
-        }
+        Set webStorageOrigins = WebStorage.getInstance().getOrigins();
+        Set geolocationOrigins =
+            GeolocationPermissions.getInstance().getOrigins();
+        websiteSettings.setEnabled(
+            ((webStorageOrigins != null) && !webStorageOrigins.isEmpty()) ||
+            ((geolocationOrigins != null) && !geolocationOrigins.isEmpty()));
     }
 
     @Override
diff --git a/src/com/android/browser/BrowserSettings.java b/src/com/android/browser/BrowserSettings.java
index 79deb61..3ed6cf0 100644
--- a/src/com/android/browser/BrowserSettings.java
+++ b/src/com/android/browser/BrowserSettings.java
@@ -26,6 +26,7 @@
 import android.preference.PreferenceActivity;
 import android.preference.PreferenceScreen;
 import android.webkit.CookieManager;
+import android.webkit.GeolocationPermissions;
 import android.webkit.WebView;
 import android.webkit.WebViewDatabase;
 import android.webkit.WebIconDatabase;
@@ -34,6 +35,7 @@
 import android.preference.PreferenceManager;
 import android.provider.Browser;
 
+import java.util.Set;
 import java.util.HashMap;
 import java.util.Observable;
 
@@ -81,6 +83,7 @@
     private WebStorageSizeManager webStorageSizeManager;
     private boolean domStorageEnabled = true;
     private String jsFlags = "";
+    private boolean geolocationEnabled = true;
 
     private final static String TAG = "BrowserSettings";
 
@@ -130,6 +133,8 @@
     public final static String PREF_DEFAULT_ZOOM = "default_zoom";
     public final static String PREF_DEFAULT_TEXT_ENCODING =
             "default_text_encoding";
+    public final static String PREF_CLEAR_LOCATION_ACCESS =
+            "privacy_clear_location_access";
 
     private static final String DESKTOP_USERAGENT = "Mozilla/5.0 (Macintosh; " +
             "U; Intel Mac OS X 10_5_7; en-us) AppleWebKit/530.17 (KHTML, " +
@@ -216,6 +221,10 @@
             // Enable/Disable the error console.
             b.mTabControl.getBrowserActivity().setShouldShowErrorConsole(
                     b.showDebugSettings && b.showConsole);
+
+            // Configure the Geolocation permissions manager to deny all
+            // permission requests if Geolocation is disabled in the browser.
+            // TODO(steveblock): Implement
         }
     }
 
@@ -352,6 +361,8 @@
         mTabControl.getBrowserActivity().setShouldShowErrorConsole(
                 showDebugSettings && showConsole);
 
+        geolocationEnabled = p.getBoolean("enable_geolocation", geolocationEnabled);
+
         update();
     }
 
@@ -522,14 +533,27 @@
         db.clearHttpAuthUsernamePassword();
     }
 
+    private void maybeDisableWebsiteSettings(Context context) {
+        Set webStorageOrigins = WebStorage.getInstance().getOrigins();
+        Set geolocationOrigins =
+                 GeolocationPermissions.getInstance().getOrigins();
+        if (((webStorageOrigins == null) || webStorageOrigins.isEmpty()) &&
+            ((geolocationOrigins == null) || geolocationOrigins.isEmpty())) {
+            PreferenceActivity activity = (PreferenceActivity) context;
+            PreferenceScreen screen = (PreferenceScreen)
+                activity.findPreference(BrowserSettings.PREF_WEBSITE_SETTINGS);
+            screen.setEnabled(false);
+        }
+    }
+
     /*package*/ void clearDatabases(Context context) {
         WebStorage.getInstance().deleteAllData();
-        // Remove all listed databases from the preferences
-        PreferenceActivity activity = (PreferenceActivity) context;
-        PreferenceScreen screen = (PreferenceScreen)
-            activity.findPreference(BrowserSettings.PREF_WEBSITE_SETTINGS);
-        screen.removeAll();
-        screen.setEnabled(false);
+        maybeDisableWebsiteSettings(context);
+    }
+
+    /*package*/ void clearLocationAccess(Context context) {
+        GeolocationPermissions.getInstance().clearAll();
+        maybeDisableWebsiteSettings(context);
     }
 
     /*package*/ void resetDefaultPreferences(Context ctx) {
diff --git a/src/com/android/browser/BrowserYesNoPreference.java b/src/com/android/browser/BrowserYesNoPreference.java
index ae93882..e380e57 100644
--- a/src/com/android/browser/BrowserYesNoPreference.java
+++ b/src/com/android/browser/BrowserYesNoPreference.java
@@ -51,6 +51,9 @@
                     getKey())) {
                 BrowserSettings.getInstance().resetDefaultPreferences(context);
                 setEnabled(true);
+            } else if (BrowserSettings.PREF_CLEAR_LOCATION_ACCESS.equals(
+                    getKey())) {
+                BrowserSettings.getInstance().clearLocationAccess(context);
             }
         }
     }
diff --git a/src/com/android/browser/WebStorageSizeManager.java b/src/com/android/browser/WebStorageSizeManager.java
index ff21ea9..40d30a2 100644
--- a/src/com/android/browser/WebStorageSizeManager.java
+++ b/src/com/android/browser/WebStorageSizeManager.java
@@ -16,7 +16,11 @@
 
 package com.android.browser;
 
+import android.app.Notification;
+import android.app.NotificationManager;
+import android.app.PendingIntent;
 import android.content.Context;
+import android.content.Intent;
 import android.os.StatFs;
 import android.util.Log;
 import android.webkit.WebStorage;
@@ -84,7 +88,6 @@
  * a system notification that will guide the user to the WebSettings UI. There,
  * the user can free some of the Web storage space by deleting all the data used
  * by an origin.
- * TODO(andreip): implement the notification.
  */
 class WebStorageSizeManager {
     // Logging flags.
@@ -95,6 +98,14 @@
     public final static long ORIGIN_DEFAULT_QUOTA = 3 * 1024 * 1024;  // 3MB
     // The default value for quota increases.
     public final static long QUOTA_INCREASE_STEP = 1 * 1024 * 1024;  // 1MB
+    // Extra padding space for appcache maximum size increases. This is needed
+    // because WebKit sends us an estimate of the amount of space needed
+    // but this estimate may, currently, be slightly less than what is actually
+    // needed. We therefore add some 'padding'.
+    // TODO(andreip): fix this in WebKit.
+    public final static long APPCACHE_MAXSIZE_PADDING = 512 * 1024; // 512KB
+    // The system status bar notification id.
+    private final static int OUT_OF_SPACE_ID = 1;
     // The application context.
     private final Context mContext;
     // The global Web storage limit.
@@ -222,8 +233,16 @@
 
         if (totalUnusedQuota <= 0) {
             // There definitely isn't any more space. Fire notifications
-            // and exit.
-            scheduleOutOfSpaceNotification();
+            // if needed and exit.
+            if (totalUsedQuota > 0) {
+                // We only fire the notification if there are some other websites
+                // using some of the quota. This avoids the degenerate case where
+                // the first ever website to use Web storage tries to use more
+                // data than it is actually available. In such a case, showing
+                // the notification would not help at all since there is nothing
+                // the user can do.
+                scheduleOutOfSpaceNotification();
+            }
             quotaUpdater.updateQuota(currentQuota);
             if(LOGV_ENABLED) {
                 Log.v(LOGTAG, "onExceededDatabaseQuota: out of space.");
@@ -268,10 +287,18 @@
 
         long totalUnusedQuota = mGlobalLimit - totalUsedQuota - mAppCacheMaxSize;
 
-        if (totalUnusedQuota < spaceNeeded) {
+        if (totalUnusedQuota < spaceNeeded + APPCACHE_MAXSIZE_PADDING) {
             // There definitely isn't any more space. Fire notifications
-            // and exit.
-            scheduleOutOfSpaceNotification();
+            // if needed and exit.
+            if (totalUsedQuota > 0) {
+                // We only fire the notification if there are some other websites
+                // using some of the quota. This avoids the degenerate case where
+                // the first ever website to use Web storage tries to use more
+                // data than it is actually available. In such a case, showing
+                // the notification would not help at all since there is nothing
+                // the user can do.
+                scheduleOutOfSpaceNotification();
+            }
             quotaUpdater.updateQuota(0);
             if(LOGV_ENABLED) {
                 Log.v(LOGTAG, "onReachedMaxAppCacheSize: out of space.");
@@ -279,7 +306,7 @@
             return;
         }
         // There is enough space to accommodate spaceNeeded bytes.
-        mAppCacheMaxSize += spaceNeeded;
+        mAppCacheMaxSize += spaceNeeded + APPCACHE_MAXSIZE_PADDING;
         quotaUpdater.updateQuota(mAppCacheMaxSize);
 
         if(LOGV_ENABLED) {
@@ -324,6 +351,32 @@
     // Schedules a system notification that takes the user to the WebSettings
     // activity when clicked.
     private void scheduleOutOfSpaceNotification() {
-        // TODO(andreip): implement.
+        if(LOGV_ENABLED) {
+            Log.v(LOGTAG, "scheduleOutOfSpaceNotification called.");
+        }
+        if (mContext == null) {
+            // mContext can be null if we're running unit tests.
+            return;
+        }
+        // setup the notification boilerplate.
+        int icon = R.drawable.ic_launcher_browser;
+        CharSequence title = mContext.getString(
+                R.string.webstorage_outofspace_notification_title);
+        CharSequence text = mContext.getString(
+                R.string.webstorage_outofspace_notification_text);
+        long when = System.currentTimeMillis();
+        Intent intent = new Intent(mContext, WebsiteSettingsActivity.class);
+        PendingIntent contentIntent =
+            PendingIntent.getActivity(mContext, 0, intent, 0);
+        Notification notification = new Notification(icon, title, when);
+        notification.setLatestEventInfo(mContext, title, text, contentIntent);
+        notification.flags |= Notification.FLAG_AUTO_CANCEL;
+        // Fire away.
+        String ns = Context.NOTIFICATION_SERVICE;
+        NotificationManager mgr =
+            (NotificationManager) mContext.getSystemService(ns);
+        if (mgr != null) {
+            mgr.notify(OUT_OF_SPACE_ID, notification);
+        }
     }
 }
\ No newline at end of file
diff --git a/src/com/android/browser/WebsiteSettingsActivity.java b/src/com/android/browser/WebsiteSettingsActivity.java
index f91879f..89e5963 100644
--- a/src/com/android/browser/WebsiteSettingsActivity.java
+++ b/src/com/android/browser/WebsiteSettingsActivity.java
@@ -31,6 +31,7 @@
 import android.view.LayoutInflater;
 import android.view.View;
 import android.view.ViewGroup;
+import android.webkit.GeolocationPermissions;
 import android.webkit.WebIconDatabase;
 import android.webkit.WebStorage;
 import android.widget.ArrayAdapter;
@@ -42,12 +43,14 @@
 import java.util.HashMap;
 import java.util.HashSet;
 import java.util.Iterator;
+import java.util.Map;
 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).
+ * We use it to keep track of the 'HTML5' settings, i.e. database (webstorage)
+ * and Geolocation.
  */
 public class WebsiteSettingsActivity extends ListActivity {
 
@@ -59,11 +62,59 @@
         private String mOrigin;
         private String mTitle;
         private Bitmap mIcon;
+        private int mFeatures;
+
+        // These constants provide the set of features that a site may support
+        // They must be consecutive. To add a new feature, add a new FEATURE_XXX
+        // variable with value equal to the current value of FEATURE_COUNT, then
+        // increment FEATURE_COUNT.
+        private final static int FEATURE_WEB_STORAGE = 0;
+        private final static int FEATURE_GEOLOCATION = 1;
+        // The number of features available.
+        private final static int FEATURE_COUNT = 2;
 
         public Site(String origin) {
             mOrigin = origin;
             mTitle = null;
             mIcon = null;
+            mFeatures = 0;
+        }
+
+        public void addFeature(int feature) {
+            mFeatures |= (1 << feature);
+        }
+
+        public boolean hasFeature(int feature) {
+            return (mFeatures & (1 << feature)) != 0;
+        }
+
+        /**
+         * Gets the number of features supported by this site.
+         */
+        public int getFeatureCount() {
+            int count = 0;
+            for (int i = 0; i < FEATURE_COUNT; ++i) {
+                count += hasFeature(i) ? 1 : 0;
+            }
+            return count;
+        }
+
+        /**
+         * Gets the ID of the nth (zero-based) feature supported by this site.
+         * The return value is a feature ID - one of the FEATURE_XXX values.
+         * This is required to determine which feature is displayed at a given
+         * position in the list of features for this site. This is used both
+         * when populating the view and when responding to clicks on the list.
+         */
+        public int getFeatureByIndex(int n) {
+            int j = -1;
+            for (int i = 0; i < FEATURE_COUNT; ++i) {
+                j += hasFeature(i) ? 1 : 0;
+                if (j == n) {
+                    return i;
+                }
+            }
+            return -1;
         }
 
         public String getOrigin() {
@@ -102,7 +153,6 @@
         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);
@@ -113,28 +163,57 @@
             populateOrigins();
         }
 
+        /**
+         * Adds the specified feature to the site corresponding to supplied
+         * origin in the map. Creates the site if it does not already exist.
+         */
+        private void addFeatureToSite(Map sites, String origin, int feature) {
+            Site site = null;
+            if (sites.containsKey(origin)) {
+                site = (Site) sites.get(origin);
+            } else {
+                site = new Site(origin);
+                sites.put(origin, site);
+            }
+            site.addFeature(feature);
+        }
+
         public void populateOrigins() {
             clear();
 
-            // Get the list of origins we want to display
+            // Get the list of origins we want to display.
+            // All 'HTML 5 modules' (Database, Geolocation etc) form these
+            // origin strings using WebCore::SecurityOrigin::toString(), so it's
+            // safe to group origins here. Note that WebCore::SecurityOrigin
+            // uses 0 (which is not printed) for the port if the port is the
+            // default for the protocol. Eg http://www.google.com and
+            // http://www.google.com:80 both record a port of 0 and hence
+            // toString() == 'http://www.google.com' for both.
             Set origins = WebStorage.getInstance().getOrigins();
-            Set sites = new HashSet<Site>();
+            Map sites = new HashMap<String, Site>();
             if (origins != null) {
                 Iterator<String> iter = origins.iterator();
                 while (iter.hasNext()) {
-                    String origin = iter.next();
-                    Site site = new Site(origin);
-                    sites.add(site);
+                    addFeatureToSite(sites, iter.next(), Site.FEATURE_WEB_STORAGE);
+                }
+            }
+            origins = GeolocationPermissions.getInstance().getOrigins();
+            if (origins != null) {
+                Iterator<String> iter = origins.iterator();
+                while (iter.hasNext()) {
+                    addFeatureToSite(sites, iter.next(), Site.FEATURE_GEOLOCATION);
                 }
             }
 
             // Create a map from host to origin. This is used to add metadata
             // (title, icon) for this origin from the bookmarks DB.
             HashMap hosts = new HashMap<String, Set<Site> >();
-            Iterator<Site> sitesIter = sites.iterator();
-            while (sitesIter.hasNext()) {
-                Site site = sitesIter.next();
-                String host = Uri.parse(site.getOrigin()).getHost();
+            Set keys = sites.keySet();
+            Iterator<String> originIter = keys.iterator();
+            while (originIter.hasNext()) {
+                String origin = originIter.next();
+                Site site = (Site) sites.get(origin);
+                String host = Uri.parse(origin).getHost();
                 Set hostSites = null;
                 if (hosts.containsKey(host)) {
                     hostSites = (Set) hosts.get(host);
@@ -166,7 +245,7 @@
                             bmp = BitmapFactory.decodeByteArray(data, 0, data.length);
                         }
                         Set matchingSites = (Set) hosts.get(host);
-                        sitesIter = matchingSites.iterator();
+                        Iterator<Site> sitesIter = matchingSites.iterator();
                         while (sitesIter.hasNext()) {
                             Site site = sitesIter.next();
                             site.setTitle(title);
@@ -179,9 +258,11 @@
             }
 
             // We can now simply populate our array with Site instances
-            sitesIter = sites.iterator();
-            while (sitesIter.hasNext()) {
-                Site site = sitesIter.next();
+            keys = sites.keySet();
+            originIter = keys.iterator();
+            while (originIter.hasNext()) {
+                String origin = originIter.next();
+                Site site = (Site) sites.get(origin);
                 add(site);
             }
 
@@ -194,7 +275,7 @@
             if (mCurrentSite == null) {
                 return super.getCount();
             }
-            return 1; // db view
+            return mCurrentSite.getFeatureCount();
         }
 
         public String sizeValueToString(long value) {
@@ -254,13 +335,22 @@
                 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;
+                String origin = mCurrentSite.getOrigin();
+                switch (mCurrentSite.getFeatureByIndex(position)) {
+                    case Site.FEATURE_WEB_STORAGE:
+                        long usageValue = WebStorage.getInstance().getUsageForOrigin(origin);
+                        String usage = sizeValueToString(usageValue) + " " + sMBStored;
 
-                    title.setText(R.string.webstorage_clear_data_title);
-                    subtitle.setText(usage);
+                        title.setText(R.string.webstorage_clear_data_title);
+                        subtitle.setText(usage);
+                        break;
+                    case Site.FEATURE_GEOLOCATION:
+                        title.setText(R.string.geolocation_settings_page_title);
+                        boolean allowed = GeolocationPermissions.getInstance().getAllowed(origin);
+                        subtitle.setText(allowed ?
+                                         R.string.geolocation_settings_page_summary_allowed :
+                                         R.string.geolocation_settings_page_summary_not_allowed);
+                        break;
                 }
             }
 
@@ -272,21 +362,39 @@
                                 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();
+                switch (mCurrentSite.getFeatureByIndex(position)) {
+                    case Site.FEATURE_WEB_STORAGE:
+                        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();
+                        break;
+                    case Site.FEATURE_GEOLOCATION:
+                        new AlertDialog.Builder(getContext())
+                            .setTitle(R.string.geolocation_settings_page_dialog_title)
+                            .setMessage(R.string.geolocation_settings_page_dialog_message)
+                            .setPositiveButton(R.string.geolocation_settings_page_dialog_ok_button,
+                                               new AlertDialog.OnClickListener() {
+                                public void onClick(DialogInterface dlg, int which) {
+                                    GeolocationPermissions.getInstance().clear(mCurrentSite.getOrigin());
+                                    mCurrentSite = null;
+                                    populateOrigins();
+                                    notifyDataSetChanged();
+                                }})
+                            .setNegativeButton(R.string.geolocation_settings_page_dialog_cancel_button, null)
+                            .setIcon(android.R.drawable.ic_dialog_alert)
+                            .show();
+                        break;
                 }
             } else {
                 mCurrentSite = (Site) view.getTag();
