diff --git a/src/com/android/browser/Controller.java b/src/com/android/browser/Controller.java
index 89b700b..7c93e9f 100644
--- a/src/com/android/browser/Controller.java
+++ b/src/com/android/browser/Controller.java
@@ -1000,7 +1000,7 @@
         if (username != null && password != null) {
             handler.proceed(username, password);
         } else {
-            if (tab.inForeground()) {
+            if (tab.inForeground() && !handler.suppressDialog()) {
                 mPageDialogsHandler.showHttpAuthentication(tab, handler, host, realm);
             } else {
                 handler.cancel();
diff --git a/src/com/android/browser/provider/BrowserProvider.java b/src/com/android/browser/provider/BrowserProvider.java
index fabf57e..b55b84a 100644
--- a/src/com/android/browser/provider/BrowserProvider.java
+++ b/src/com/android/browser/provider/BrowserProvider.java
@@ -251,7 +251,7 @@
 
         public DatabaseHelper(Context context) {
             super(context, sDatabaseName, null, DATABASE_VERSION);
-            mContext = context.getApplicationContext();
+            mContext = context;
         }
 
         @Override
diff --git a/tests/src/com/android/browser/tests/BP2ProviderTests.java b/tests/src/com/android/browser/tests/BP2ProviderTests.java
index 6c3c71e..fa1b9ef 100644
--- a/tests/src/com/android/browser/tests/BP2ProviderTests.java
+++ b/tests/src/com/android/browser/tests/BP2ProviderTests.java
@@ -33,6 +33,15 @@
 @SmallTest
 public class BP2ProviderTests extends BP2TestCaseHelper {
 
+    static final String[] PROJECTION = new String[] {
+            BrowserContract.Bookmarks.PARENT,
+            BrowserContract.Bookmarks.ACCOUNT_NAME,
+            BrowserContract.Bookmarks.ACCOUNT_TYPE,
+    };
+    static final int INDEX_PARENT = 0;
+    static final int INDEX_ACCOUNT_NAME = 1;
+    static final int INDEX_ACCOUNT_TYPE = 2;
+
     public void testUpdateImage() {
         String url = "http://stub1.com";
         insertBookmark(url, "stub 1");
@@ -56,6 +65,7 @@
     }
 
     private void doTestIsValidParent(String accountName, String accountType) {
+        // Create the folder
         ContentValues values = new ContentValues();
         values.put(BrowserContract.Bookmarks.TITLE, "New Folder");
         values.put(BrowserContract.Bookmarks.IS_FOLDER, 1);
@@ -65,6 +75,7 @@
         assertNotNull(folderUri);
         long folderId = ContentUris.parseId(folderUri);
         assertTrue("Failed to parse folder id!", folderId > 0);
+        // Insert a bookmark with the same ACCOUNT_* info as parent
         values.put(BrowserContract.Bookmarks.TITLE, "google");
         values.put(BrowserContract.Bookmarks.URL, "http://google.com");
         values.put(BrowserContract.Bookmarks.IS_FOLDER, 0);
@@ -72,31 +83,54 @@
         Uri insertedUri = insertBookmark(values);
         assertNotNull(insertedUri);
         Cursor c = getMockContentResolver().query(insertedUri,
-                new String[] { BrowserContract.Bookmarks.PARENT },
-                null, null, null);
+                PROJECTION, null, null, null);
         try {
             assertNotNull(c);
             assertTrue(c.moveToFirst());
-            long insertedParentId = c.getLong(0);
+            long insertedParentId = c.getLong(INDEX_PARENT);
+            String insertedAccountName = c.getString(INDEX_ACCOUNT_NAME);
+            String insertedAccountType = c.getString(INDEX_ACCOUNT_TYPE);
             assertEquals(folderId, insertedParentId);
-            if (accountName == null) {
-                values.put(BrowserContract.Bookmarks.ACCOUNT_NAME, "test2@gmail.com");
-                values.put(BrowserContract.Bookmarks.ACCOUNT_TYPE, "com.google");
-            } else {
-                values.remove(BrowserContract.Bookmarks.ACCOUNT_NAME);
-                values.remove(BrowserContract.Bookmarks.ACCOUNT_TYPE);
-            }
+            assertEquals(accountName, insertedAccountName);
+            assertEquals(accountType, insertedAccountType);
+
+            // Insert a bookmark with no ACCOUNT_* set, BUT with a valid parent
+            // The inserted should end up with the ACCOUNT_* of the parent
+            values.remove(BrowserContract.Bookmarks.ACCOUNT_NAME);
+            values.remove(BrowserContract.Bookmarks.ACCOUNT_TYPE);
             insertedUri = insertBookmark(values);
             assertNotNull(insertedUri);
             c.close();
             c = getMockContentResolver().query(insertedUri,
-                    new String[] { BrowserContract.Bookmarks.PARENT },
-                    null, null, null);
+                    PROJECTION, null, null, null);
             assertNotNull(c);
             assertTrue(c.moveToFirst());
-            insertedParentId = c.getLong(0);
-            assertFalse("child has different accounts than parent!",
-                    folderId == insertedParentId);
+            insertedParentId = c.getLong(INDEX_PARENT);
+            insertedAccountName = c.getString(INDEX_ACCOUNT_NAME);
+            insertedAccountType = c.getString(INDEX_ACCOUNT_TYPE);
+            assertEquals(folderId, insertedParentId);
+            assertEquals(accountName, insertedAccountName);
+            assertEquals(accountType, insertedAccountType);
+
+            // Insert a bookmark with a different ACCOUNT_* than it's parent
+            // ACCOUNT_* should override parent
+            accountName = accountName + "@something.else";
+            accountType = "com.google";
+            values.put(BrowserContract.Bookmarks.ACCOUNT_NAME, accountName);
+            values.put(BrowserContract.Bookmarks.ACCOUNT_TYPE, accountType);
+            insertedUri = insertBookmark(values);
+            assertNotNull(insertedUri);
+            c.close();
+            c = getMockContentResolver().query(insertedUri,
+                    PROJECTION, null, null, null);
+            assertNotNull(c);
+            assertTrue(c.moveToFirst());
+            insertedParentId = c.getLong(INDEX_PARENT);
+            insertedAccountName = c.getString(INDEX_ACCOUNT_NAME);
+            insertedAccountType = c.getString(INDEX_ACCOUNT_TYPE);
+            assertNotSame(folderId, insertedParentId);
+            assertEquals(accountName, insertedAccountName);
+            assertEquals(accountType, insertedAccountType);
         } finally {
             c.close();
         }
diff --git a/tests/src/com/android/browser/tests/utils/BP2TestCaseHelper.java b/tests/src/com/android/browser/tests/utils/BP2TestCaseHelper.java
index 18c1c10..e341c6a 100644
--- a/tests/src/com/android/browser/tests/utils/BP2TestCaseHelper.java
+++ b/tests/src/com/android/browser/tests/utils/BP2TestCaseHelper.java
@@ -18,6 +18,9 @@
 
 import com.android.browser.provider.BrowserProvider2;
 
+import java.io.File;
+import java.io.FilenameFilter;
+
 import android.content.ContentValues;
 import android.database.ContentObserver;
 import android.net.Uri;
@@ -208,4 +211,22 @@
         perfIdeallyUntriggered(mBookmarksObserver, mWidgetObserver);
         return updated;
     }
+
+    @Override
+    protected void tearDown() throws Exception {
+        super.tearDown();
+        // Delete the test databases so that subsequent runs have a clean slate
+        File f = getMockContext().getDatabasePath("test");
+        File dir = f.getParentFile();
+        File testFiles[] = dir.listFiles(new FilenameFilter() {
+
+            @Override
+            public boolean accept(File dir, String filename) {
+                return filename.startsWith(ProviderTestCase3.FILENAME_PREFIX);
+            }
+        });
+        for (File testFile : testFiles) {
+            testFile.delete();
+        }
+    }
 }
diff --git a/tests/src/com/android/browser/tests/utils/ProviderTestCase3.java b/tests/src/com/android/browser/tests/utils/ProviderTestCase3.java
index 536163a..75bc052 100644
--- a/tests/src/com/android/browser/tests/utils/ProviderTestCase3.java
+++ b/tests/src/com/android/browser/tests/utils/ProviderTestCase3.java
@@ -35,6 +35,8 @@
  */
 public abstract class ProviderTestCase3<T extends ContentProvider> extends AndroidTestCase {
 
+    public static final String FILENAME_PREFIX = "test.";
+
     Class<T> mProviderClass;
     String[] mProviderAuthority;
 
@@ -112,13 +114,12 @@
         super.setUp();
 
         mResolver = new MockContentResolver2();
-        final String filenamePrefix = "test.";
         RenamingDelegatingContext targetContextWrapper = new
                 RenamingDelegatingContext(
                 new MockContext2(), // The context that most methods are
                                     //delegated to
                 getContext(), // The context that file methods are delegated to
-                filenamePrefix);
+                FILENAME_PREFIX);
         // The default IsolatedContext has a mock AccountManager that doesn't
         // work for us, so override getSystemService to always return null
         mProviderContext = new IsolatedContext(mResolver, targetContextWrapper) {
