diff --git a/src/com/android/browser/AutoFillProfileDatabase.java b/src/com/android/browser/AutoFillProfileDatabase.java
index e3d6ea2..5557aaf 100644
--- a/src/com/android/browser/AutoFillProfileDatabase.java
+++ b/src/com/android/browser/AutoFillProfileDatabase.java
@@ -22,6 +22,7 @@
 import android.database.sqlite.SQLiteOpenHelper;
 import android.provider.BaseColumns;
 import android.util.Log;
+import android.webkit.WebSettings.AutoFillProfile;
 
 public class AutoFillProfileDatabase {
 
@@ -78,13 +79,13 @@
         return writable ? mOpenHelper.getWritableDatabase() : mOpenHelper.getReadableDatabase();
     }
 
-    public void addOrUpdateProfile(final int id, final String fullName, final String email) {
+    public void addOrUpdateProfile(final int id, AutoFillProfile profile) {
         final String SQL = "INSERT OR REPLACE INTO " + PROFILES_TABLE_NAME + " ("
                 + Profiles._ID + ","
                 + Profiles.FULL_NAME + ","
                 + Profiles.EMAIL_ADDRESS
                 + ") VALUES (?,?,?);";
-        final Object[] PARAMS = {id, fullName, email};
+        final Object[] PARAMS = { id, profile.getFullName(), profile.getEmailAddress() };
         getDatabase(true).execSQL(SQL, PARAMS);
     }
 
diff --git a/src/com/android/browser/AutoFillSettingsFragment.java b/src/com/android/browser/AutoFillSettingsFragment.java
index b650ede..e41ca56 100644
--- a/src/com/android/browser/AutoFillSettingsFragment.java
+++ b/src/com/android/browser/AutoFillSettingsFragment.java
@@ -17,26 +17,20 @@
 package com.android.browser;
 
 import android.app.Fragment;
-import android.database.Cursor;
-import android.database.sqlite.SQLiteDatabase;
-import android.os.AsyncTask;
 import android.os.Bundle;
 import android.util.Log;
 import android.view.View;
 import android.view.ViewGroup;
 import android.view.View.OnClickListener;
 import android.view.LayoutInflater;
+import android.webkit.WebSettings.AutoFillProfile;
 import android.widget.Button;
 import android.widget.EditText;
-import android.widget.Toast;
 
 public class AutoFillSettingsFragment extends Fragment {
 
     private static final String LOGTAG = "AutoFillSettingsFragment";
 
-    // TODO: This will become dynamic once we support more than one profile.
-    private int mProfileId = 1;
-
     public AutoFillSettingsFragment() {
 
     }
@@ -59,13 +53,21 @@
                         R.id.autofill_profile_editor_name_edit);
                 EditText email = (EditText)v.findViewById(
                         R.id.autofill_profile_editor_email_address_edit);
-                new SaveProfileToDbTask().execute(fullName.getText().toString(),
-                        email.getText().toString());
+                BrowserSettings.getInstance().setAutoFillProfile(getActivity(),
+                        new AutoFillProfile(
+                                fullName.getText().toString(),
+                                email.getText().toString()));
             }
         });
 
-        // Load the profile and populate the text views in the background
-        new LoadProfileFromDbTask().execute(mProfileId);
+        // Populate the text boxes with any pre existing AutoFill data.
+        EditText fullName = (EditText)v.findViewById(
+                R.id.autofill_profile_editor_name_edit);
+        EditText email = (EditText)v.findViewById(
+                R.id.autofill_profile_editor_email_address_edit);
+        AutoFillProfile activeProfile = BrowserSettings.getInstance().getAutoFillProfile();
+        fullName.setText(activeProfile.getFullName());
+        email.setText(activeProfile.getEmailAddress());
 
         return v;
     }
@@ -77,66 +79,4 @@
         db.close();
         super.onPause();
     }
-
-    private class SaveProfileToDbTask extends AsyncTask<String, Void, Void> {
-        protected Void doInBackground(String... values) {
-            AutoFillProfileDatabase db =
-                    AutoFillProfileDatabase.getInstance(getActivity());
-            db.addOrUpdateProfile(mProfileId, values[0], values[1]);
-            return null;
-        }
-
-        protected void onPostExecute(Void result) {
-            Toast.makeText(getActivity(), "Saved profile", Toast.LENGTH_SHORT).show();
-        }
-    }
-
-    private static class LoadedProfileData {
-        private String mFullName;
-        private String mEmailAddress;
-
-        public LoadedProfileData(String fullName, String emailAddress) {
-            mFullName = fullName;
-            mEmailAddress = emailAddress;
-        }
-
-        public String getFullName() { return mFullName; }
-        public String getEmailAddress() { return mEmailAddress; }
-    }
-
-    private class LoadProfileFromDbTask extends AsyncTask<Integer, Void, LoadedProfileData> {
-        protected LoadedProfileData doInBackground(Integer... id) {
-            AutoFillProfileDatabase db = AutoFillProfileDatabase.getInstance(getActivity());
-            Cursor c = db.getProfile(id[0]);
-            c.moveToFirst();
-
-            LoadedProfileData profileData = null;
-
-            if (c.getCount() > 0) {
-                String fullName = c.getString(c.getColumnIndex(
-                        AutoFillProfileDatabase.Profiles.FULL_NAME));
-                String email = c.getString(c.getColumnIndex(
-                        AutoFillProfileDatabase.Profiles.EMAIL_ADDRESS));
-                profileData =  new LoadedProfileData(fullName, email);
-            }
-           c.close();
-           return profileData;
-        }
-
-        protected void onPostExecute(LoadedProfileData data) {
-            if (data == null) {
-                return;
-            }
-
-            View v = getView();
-            if (v != null) {
-                EditText fullName = (EditText)v.findViewById(
-                        R.id.autofill_profile_editor_name_edit);
-                EditText email = (EditText)v.findViewById(
-                        R.id.autofill_profile_editor_email_address_edit);
-                fullName.setText(data.getFullName());
-                email.setText(data.getEmailAddress());
-            }
-        }
-    }
 }
