diff --git a/src/com/android/email/activity/setup/AccountCheckSettingsFragment.java b/src/com/android/email/activity/setup/AccountCheckSettingsFragment.java
index e7ea824..821a55c 100644
--- a/src/com/android/email/activity/setup/AccountCheckSettingsFragment.java
+++ b/src/com/android/email/activity/setup/AccountCheckSettingsFragment.java
@@ -69,7 +69,7 @@
     private final static int STATE_AUTODISCOVER_AUTH_DIALOG = 7;    // terminal
     private final static int STATE_AUTODISCOVER_RESULT = 8;         // terminal
     private int mState = STATE_START;
-    private SetupData mSetupData;
+    private SetupDataFragment mSetupData;
 
     // Support for UI
     private boolean mAttached;
@@ -106,13 +106,13 @@
          * Called when CheckSettings completed
          * @param result check settings result code - success is CHECK_SETTINGS_OK
          */
-        public void onCheckSettingsComplete(int result, SetupData setupData);
+        public void onCheckSettingsComplete(int result, SetupDataFragment setupData);
 
         /**
          * Called when autodiscovery completes.
          * @param result autodiscovery result code - success is AUTODISCOVER_OK
          */
-        public void onAutoDiscoverComplete(int result, SetupData setupData);
+        public void onAutoDiscoverComplete(int result, SetupDataFragment setupData);
     }
 
     // Public no-args constructor needed for fragment re-instantiation