diff --git a/src/com/android/browser/BrowserSettings.java b/src/com/android/browser/BrowserSettings.java
index 4c798a0..d3c1c00 100644
--- a/src/com/android/browser/BrowserSettings.java
+++ b/src/com/android/browser/BrowserSettings.java
@@ -28,10 +28,14 @@
 import android.content.SharedPreferences;
 import android.content.SharedPreferences.Editor;
 import android.database.ContentObserver;
+import android.database.Cursor;
 import android.net.Uri;
+import android.os.AsyncTask;
 import android.os.Handler;
 import android.preference.PreferenceActivity;
+import android.preference.PreferenceManager;
 import android.preference.PreferenceScreen;
+import android.provider.Browser;
 import android.provider.Settings;
 import android.util.Log;
 import android.webkit.CookieManager;
@@ -41,9 +45,9 @@
 import android.webkit.WebViewDatabase;
 import android.webkit.WebIconDatabase;
 import android.webkit.WebSettings;
+import android.webkit.WebSettings.AutoFillProfile;
 import android.webkit.WebStorage;
-import android.preference.PreferenceManager;
-import android.provider.Browser;
+import android.widget.Toast;
 
 import java.util.HashMap;
 import java.util.Map;
@@ -127,6 +131,12 @@
         WebSettings.ZoomDensity.MEDIUM;
     private static int pageCacheCapacity;
 
+
+    private AutoFillProfile mAutoFillProfile;
+    // TODO: For now we only support one autofill profile. Add support for
+    // multiple profiles later.
+    private int mActiveAutoFillProfileId = 1;
+
     // Preference keys that are used outside this class
     public final static String PREF_CLEAR_CACHE = "privacy_clear_cache";
     public final static String PREF_CLEAR_COOKIES = "privacy_clear_cookies";
@@ -255,6 +265,9 @@
             s.setDatabasePath(b.databasePath);
             s.setGeolocationDatabasePath(b.geolocationDatabasePath);
 
+            // Active AutoFill profile data.
+            s.setAutoFillProfile(b.mAutoFillProfile);
+
             b.updateTabControlSettings();
         }
     }
@@ -300,6 +313,23 @@
             pageCacheCapacity = 1;
         }
 
+        // Load the autofill profile data from the database. We use a database separate
+        // to the browser preference DB to make it easier to support multiple profiles
+        // and switching between them.
+        mAutoFillProfile = new AutoFillProfile();
+        AutoFillProfileDatabase autoFillDb = AutoFillProfileDatabase.getInstance(ctx);
+        Cursor c = autoFillDb.getProfile(mActiveAutoFillProfileId);
+
+        if (c.getCount() > 0) {
+            c.moveToFirst();
+            mAutoFillProfile.setFullName(c.getString(c.getColumnIndex(
+                    AutoFillProfileDatabase.Profiles.FULL_NAME)));
+            mAutoFillProfile.setEmailAddress(c.getString(c.getColumnIndex(
+                    AutoFillProfileDatabase.Profiles.EMAIL_ADDRESS)));
+        }
+        c.close();
+        autoFillDb.close();
+
         // PreferenceManager.setDefaultValues is TOO SLOW, need to manually keep
         // the defaults in sync
         syncSharedPreferences(ctx, p);
@@ -477,6 +507,17 @@
         update();
     }
 
+    public void setAutoFillProfile(Context ctx, AutoFillProfile profile) {
+        mAutoFillProfile = profile;
+        // Update the AutoFill DB
+        new SaveProfileToDbTask(ctx).execute(mAutoFillProfile);
+
+    }
+
+    public AutoFillProfile getAutoFillProfile() {
+        return mAutoFillProfile;
+    }
+
     /**
      * Add a WebSettings object to the list of observers that will be updated
      * when update() is called.
@@ -641,4 +682,26 @@
         geolocationEnabled = true;
         workersEnabled = true;  // only affects V8. JSC does not have a similar setting
     }
+
+    private class SaveProfileToDbTask extends AsyncTask<AutoFillProfile, Void, Void> {
+
+        Context mContext;
+
+        public SaveProfileToDbTask(Context ctx) {
+            mContext = ctx;
+        }
+
+        protected Void doInBackground(AutoFillProfile... values) {
+            AutoFillProfileDatabase db =
+                    AutoFillProfileDatabase.getInstance(mContext);
+            db.addOrUpdateProfile(mActiveAutoFillProfileId, values[0]);
+            return null;
+        }
+
+        protected void onPostExecute(Void result) {
+            String message = mContext.getString(R.string.autofill_profile_successful_save);
+            Toast.makeText(mContext, message, Toast.LENGTH_SHORT).show();
+        }
+    }
+
 }