@@ -153,8 +153,8 @@
         // If this is the first time, start the AsyncTask
         if (mAccountCheckTask == null) {
             final int checkMode = getTargetRequestCode();
-            final SetupData.SetupDataContainer container =
-                    (SetupData.SetupDataContainer) getActivity();
+            final SetupDataFragment.SetupDataContainer container =
+                    (SetupDataFragment.SetupDataContainer) getActivity();
             mSetupData = container.getSetupData();
             final Account checkAccount = mSetupData.getAccount();
             mAccountCheckTask = (AccountCheckTask)
@@ -440,7 +440,7 @@
         @Override
         protected MessagingException doInBackground(Void... params) {
             try {
-                if ((mMode & SetupData.CHECK_AUTODISCOVER) != 0) {
+                if ((mMode & SetupDataFragment.CHECK_AUTODISCOVER) != 0) {
                     if (isCancelled()) return null;
                     publishProgress(STATE_CHECK_AUTODISCOVER);
                     LogUtils.d(Logging.LOG_TAG, "Begin auto-discover for " + mCheckEmail);
@@ -468,7 +468,7 @@
                 }
 
                 // Check Incoming Settings
-                if ((mMode & SetupData.CHECK_INCOMING) != 0) {
+                if ((mMode & SetupDataFragment.CHECK_INCOMING) != 0) {
                     if (isCancelled()) return null;
                     LogUtils.d(Logging.LOG_TAG, "Begin check of incoming email settings");
                     publishProgress(STATE_CHECK_INCOMING);
@@ -513,7 +513,7 @@
                 final EmailServiceInfo info = EmailServiceUtils.getServiceInfo(mContext, protocol);
 
                 // Check Outgoing Settings
-                if (info.usesSmtp && (mMode & SetupData.CHECK_OUTGOING) != 0) {
+                if (info.usesSmtp && (mMode & SetupDataFragment.CHECK_OUTGOING) != 0) {
                     if (isCancelled()) return null;
                     LogUtils.d(Logging.LOG_TAG, "Begin check of outgoing email settings");
                     publishProgress(STATE_CHECK_OUTGOING);
diff --git a/src/com/android/email/activity/setup/AccountServerBaseFragment.java b/src/com/android/email/activity/setup/AccountServerBaseFragment.java
index dad261a..29f505d 100644
--- a/src/com/android/email/activity/setup/AccountServerBaseFragment.java
+++ b/src/com/android/email/activity/setup/AccountServerBaseFragment.java
@@ -62,7 +62,7 @@
     /*package*/ HostAuth mLoadedSendAuth;
     /*package*/ HostAuth mLoadedRecvAuth;
 
-    protected SetupData mSetupData;
+    protected SetupDataFragment mSetupData;
 
     // This is null in the setup wizard screens, and non-null in AccountSettings mode
     private Button mProceedButton;
@@ -82,7 +82,7 @@
 
         /**
          * Called when user clicks "next".  Starts account checker.
-         * @param checkMode values from {@link SetupData}
+         * @param checkMode values from {@link SetupDataFragment}
          * @param target the fragment that requested the check
          */
         public void onProceedNext(int checkMode, AccountServerBaseFragment target);
@@ -93,14 +93,14 @@
          * @param result check settings result code - success is CHECK_SETTINGS_OK
          * @param setupData possibly modified SetupData
          */
-        public void onCheckSettingsComplete(int result, SetupData setupData);
+        public void onCheckSettingsComplete(int result, SetupDataFragment setupData);
     }
 
     private static class EmptyCallback implements Callback {
         public static final Callback INSTANCE = new EmptyCallback();
         @Override public void onEnableProceedButtons(boolean enable) { }
         @Override public void onProceedNext(int checkMode, AccountServerBaseFragment target) { }
-        @Override public void onCheckSettingsComplete(int result, SetupData setupData) { }
+        @Override public void onCheckSettingsComplete(int result, SetupDataFragment setupData) { }
     }
 
     /**
@@ -154,7 +154,8 @@
         if (mSettingsMode && savedInstanceState != null) {
             mContext.setTitle(savedInstanceState.getString(BUNDLE_KEY_ACTIVITY_TITLE));
         }
-        SetupData.SetupDataContainer container = (SetupData.SetupDataContainer) mContext;
+        SetupDataFragment.SetupDataContainer container =
+                (SetupDataFragment.SetupDataContainer) mContext;
         mSetupData = container.getSetupData();
 
         super.onActivityCreated(savedInstanceState);
@@ -302,13 +303,13 @@
      * exit to previous fragment.
      */
     @Override
-    public void onCheckSettingsComplete(final int settingsResult, SetupData setupData) {
+    public void onCheckSettingsComplete(final int settingsResult, SetupDataFragment setupData) {
         mSetupData = setupData;
         new AsyncTask<Void, Void, Void>() {
             @Override
             protected Void doInBackground(Void... params) {
                 if (settingsResult == AccountCheckSettingsFragment.CHECK_SETTINGS_OK) {
-                    if (mSetupData.getFlowMode() == SetupData.FLOW_MODE_EDIT) {
+                    if (mSetupData.getFlowMode() == SetupDataFragment.FLOW_MODE_EDIT) {
                         saveSettingsAfterEdit();
                     } else {
                         saveSettingsAfterSetup();
@@ -330,7 +331,7 @@
      * This is overridden only by AccountSetupExchange
      */
     @Override
-    public void onAutoDiscoverComplete(int result, SetupData setupData) {
+    public void onAutoDiscoverComplete(int result, SetupDataFragment setupData) {
         throw new IllegalStateException();
     }
 
diff --git a/src/com/android/email/activity/setup/AccountSettings.java b/src/com/android/email/activity/setup/AccountSettings.java
index ebd0508..a1f94f0 100644
--- a/src/com/android/email/activity/setup/AccountSettings.java
+++ b/src/com/android/email/activity/setup/AccountSettings.java
@@ -72,7 +72,7 @@
  *       dealing with accounts being added/deleted and triggering the header reload.
  */
 public class AccountSettings extends PreferenceActivity implements FeedbackEnabledActivity,
-        SetupData.SetupDataContainer {
+        SetupDataFragment.SetupDataContainer {
     /*
      * Intent to open account settings for account=1
         adb shell am start -a android.intent.action.EDIT \
@@ -120,7 +120,7 @@
     private Uri mFeedbackUri;
     private MenuItem mFeedbackMenuItem;
 
-    private SetupData mSetupData;
+    private SetupDataFragment mSetupData;
 
     // Async Tasks
     private LoadAccountListTask mLoadAccountListTask;
@@ -227,7 +227,7 @@
                 }
             }
         } else {
-            mSetupData = savedInstanceState.getParcelable(SetupData.EXTRA_SETUP_DATA);
+            mSetupData = savedInstanceState.getParcelable(SetupDataFragment.EXTRA_SETUP_DATA);
         }
         mShowDebugMenu = i.getBooleanExtra(EXTRA_ENABLE_DEBUG, false);
 
@@ -253,7 +253,8 @@
     protected void onSaveInstanceState(Bundle outState) {
         super.onSaveInstanceState(
                 outState);
-        outState.putParcelable(SetupData.EXTRA_SETUP_DATA, mSetupData);
+        // TODO: use the fragment manager to persist this
+        outState.putParcelable(SetupDataFragment.EXTRA_SETUP_DATA, mSetupData);
     }
 
     @Override
@@ -660,7 +661,7 @@
          * simply does a "back" to exit the settings screen.
          */
         @Override
-        public void onCheckSettingsComplete(int result, SetupData setupData) {
+        public void onCheckSettingsComplete(int result, SetupDataFragment setupData) {
             if (result == AccountCheckSettingsFragment.CHECK_SETTINGS_OK) {
                 // Settings checked & saved; clear current fragment
                 mCurrentFragment = null;
@@ -705,7 +706,7 @@
      */
     public void onIncomingSettings(Account account) {
         try {
-            mSetupData = new SetupData(SetupData.FLOW_MODE_EDIT, account);
+            mSetupData = new SetupDataFragment(SetupDataFragment.FLOW_MODE_EDIT, account);
             final Fragment f = new AccountSetupIncomingFragment();
             f.setArguments(AccountSetupIncomingFragment.getArgs(true));
             // Use startPreferenceFragment here because we need to keep this activity instance
@@ -722,7 +723,7 @@
      */
     public void onOutgoingSettings(Account account) {
         try {
-            mSetupData = new SetupData(SetupData.FLOW_MODE_EDIT, account);
+            mSetupData = new SetupDataFragment(SetupDataFragment.FLOW_MODE_EDIT, account);
             final Fragment f = new AccountSetupOutgoingFragment();
             f.setArguments(AccountSetupOutgoingFragment.getArgs(true));
             // Use startPreferenceFragment here because we need to keep this activity instance
@@ -926,12 +927,12 @@
     }
 
     @Override
-    public SetupData getSetupData() {
+    public SetupDataFragment getSetupData() {
         return mSetupData;
     }
 
     @Override
-    public void setSetupData(SetupData setupData) {
+    public void setSetupData(SetupDataFragment setupData) {
         mSetupData = setupData;
     }
 }
diff --git a/src/com/android/email/activity/setup/AccountSetupActivity.java b/src/com/android/email/activity/setup/AccountSetupActivity.java
index fb29581..fd6e63d 100644
--- a/src/com/android/email/activity/setup/AccountSetupActivity.java
+++ b/src/com/android/email/activity/setup/AccountSetupActivity.java
@@ -17,6 +17,7 @@
 package com.android.email.activity.setup;
 
 import android.app.Activity;
+import android.app.FragmentTransaction;
 import android.os.Bundle;
 
 import com.android.emailcommon.Logging;
@@ -26,25 +27,37 @@
  * Superclass of all of the account setup activities; ensures that SetupData state is saved/restored
  * automatically as required
  */
-public class AccountSetupActivity extends Activity implements SetupData.SetupDataContainer {
+public class AccountSetupActivity extends Activity implements SetupDataFragment.SetupDataContainer {
     private static final boolean DEBUG_SETUP_FLOWS = false;  // Don't check in set to true
-    protected SetupData mSetupData;
+    protected SetupDataFragment mSetupData;
 
+    private static final String SETUP_DATA_FRAGMENT_TAG = "setupData";
     @Override
     public void onCreate(Bundle savedInstanceState) {
-        if (savedInstanceState != null) {
-            mSetupData = savedInstanceState.getParcelable(SetupData.EXTRA_SETUP_DATA);
-        } else {
+        super.onCreate(savedInstanceState);
+
+        if (savedInstanceState == null) {
             final Bundle b = getIntent().getExtras();
             if (b != null) {
-                mSetupData = b.getParcelable(SetupData.EXTRA_SETUP_DATA);
+                mSetupData = b.getParcelable(SetupDataFragment.EXTRA_SETUP_DATA);
+                if (mSetupData != null) {
+                    final FragmentTransaction ft = getFragmentManager().beginTransaction();
+                    ft.add(mSetupData, SETUP_DATA_FRAGMENT_TAG);
+                    ft.commit();
+                }
             }
-        }
-        if (mSetupData == null) {
-            mSetupData = new SetupData();
+        } else {
+            mSetupData = (SetupDataFragment)getFragmentManager()
+                    .findFragmentByTag(SETUP_DATA_FRAGMENT_TAG);
         }
 
-        super.onCreate(savedInstanceState);
+        if (mSetupData == null) {
+            mSetupData = new SetupDataFragment();
+            final FragmentTransaction ft = getFragmentManager().beginTransaction();
+            ft.add(mSetupData, SETUP_DATA_FRAGMENT_TAG);
+            ft.commit();
+        }
+
         if (DEBUG_SETUP_FLOWS) {
             LogUtils.d(Logging.LOG_TAG, "%s onCreate %s", getClass().getName(),
                     mSetupData.debugString());
@@ -52,18 +65,12 @@
     }
 
     @Override
-    public void onSaveInstanceState(Bundle outState) {
-        super.onSaveInstanceState(outState);
-        outState.putParcelable(SetupData.EXTRA_SETUP_DATA, mSetupData);
-    }
-
-    @Override
-    public SetupData getSetupData() {
+    public SetupDataFragment getSetupData() {
         return mSetupData;
     }
 
     @Override
-    public void setSetupData(SetupData setupData) {
+    public void setSetupData(SetupDataFragment setupData) {
         mSetupData = setupData;
     }
 }
diff --git a/src/com/android/email/activity/setup/AccountSetupBasics.java b/src/com/android/email/activity/setup/AccountSetupBasics.java
index 254f0d1..3ab2bea 100644
--- a/src/com/android/email/activity/setup/AccountSetupBasics.java
+++ b/src/com/android/email/activity/setup/AccountSetupBasics.java
@@ -126,13 +126,13 @@
 
     public static void actionNewAccount(Activity fromActivity) {
         final Intent i = new Intent(fromActivity, AccountSetupBasics.class);
-        i.putExtra(EXTRA_FLOW_MODE, SetupData.FLOW_MODE_NORMAL);
+        i.putExtra(EXTRA_FLOW_MODE, SetupDataFragment.FLOW_MODE_NORMAL);
         fromActivity.startActivity(i);
     }
 
     public static void actionNewAccountWithResult(Activity fromActivity) {
         final Intent i = new ForwardingIntent(fromActivity, AccountSetupBasics.class);
-        i.putExtra(EXTRA_FLOW_MODE, SetupData.FLOW_MODE_NO_ACCOUNTS);
+        i.putExtra(EXTRA_FLOW_MODE, SetupDataFragment.FLOW_MODE_NO_ACCOUNTS);
         fromActivity.startActivity(i);
     }
 
@@ -142,7 +142,7 @@
      */
     public static Intent actionGetCreateAccountIntent(Context context, String accountManagerType) {
         final Intent i = new Intent(context, AccountSetupBasics.class);
-        i.putExtra(EXTRA_FLOW_MODE, SetupData.FLOW_MODE_ACCOUNT_MANAGER);
+        i.putExtra(EXTRA_FLOW_MODE, SetupDataFragment.FLOW_MODE_ACCOUNT_MANAGER);
         i.putExtra(EXTRA_FLOW_ACCOUNT_TYPE, accountManagerType);
         return i;
     }
@@ -155,7 +155,8 @@
         final Intent i= new ForwardingIntent(fromActivity, AccountSetupBasics.class);
         // If we're in the "account flow" (from AccountManager), we want to return to the caller
         // (in the settings app)
-        i.putExtra(SetupData.EXTRA_SETUP_DATA, new SetupData(SetupData.FLOW_MODE_RETURN_TO_CALLER));
+        i.putExtra(SetupDataFragment.EXTRA_SETUP_DATA,
+                new SetupDataFragment(SetupDataFragment.FLOW_MODE_RETURN_TO_CALLER));
         i.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
         fromActivity.startActivity(i);
     }
@@ -167,8 +168,8 @@
 
         final Intent i= new ForwardingIntent(fromActivity, AccountSetupBasics.class);
         // If we're in the "no accounts" flow, we want to return to the caller with a result
-        i.putExtra(SetupData.EXTRA_SETUP_DATA,
-                new SetupData(SetupData.FLOW_MODE_RETURN_NO_ACCOUNTS_RESULT));
+        i.putExtra(SetupDataFragment.EXTRA_SETUP_DATA,
+                new SetupDataFragment(SetupDataFragment.FLOW_MODE_RETURN_NO_ACCOUNTS_RESULT));
         i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
         fromActivity.startActivity(i);
     }
@@ -177,8 +178,8 @@
         final Intent i = new Intent(fromActivity, AccountSetupBasics.class);
         // If we're not in the "account flow" (from AccountManager), we want to show the
         // message list for the new inbox
-        i.putExtra(SetupData.EXTRA_SETUP_DATA,
-                new SetupData(SetupData.FLOW_MODE_RETURN_TO_MESSAGE_LIST, account));
+        i.putExtra(SetupDataFragment.EXTRA_SETUP_DATA,
+                new SetupDataFragment(SetupDataFragment.FLOW_MODE_RETURN_TO_MESSAGE_LIST, account));
         i.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
         fromActivity.startActivity(i);
     }
@@ -197,22 +198,22 @@
             INTENT_CREATE_ACCOUNT = getString(R.string.intent_create_account);
         }
         if (INTENT_CREATE_ACCOUNT.equals(action)) {
-            mSetupData = new SetupData(SetupData.FLOW_MODE_FORCE_CREATE);
+            mSetupData = new SetupDataFragment(SetupDataFragment.FLOW_MODE_FORCE_CREATE);
         } else {
             final int intentFlowMode =
-                    intent.getIntExtra(EXTRA_FLOW_MODE, SetupData.FLOW_MODE_UNSPECIFIED);
-            if (intentFlowMode != SetupData.FLOW_MODE_UNSPECIFIED) {
-                mSetupData = new SetupData(intentFlowMode,
+                    intent.getIntExtra(EXTRA_FLOW_MODE, SetupDataFragment.FLOW_MODE_UNSPECIFIED);
+            if (intentFlowMode != SetupDataFragment.FLOW_MODE_UNSPECIFIED) {
+                mSetupData = new SetupDataFragment(intentFlowMode,
                         intent.getStringExtra(EXTRA_FLOW_ACCOUNT_TYPE));
             }
         }
 
         final int flowMode = mSetupData.getFlowMode();
-        if (flowMode == SetupData.FLOW_MODE_RETURN_TO_CALLER) {
+        if (flowMode == SetupDataFragment.FLOW_MODE_RETURN_TO_CALLER) {
             // Return to the caller who initiated account creation
             finish();
             return;
-        } else if (flowMode == SetupData.FLOW_MODE_RETURN_NO_ACCOUNTS_RESULT) {
+        } else if (flowMode == SetupDataFragment.FLOW_MODE_RETURN_NO_ACCOUNTS_RESULT) {
             if (EmailContent.count(this, Account.CONTENT_URI) > 0) {
                 setResult(RESULT_OK);
             } else {
@@ -220,7 +221,7 @@
             }
             finish();
             return;
-        } else if (flowMode == SetupData.FLOW_MODE_RETURN_TO_MESSAGE_LIST) {
+        } else if (flowMode == SetupDataFragment.FLOW_MODE_RETURN_TO_MESSAGE_LIST) {
             final Account account = mSetupData.getAccount();
             if (account != null && account.mId >= 0) {
                 // Show the message list for the new account
@@ -280,7 +281,7 @@
 
         // Handle force account creation immediately (now that fragment is set up)
         // This is never allowed in a normal user build and will exit immediately.
-        if (mSetupData.getFlowMode() == SetupData.FLOW_MODE_FORCE_CREATE) {
+        if (mSetupData.getFlowMode() == SetupDataFragment.FLOW_MODE_FORCE_CREATE) {
             if (!DEBUG_ALLOW_NON_TEST_HARNESS_CREATION &&
                     !ActivityManager.isRunningInTestHarness()) {
                 LogUtils.e(Logging.LOG_TAG,
@@ -540,7 +541,8 @@
                 if (mAutoSetup) {
                     final AccountCheckSettingsFragment checkerFragment =
                         AccountCheckSettingsFragment.newInstance(
-                            SetupData.CHECK_INCOMING | SetupData.CHECK_OUTGOING, null);
+                            SetupDataFragment.CHECK_INCOMING | SetupDataFragment.CHECK_OUTGOING,
+                                null);
                     final FragmentTransaction transaction = getFragmentManager().beginTransaction();
                     transaction.add(checkerFragment, AccountCheckSettingsFragment.TAG);
                     transaction.addToBackStack("back");
@@ -681,7 +683,7 @@
      * so we inhibit reporting any error back to the Account manager.
      */
     @Override
-    public void onCheckSettingsComplete(int result, SetupData setupData) {
+    public void onCheckSettingsComplete(int result, SetupDataFragment setupData) {
         mSetupData = setupData;
         if (result == AccountCheckSettingsFragment.CHECK_SETTINGS_OK) {
             AccountSetupOptions.actionOptions(this, mSetupData);
@@ -695,7 +697,7 @@
      * This is overridden only by AccountSetupIncoming
      */
     @Override
-    public void onAutoDiscoverComplete(int result, SetupData setupData) {
+    public void onAutoDiscoverComplete(int result, SetupDataFragment setupData) {
         throw new IllegalStateException();
     }
 
diff --git a/src/com/android/email/activity/setup/AccountSetupIncoming.java b/src/com/android/email/activity/setup/AccountSetupIncoming.java
index 36cad86..6b8c592 100644
--- a/src/com/android/email/activity/setup/AccountSetupIncoming.java
+++ b/src/com/android/email/activity/setup/AccountSetupIncoming.java
@@ -53,10 +53,10 @@
 
     // Extras for AccountSetupIncoming intent
 
-    public static void actionIncomingSettings(Activity fromActivity, SetupData setupData) {
+    public static void actionIncomingSettings(Activity fromActivity, SetupDataFragment setupData) {
         final Intent intent = new Intent(fromActivity, AccountSetupIncoming.class);
         // Add the additional information to the intent, in case the Email process is killed.
-        intent.putExtra(SetupData.EXTRA_SETUP_DATA, setupData);
+        intent.putExtra(SetupDataFragment.EXTRA_SETUP_DATA, setupData);
         fromActivity.startActivity(intent);
     }
 
@@ -141,11 +141,11 @@
         final String username = account.mHostAuthRecv.mLogin;
         final String password = account.mHostAuthRecv.mPassword;
         if (username != null && password != null) {
-            onProceedNext(SetupData.CHECK_AUTODISCOVER, mFragment);
+            onProceedNext(SetupDataFragment.CHECK_AUTODISCOVER, mFragment);
         }
     }
 
-    public void onAutoDiscoverComplete(int result, SetupData setupData) {
+    public void onAutoDiscoverComplete(int result, SetupDataFragment setupData) {
         // If authentication failed, exit immediately (to re-enter credentials)
         mSetupData = setupData;
         if (result == AccountCheckSettingsFragment.AUTODISCOVER_AUTHENTICATION) {
@@ -190,7 +190,7 @@
      * If the checked settings are OK, proceed to outgoing settings screen
      */
     @Override
-    public void onCheckSettingsComplete(int result, SetupData setupData) {
+    public void onCheckSettingsComplete(int result, SetupDataFragment setupData) {
         mSetupData = setupData;
         if (result == AccountCheckSettingsFragment.CHECK_SETTINGS_OK) {
             if (mServiceInfo.usesSmtp) {
diff --git a/src/com/android/email/activity/setup/AccountSetupIncomingFragment.java b/src/com/android/email/activity/setup/AccountSetupIncomingFragment.java
index d14bb04..817f6d0 100644
--- a/src/com/android/email/activity/setup/AccountSetupIncomingFragment.java
+++ b/src/com/android/email/activity/setup/AccountSetupIncomingFragment.java
@@ -187,7 +187,8 @@
         mClientCertificateSelector.setHostActivity(this);
 
         final Context context = getActivity();
-        final SetupData.SetupDataContainer container = (SetupData.SetupDataContainer) context;
+        final SetupDataFragment.SetupDataContainer container =
+                (SetupDataFragment.SetupDataContainer) context;
         mSetupData = container.getSetupData();
 
         final HostAuth recvAuth = mSetupData.getAccount().mHostAuthRecv;
@@ -566,7 +567,7 @@
         }
         recvAuth.mClientCertAlias = mClientCertificateSelector.getCertificate();
 
-        mCallback.onProceedNext(SetupData.CHECK_INCOMING, this);
+        mCallback.onProceedNext(SetupDataFragment.CHECK_INCOMING, this);
         clearButtonBounce();
     }
 
@@ -590,7 +591,7 @@
      * Implements AccountCheckSettingsFragment.Callbacks
      */
     @Override
-    public void onAutoDiscoverComplete(int result, SetupData setupData) {
+    public void onAutoDiscoverComplete(int result, SetupDataFragment setupData) {
         mSetupData = setupData;
         final AccountSetupIncoming activity = (AccountSetupIncoming) getActivity();
         activity.onAutoDiscoverComplete(result, setupData);
diff --git a/src/com/android/email/activity/setup/AccountSetupNames.java b/src/com/android/email/activity/setup/AccountSetupNames.java
index b901fec..b7c6476 100644
--- a/src/com/android/email/activity/setup/AccountSetupNames.java
+++ b/src/com/android/email/activity/setup/AccountSetupNames.java
@@ -59,9 +59,9 @@
     private boolean mRequiresName = true;
     private boolean mIsCompleting = false;
 
-    public static void actionSetNames(Activity fromActivity, SetupData setupData) {
+    public static void actionSetNames(Activity fromActivity, SetupDataFragment setupData) {
         ForwardingIntent intent = new ForwardingIntent(fromActivity, AccountSetupNames.class);
-        intent.putExtra(SetupData.EXTRA_SETUP_DATA, setupData);
+        intent.putExtra(SetupDataFragment.EXTRA_SETUP_DATA, setupData);
         fromActivity.startActivity(intent);
     }
 
@@ -108,8 +108,8 @@
 
         final int flowMode = mSetupData.getFlowMode();
 
-        if (flowMode != SetupData.FLOW_MODE_FORCE_CREATE
-                && flowMode != SetupData.FLOW_MODE_EDIT) {
+        if (flowMode != SetupDataFragment.FLOW_MODE_FORCE_CREATE
+                && flowMode != SetupDataFragment.FLOW_MODE_EDIT) {
             final String accountEmail = account.mEmailAddress;
             mDescription.setText(accountEmail);
 
@@ -127,8 +127,8 @@
         } else {
             if (account.getSenderName() != null) {
                 mName.setText(account.getSenderName());
-            } else if (flowMode != SetupData.FLOW_MODE_FORCE_CREATE
-                    && flowMode != SetupData.FLOW_MODE_EDIT) {
+            } else if (flowMode != SetupDataFragment.FLOW_MODE_FORCE_CREATE
+                    && flowMode != SetupDataFragment.FLOW_MODE_EDIT) {
                 // Attempt to prefill the name field from the profile if we don't have it,
                 prefillNameFromProfile();
             }
@@ -138,7 +138,7 @@
         validateFields();
 
         // Proceed immediately if in account creation mode
-        if (flowMode == SetupData.FLOW_MODE_FORCE_CREATE) {
+        if (flowMode == SetupDataFragment.FLOW_MODE_FORCE_CREATE) {
             onNext();
         }
     }
@@ -189,9 +189,9 @@
     }
 
     private void finishActivity() {
-        if (mSetupData.getFlowMode() == SetupData.FLOW_MODE_NO_ACCOUNTS) {
+        if (mSetupData.getFlowMode() == SetupDataFragment.FLOW_MODE_NO_ACCOUNTS) {
             AccountSetupBasics.actionAccountCreateFinishedWithResult(this);
-        } else if (mSetupData.getFlowMode() != SetupData.FLOW_MODE_NORMAL) {
+        } else if (mSetupData.getFlowMode() != SetupDataFragment.FLOW_MODE_NORMAL) {
             AccountSetupBasics.actionAccountCreateFinishedAccountFlow(this);
         } else {
             final Account account = mSetupData.getAccount();
diff --git a/src/com/android/email/activity/setup/AccountSetupOptions.java b/src/com/android/email/activity/setup/AccountSetupOptions.java
index faf63ce..5c26ad2 100644
--- a/src/com/android/email/activity/setup/AccountSetupOptions.java
+++ b/src/com/android/email/activity/setup/AccountSetupOptions.java
@@ -76,9 +76,9 @@
     /** Default sync window for new EAS accounts */
     private static final int SYNC_WINDOW_EAS_DEFAULT = SyncWindow.SYNC_WINDOW_1_WEEK;
 
-    public static void actionOptions(Activity fromActivity, SetupData setupData) {
+    public static void actionOptions(Activity fromActivity, SetupDataFragment setupData) {
         final Intent intent = new ForwardingIntent(fromActivity, AccountSetupOptions.class);
-        intent.putExtra(SetupData.EXTRA_SETUP_DATA, setupData);
+        intent.putExtra(SetupDataFragment.EXTRA_SETUP_DATA, setupData);
         fromActivity.startActivity(intent);
     }
 
@@ -149,7 +149,7 @@
         if (mIsProcessing) {
             // We are already processing, so just show the dialog until we finish
             showCreateAccountDialog();
-        } else if (mSetupData.getFlowMode() == SetupData.FLOW_MODE_FORCE_CREATE) {
+        } else if (mSetupData.getFlowMode() == SetupDataFragment.FLOW_MODE_FORCE_CREATE) {
             // If we are just visiting here to fill in details, exit immediately
             onDone();
         }
diff --git a/src/com/android/email/activity/setup/AccountSetupOutgoing.java b/src/com/android/email/activity/setup/AccountSetupOutgoing.java
index 52bfdf2..c7570cf 100644
--- a/src/com/android/email/activity/setup/AccountSetupOutgoing.java
+++ b/src/com/android/email/activity/setup/AccountSetupOutgoing.java
@@ -42,9 +42,9 @@
     private Button mNextButton;
     /* package */ boolean mNextButtonEnabled;
 
-    public static void actionOutgoingSettings(Activity fromActivity, SetupData setupData) {
+    public static void actionOutgoingSettings(Activity fromActivity, SetupDataFragment setupData) {
         Intent intent = new Intent(fromActivity, AccountSetupOutgoing.class);
-        intent.putExtra(SetupData.EXTRA_SETUP_DATA, setupData);
+        intent.putExtra(SetupDataFragment.EXTRA_SETUP_DATA, setupData);
         fromActivity.startActivity(intent);
     }
 
@@ -110,7 +110,7 @@
      * If the checked settings are OK, proceed to options screen
      */
     @Override
-    public void onCheckSettingsComplete(int result, SetupData setupData) {
+    public void onCheckSettingsComplete(int result, SetupDataFragment setupData) {
         mSetupData = setupData;
         if (result == AccountCheckSettingsFragment.CHECK_SETTINGS_OK) {
             AccountSetupOptions.actionOptions(this, mSetupData);
diff --git a/src/com/android/email/activity/setup/AccountSetupOutgoingFragment.java b/src/com/android/email/activity/setup/AccountSetupOutgoingFragment.java
index a64f0ab..a8e7717 100644
--- a/src/com/android/email/activity/setup/AccountSetupOutgoingFragment.java
+++ b/src/com/android/email/activity/setup/AccountSetupOutgoingFragment.java
@@ -387,7 +387,7 @@
         sendAuth.setConnection(mBaseScheme, serverAddress, serverPort, securityType);
         sendAuth.mDomain = null;
 
-        mCallback.onProceedNext(SetupData.CHECK_OUTGOING, this);
+        mCallback.onProceedNext(SetupDataFragment.CHECK_OUTGOING, this);
         clearButtonBounce();
     }
 }
diff --git a/src/com/android/email/activity/setup/AccountSetupType.java b/src/com/android/email/activity/setup/AccountSetupType.java
index c40dcb5..1b2a7ad 100644
--- a/src/com/android/email/activity/setup/AccountSetupType.java
+++ b/src/com/android/email/activity/setup/AccountSetupType.java
@@ -47,9 +47,9 @@
 
     private boolean mButtonPressed;
 
-    public static void actionSelectAccountType(Activity fromActivity, SetupData setupData) {
+    public static void actionSelectAccountType(Activity fromActivity, SetupDataFragment setupData) {
         final Intent i = new ForwardingIntent(fromActivity, AccountSetupType.class);
-        i.putExtra(SetupData.EXTRA_SETUP_DATA, setupData);
+        i.putExtra(SetupDataFragment.EXTRA_SETUP_DATA, setupData);
         fromActivity.startActivity(i);
     }
 
@@ -60,7 +60,7 @@
 
         final String accountType = mSetupData.getFlowAccountType();
         // If we're in account setup flow mode, see if there's just one protocol that matches
-        if (mSetupData.getFlowMode() == SetupData.FLOW_MODE_ACCOUNT_MANAGER) {
+        if (mSetupData.getFlowMode() == SetupDataFragment.FLOW_MODE_ACCOUNT_MANAGER) {
             int matches = 0;
             String protocol = null;
             for (EmailServiceInfo info: EmailServiceUtils.getServiceInfoList(this)) {
@@ -126,10 +126,11 @@
         final HostAuth recvAuth = account.getOrCreateHostAuthRecv(this);
         final EmailServiceInfo info = EmailServiceUtils.getServiceInfo(this, recvAuth.mProtocol);
         if (info.usesAutodiscover) {
-            mSetupData.setCheckSettingsMode(SetupData.CHECK_AUTODISCOVER);
+            mSetupData.setCheckSettingsMode(SetupDataFragment.CHECK_AUTODISCOVER);
         } else {
             mSetupData.setCheckSettingsMode(
-                    SetupData.CHECK_INCOMING | (info.usesSmtp ? SetupData.CHECK_OUTGOING : 0));
+                    SetupDataFragment.CHECK_INCOMING |
+                            (info.usesSmtp ? SetupDataFragment.CHECK_OUTGOING : 0));
         }
         recvAuth.mLogin = recvAuth.mLogin + "@" + recvAuth.mAddress;
         AccountSetupBasics.setDefaultsForProtocol(this, account);
diff --git a/src/com/android/email/activity/setup/SetupData.java b/src/com/android/email/activity/setup/SetupData.java
deleted file mode 100644
index fc680db..0000000
--- a/src/com/android/email/activity/setup/SetupData.java
+++ /dev/null
@@ -1,231 +0,0 @@
-/*
- * Copyright (C) 2010 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.email.activity.setup;
-
-import android.accounts.AccountAuthenticatorResponse;
-import android.os.Bundle;
-import android.os.Parcel;
-import android.os.Parcelable;
-
-import com.android.emailcommon.provider.Account;
-import com.android.emailcommon.provider.Policy;
-
-public class SetupData implements Parcelable {
-    // The "extra" name for the Bundle saved with SetupData
-    public static final String EXTRA_SETUP_DATA = "com.android.email.setupdata";
-
-    // NORMAL is the standard entry from the Email app; EAS and POP_IMAP are used when entering via
-    // Settings -> Accounts
-    public static final int FLOW_MODE_UNSPECIFIED = -1;
-    public static final int FLOW_MODE_NORMAL = 0;
-    public static final int FLOW_MODE_ACCOUNT_MANAGER = 1;
-    public static final int FLOW_MODE_EDIT = 3;
-    public static final int FLOW_MODE_FORCE_CREATE = 4;
-    // The following two modes are used to "pop the stack" and return from the setup flow.  We
-    // either return to the caller (if we're in an account type flow) or go to the message list
-    public static final int FLOW_MODE_RETURN_TO_CALLER = 5;
-    public static final int FLOW_MODE_RETURN_TO_MESSAGE_LIST = 6;
-    public static final int FLOW_MODE_RETURN_NO_ACCOUNTS_RESULT = 7;
-    public static final int FLOW_MODE_NO_ACCOUNTS = 8;
-
-    // Mode bits for AccountSetupCheckSettings, indicating the type of check requested
-    public static final int CHECK_INCOMING = 1;
-    public static final int CHECK_OUTGOING = 2;
-    public static final int CHECK_AUTODISCOVER = 4;
-
-    // All access will be through getters/setters
-    private int mFlowMode = FLOW_MODE_NORMAL;
-    private String mFlowAccountType;
-    private Account mAccount;
-    private String mUsername;
-    private String mPassword;
-    private int mCheckSettingsMode = 0;
-    private boolean mAllowAutodiscover = true;
-    private Policy mPolicy;
-    private AccountAuthenticatorResponse mAccountAuthenticatorResponse = null;
-
-    public interface SetupDataContainer {
-        public SetupData getSetupData();
-        public void setSetupData(SetupData setupData);
-    }
-
-    public SetupData() {
-        mPolicy = null;
-        mAllowAutodiscover = true;
-        mCheckSettingsMode = 0;
-        mAccount = new Account();
-        mUsername = null;
-        mPassword = null;
-        mAccountAuthenticatorResponse = null;
-    }
-
-    public SetupData(int flowMode) {
-        this();
-        mFlowMode = flowMode;
-    }
-
-    public SetupData(int flowMode, String accountType) {
-        this(flowMode);
-        mFlowAccountType = accountType;
-    }
-
-    public SetupData(int flowMode, Account account) {
-        this(flowMode);
-        mAccount = account;
-    }
-
-    public int getFlowMode() {
-        return mFlowMode;
-    }
-
-    public String getFlowAccountType() {
-        return mFlowAccountType;
-    }
-
-    public void setFlowMode(int flowMode) {
-        mFlowMode = flowMode;
-    }
-
-    public Account getAccount() {
-        return mAccount;
-    }
-
-    public void setAccount(Account account) {
-        mAccount = account;
-    }
-
-    public String getUsername() {
-        return mUsername;
-    }
-
-    public void setUsername(String username) {
-        mUsername = username;
-    }
-
-    public String getPassword() {
-        return mPassword;
-    }
-
-    public void setPassword(String password) {
-        mPassword = password;
-    }
-
-    public void setCheckSettingsMode(int checkSettingsMode) {
-        mCheckSettingsMode = checkSettingsMode;
-    }
-
-    public boolean isCheckIncoming() {
-        return (mCheckSettingsMode & CHECK_INCOMING) != 0;
-    }
-
-    public boolean isCheckOutgoing() {
-        return (mCheckSettingsMode & CHECK_OUTGOING) != 0;
-    }
-    public boolean isCheckAutodiscover() {
-        return (mCheckSettingsMode & CHECK_AUTODISCOVER) != 0;
-    }
-    public boolean isAllowAutodiscover() {
-        return mAllowAutodiscover;
-    }
-
-    public void setAllowAutodiscover(boolean mAllowAutodiscover) {
-        mAllowAutodiscover = mAllowAutodiscover;
-    }
-
-    public Policy getPolicy() {
-        return mPolicy;
-    }
-
-    public void setPolicy(Policy policy) {
-        mPolicy = policy;
-        mAccount.mPolicy = policy;
-    }
-
-    public AccountAuthenticatorResponse getAccountAuthenticatorResponse() {
-        return mAccountAuthenticatorResponse;
-    }
-
-    public void setAccountAuthenticatorResponse(AccountAuthenticatorResponse response) {
-        mAccountAuthenticatorResponse = response;
-    }
-
-    // Parcelable methods
-    @Override
-    public int describeContents() {
-        return 0;
-    }
-
-    public static final Parcelable.Creator<SetupData> CREATOR =
-            new Parcelable.Creator<SetupData>() {
-        @Override
-        public SetupData createFromParcel(Parcel in) {
-            return new SetupData(in);
-        }
-
-        @Override
-        public SetupData[] newArray(int size) {
-            return new SetupData[size];
-        }
-    };
-
-    @Override
-    public void writeToParcel(Parcel dest, int flags) {
-        dest.writeInt(mFlowMode);
-        dest.writeParcelable(mAccount, 0);
-        dest.writeString(mUsername);
-        dest.writeString(mPassword);
-        dest.writeInt(mCheckSettingsMode);
-        dest.writeInt(mAllowAutodiscover ? 1 : 0);
-        dest.writeParcelable(mPolicy, 0);
-        dest.writeParcelable(mAccountAuthenticatorResponse, 0);
-    }
-
-    public SetupData(Parcel in) {
-        final ClassLoader loader = getClass().getClassLoader();
-        mFlowMode = in.readInt();
-        mAccount = in.readParcelable(loader);
-        mUsername = in.readString();
-        mPassword = in.readString();
-        mCheckSettingsMode = in.readInt();
-        mAllowAutodiscover = in.readInt() == 1;
-        mPolicy = in.readParcelable(loader);
-        mAccountAuthenticatorResponse = in.readParcelable(loader);
-    }
-
-    public String debugString() {
-        final StringBuilder sb = new StringBuilder("SetupData");
-        sb.append(":acct=");
-        sb.append(mAccount == null ? "none" :mAccount.mId);
-        if (mUsername != null) {
-            sb.append(":user=");
-            sb.append(mUsername);
-        }
-        if (mPassword != null) {
-            sb.append(":pass=");
-            sb.append(mPassword);
-        }
-        sb.append(":a/d=");
-        sb.append(mAllowAutodiscover);
-        sb.append(":check=");
-        if (isCheckIncoming()) sb.append("in+");
-        if (isCheckOutgoing()) sb.append("out+");
-        if (isCheckAutodiscover()) sb.append("a/d");
-        sb.append(":policy=");
-        sb.append(mPolicy == null ? "none" : "exists");
-        return sb.toString();
-    }
-}
diff --git a/src/com/android/email/activity/setup/SetupDataFragment.java b/src/com/android/email/activity/setup/SetupDataFragment.java
new file mode 100644
index 0000000..9dc2839
--- /dev/null
+++ b/src/com/android/email/activity/setup/SetupDataFragment.java
@@ -0,0 +1,265 @@
+package com.android.email.activity.setup;
+
+import android.accounts.AccountAuthenticatorResponse;
+import android.app.Fragment;
+import android.os.Bundle;
+import android.os.Parcel;
+import android.os.Parcelable;
+
+import com.android.emailcommon.provider.Account;
+import com.android.emailcommon.provider.Policy;
+
+/**
+ * Headless fragment to hold setup data for the account setup or settings flows
+ */
+public class SetupDataFragment extends Fragment implements Parcelable {
+    // The "extra" name for the Bundle saved with SetupData
+    public static final String EXTRA_SETUP_DATA = "com.android.email.setupdata";
+
+    // NORMAL is the standard entry from the Email app; EAS and POP_IMAP are used when entering via
+    // Settings -> Accounts
+    public static final int FLOW_MODE_UNSPECIFIED = -1;
+    public static final int FLOW_MODE_NORMAL = 0;
+    public static final int FLOW_MODE_ACCOUNT_MANAGER = 1;
+    public static final int FLOW_MODE_EDIT = 3;
+    public static final int FLOW_MODE_FORCE_CREATE = 4;
+    // The following two modes are used to "pop the stack" and return from the setup flow.  We
+    // either return to the caller (if we're in an account type flow) or go to the message list
+    public static final int FLOW_MODE_RETURN_TO_CALLER = 5;
+    public static final int FLOW_MODE_RETURN_TO_MESSAGE_LIST = 6;
+    public static final int FLOW_MODE_RETURN_NO_ACCOUNTS_RESULT = 7;
+    public static final int FLOW_MODE_NO_ACCOUNTS = 8;
+
+    // Mode bits for AccountSetupCheckSettings, indicating the type of check requested
+    public static final int CHECK_INCOMING = 1;
+    public static final int CHECK_OUTGOING = 2;
+    public static final int CHECK_AUTODISCOVER = 4;
+
+    private static final String SAVESTATE_FLOWMODE = "flowMode";
+    private static final String SAVESTATE_FLOWACCOUNTTYPE = "flowAccountType";
+    private static final String SAVESTATE_ACCOUNT = "account";
+    private static final String SAVESTATE_USERNAME = "username";
+    private static final String SAVESTATE_PASSWORD = "password";
+    private static final String SAVESTATE_CHECKSETTINGSMODE = "checkSettingsMode";
+    private static final String SAVESTATE_ALLOWAUTODISCOVER = "allowAutoDiscover";
+    private static final String SAVESTATE_POLICY = "policy";
+    private static final String SAVESTATE_ACCOUNTAUTHENTICATORRESPONSE =
+            "accountAuthenticatorResponse";
+
+    // All access will be through getters/setters
+    private int mFlowMode = FLOW_MODE_NORMAL;
+    private String mFlowAccountType;
+    private Account mAccount;
+    private String mUsername;
+    private String mPassword;
+    private int mCheckSettingsMode = 0;
+    private boolean mAllowAutodiscover = true;
+    private Policy mPolicy;
+    private AccountAuthenticatorResponse mAccountAuthenticatorResponse = null;
+
+    public interface SetupDataContainer {
+        public SetupDataFragment getSetupData();
+        public void setSetupData(SetupDataFragment setupData);
+    }
+
+    public SetupDataFragment() {
+        mPolicy = null;
+        mAllowAutodiscover = true;
+        mCheckSettingsMode = 0;
+        mAccount = new Account();
+        mUsername = null;
+        mPassword = null;
+        mAccountAuthenticatorResponse = null;
+    }
+
+    public SetupDataFragment(int flowMode) {
+        this();
+        mFlowMode = flowMode;
+    }
+
+    public SetupDataFragment(int flowMode, String accountType) {
+        this(flowMode);
+        mFlowAccountType = accountType;
+    }
+
+    public SetupDataFragment(int flowMode, Account account) {
+        this(flowMode);
+        mAccount = account;
+    }
+
+    @Override
+    public void onSaveInstanceState(Bundle outState) {
+        super.onSaveInstanceState(outState);
+        outState.putInt(SAVESTATE_FLOWMODE, mFlowMode);
+        outState.putString(SAVESTATE_FLOWACCOUNTTYPE, mFlowAccountType);
+        outState.putParcelable(SAVESTATE_ACCOUNT, mAccount);
+        outState.putString(SAVESTATE_USERNAME, mUsername);
+        outState.putString(SAVESTATE_PASSWORD, mPassword);
+        outState.putInt(SAVESTATE_CHECKSETTINGSMODE, mCheckSettingsMode);
+        outState.putBoolean(SAVESTATE_ALLOWAUTODISCOVER, mAllowAutodiscover);
+        outState.putParcelable(SAVESTATE_POLICY, mPolicy);
+        outState.putParcelable(SAVESTATE_ACCOUNTAUTHENTICATORRESPONSE,
+                mAccountAuthenticatorResponse);
+    }
+
+    @Override
+    public void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        if (savedInstanceState != null) {
+            mFlowMode = savedInstanceState.getInt(SAVESTATE_FLOWMODE);
+            mFlowAccountType = savedInstanceState.getString(SAVESTATE_FLOWACCOUNTTYPE);
+            mAccount = savedInstanceState.getParcelable(SAVESTATE_ACCOUNT);
+            mUsername = savedInstanceState.getString(SAVESTATE_USERNAME);
+            mPassword = savedInstanceState.getString(SAVESTATE_PASSWORD);
+            mCheckSettingsMode = savedInstanceState.getInt(SAVESTATE_CHECKSETTINGSMODE);
+            mAllowAutodiscover = savedInstanceState.getBoolean(SAVESTATE_ALLOWAUTODISCOVER);
+            mPolicy = savedInstanceState.getParcelable(SAVESTATE_POLICY);
+            mAccountAuthenticatorResponse =
+                    savedInstanceState.getParcelable(SAVESTATE_ACCOUNTAUTHENTICATORRESPONSE);
+        }
+        setRetainInstance(true);
+    }
+
+    // Getters and setters
+    public int getFlowMode() {
+        return mFlowMode;
+    }
+
+    public void setFlowMode(int flowMode) {
+        mFlowMode = flowMode;
+    }
+
+    public String getFlowAccountType() {
+        return mFlowAccountType;
+    }
+
+    public void setFlowAccountType(String flowAccountType) {
+        mFlowAccountType = flowAccountType;
+    }
+
+    public Account getAccount() {
+        return mAccount;
+    }
+
+    public void setAccount(Account account) {
+        mAccount = account;
+    }
+
+    public String getUsername() {
+        return mUsername;
+    }
+
+    public void setUsername(String username) {
+        mUsername = username;
+    }
+
+    public String getPassword() {
+        return mPassword;
+    }
+
+    public void setPassword(String password) {
+        mPassword = password;
+    }
+
+    public int getCheckSettingsMode() {
+        return mCheckSettingsMode;
+    }
+
+    public void setCheckSettingsMode(int checkSettingsMode) {
+        mCheckSettingsMode = checkSettingsMode;
+    }
+
+    public boolean isAllowAutodiscover() {
+        return mAllowAutodiscover;
+    }
+
+    public void setAllowAutodiscover(boolean allowAutodiscover) {
+        mAllowAutodiscover = allowAutodiscover;
+    }
+
+    public Policy getPolicy() {
+        return mPolicy;
+    }
+
+    public void setPolicy(Policy policy) {
+        mPolicy = policy;
+    }
+
+    public AccountAuthenticatorResponse getAccountAuthenticatorResponse() {
+        return mAccountAuthenticatorResponse;
+    }
+
+    public void setAccountAuthenticatorResponse(
+            AccountAuthenticatorResponse accountAuthenticatorResponse) {
+        mAccountAuthenticatorResponse = accountAuthenticatorResponse;
+    }
+
+    // Parcelable methods
+    @Override
+    public int describeContents() {
+        return 0;
+    }
+
+    public static final Parcelable.Creator<SetupDataFragment> CREATOR =
+            new Parcelable.Creator<SetupDataFragment>() {
+                @Override
+                public SetupDataFragment createFromParcel(Parcel in) {
+                    return new SetupDataFragment(in);
+                }
+
+                @Override
+                public SetupDataFragment[] newArray(int size) {
+                    return new SetupDataFragment[size];
+                }
+            };
+
+    @Override
+    public void writeToParcel(Parcel dest, int flags) {
+        dest.writeInt(mFlowMode);
+        dest.writeString(mFlowAccountType);
+        dest.writeParcelable(mAccount, 0);
+        dest.writeString(mUsername);
+        dest.writeString(mPassword);
+        dest.writeInt(mCheckSettingsMode);
+        dest.writeInt(mAllowAutodiscover ? 1 : 0);
+        dest.writeParcelable(mPolicy, 0);
+        dest.writeParcelable(mAccountAuthenticatorResponse, 0);
+    }
+
+    public SetupDataFragment(Parcel in) {
+        final ClassLoader loader = getClass().getClassLoader();
+        mFlowMode = in.readInt();
+        mFlowAccountType = in.readString();
+        mAccount = in.readParcelable(loader);
+        mUsername = in.readString();
+        mPassword = in.readString();
+        mCheckSettingsMode = in.readInt();
+        mAllowAutodiscover = in.readInt() == 1;
+        mPolicy = in.readParcelable(loader);
+        mAccountAuthenticatorResponse = in.readParcelable(loader);
+    }
+
+    public String debugString() {
+        final StringBuilder sb = new StringBuilder("SetupData");
+        sb.append(":acct=");
+        sb.append(mAccount == null ? "none" :mAccount.mId);
+        if (mUsername != null) {
+            sb.append(":user=");
+            sb.append(mUsername);
+        }
+        if (mPassword != null) {
+            sb.append(":pass=");
+            sb.append(mPassword);
+        }
+        sb.append(":a/d=");
+        sb.append(mAllowAutodiscover);
+        sb.append(":check=");
+        if ((mCheckSettingsMode & CHECK_INCOMING) != 0) sb.append("in+");
+        if ((mCheckSettingsMode & CHECK_OUTGOING) != 0) sb.append("out+");
+        if ((mCheckSettingsMode & CHECK_AUTODISCOVER) != 0) sb.append("a/d");
+        sb.append(":policy=");
+        sb.append(mPolicy == null ? "none" : "exists");
+        return sb.toString();
+    }
+
+}
diff --git a/tests/src/com/android/email/activity/setup/AccountSetupIncomingTests.java b/tests/src/com/android/email/activity/setup/AccountSetupIncomingTests.java
index fdcc630..9cd77af 100644
--- a/tests/src/com/android/email/activity/setup/AccountSetupIncomingTests.java
+++ b/tests/src/com/android/email/activity/setup/AccountSetupIncomingTests.java
@@ -27,7 +27,7 @@
 import com.android.email.R;
 import com.android.email.activity.setup.AccountSetupIncoming;
 import com.android.email.activity.setup.AccountSetupIncomingFragment;
-import com.android.email.activity.setup.SetupData;
+import com.android.email.activity.setup.SetupDataFragment;
 import com.android.emailcommon.provider.Account;
 import com.android.emailcommon.provider.HostAuth;
 
@@ -190,18 +190,15 @@
      */
     private Intent getTestIntent(String storeUriString)
             throws URISyntaxException {
-        Account account = new Account();
-        Context context = getInstrumentation().getTargetContext();
-        HostAuth auth = account.getOrCreateHostAuthRecv(context);
+        final Account account = new Account();
+        final Context context = getInstrumentation().getTargetContext();
+        final HostAuth auth = account.getOrCreateHostAuthRecv(context);
         HostAuth.setHostAuthFromString(auth, storeUriString);
-
-        Bundle extras = new Bundle();
-        extras.putParcelable(SetupData.EXTRA_SETUP_DATA, new SetupData(SetupData.FLOW_MODE_NORMAL, account));
-
-        Intent intent = new Intent(Intent.ACTION_MAIN);
-        intent.putExtras(extras);
-
-        return intent;
+        final SetupDataFragment setupDataFragment =
+                new SetupDataFragment(SetupDataFragment.FLOW_MODE_NORMAL, account);
+        final Intent i = new Intent(Intent.ACTION_MAIN);
+        i.putExtra(SetupDataFragment.EXTRA_SETUP_DATA, setupDataFragment);
+        return i;
     }
 
 }
diff --git a/tests/src/com/android/email/activity/setup/AccountSetupOptionsTests.java b/tests/src/com/android/email/activity/setup/AccountSetupOptionsTests.java
index 745c19f..cd27d44 100644
--- a/tests/src/com/android/email/activity/setup/AccountSetupOptionsTests.java
+++ b/tests/src/com/android/email/activity/setup/AccountSetupOptionsTests.java
@@ -164,13 +164,16 @@
      */
     private Intent getTestIntent(String name, String storeUri)
             throws URISyntaxException {
-        Account account = new Account();
+        final Account account = new Account();
         account.setSenderName(name);
-        Context context = getInstrumentation().getTargetContext();
-        HostAuth auth = account.getOrCreateHostAuthRecv(context);
+        final Context context = getInstrumentation().getTargetContext();
+        final HostAuth auth = account.getOrCreateHostAuthRecv(context);
         HostAuth.setHostAuthFromString(auth, storeUri);
-        SetupData setupData = new SetupData(SetupData.FLOW_MODE_NORMAL, account);
-        return new Intent(Intent.ACTION_MAIN);
+        final SetupDataFragment setupDataFragment =
+                new SetupDataFragment(SetupDataFragment.FLOW_MODE_NORMAL, account);
+        final Intent i = new Intent(Intent.ACTION_MAIN);
+        i.putExtra(SetupDataFragment.EXTRA_SETUP_DATA, setupDataFragment);
+        return i;
     }
 
 }
diff --git a/tests/src/com/android/email/activity/setup/AccountSetupOutgoingTests.java b/tests/src/com/android/email/activity/setup/AccountSetupOutgoingTests.java
index e4f6b3a..985e8a4 100644
--- a/tests/src/com/android/email/activity/setup/AccountSetupOutgoingTests.java
+++ b/tests/src/com/android/email/activity/setup/AccountSetupOutgoingTests.java
@@ -26,7 +26,7 @@
 import com.android.email.R;
 import com.android.email.activity.setup.AccountSetupOutgoing;
 import com.android.email.activity.setup.AccountSetupOutgoingFragment;
-import com.android.email.activity.setup.SetupData;
+import com.android.email.activity.setup.SetupDataFragment;
 import com.android.emailcommon.provider.Account;
 import com.android.emailcommon.provider.HostAuth;
 
@@ -185,13 +185,15 @@
      */
     private Intent getTestIntent(String senderUriString)
             throws URISyntaxException {
-        Account account = new Account();
-        Context context = getInstrumentation().getTargetContext();
-        HostAuth auth = account.getOrCreateHostAuthSend(context);
+        final Account account = new Account();
+        final Context context = getInstrumentation().getTargetContext();
+        final HostAuth auth = account.getOrCreateHostAuthSend(context);
         HostAuth.setHostAuthFromString(auth, senderUriString);
-        // TODO: we need to do something with this SetupData, add it as an extra in the intent?
-        SetupData setupData = new SetupData(SetupData.FLOW_MODE_NORMAL, account);
-        return new Intent(Intent.ACTION_MAIN);
+        final SetupDataFragment setupDataFragment =
+                new SetupDataFragment(SetupDataFragment.FLOW_MODE_NORMAL, account);
+        final Intent i = new Intent(Intent.ACTION_MAIN);
+        i.putExtra(SetupDataFragment.EXTRA_SETUP_DATA, setupDataFragment);
+        return i;
     }
 
 }
