diff --git a/res/layout-xlarge-land/account_setup_basics.xml b/res/layout-xlarge-land/account_setup_basics.xml
index 70402bc..e26b503 100644
--- a/res/layout-xlarge-land/account_setup_basics.xml
+++ b/res/layout-xlarge-land/account_setup_basics.xml
@@ -60,15 +60,17 @@
         style="@style/accountSetupButton"
         android:text="@string/next_action" />
 
-    <!-- Fragment on the left containing the setup info -->
-    <fragment
-        android:id="@+id/setup_basics_fragment"
-        class="com.android.email.activity.setup.AccountSetupBasicsFragment"
+    <!-- Frame on the left containing the (common) setup info -->
+    <FrameLayout
         android:layout_below="@+id/top_divider"
         android:layout_alignParentLeft="true"
         android:layout_toLeftOf="@+id/manual_setup"
         android:layout_marginRight="64dip"
         android:layout_width="match_parent"
         android:layout_height="wrap_content"
-    />
+        >
+        <include
+            layout="@layout/account_setup_basics_common"
+            />
+    </FrameLayout>
 </RelativeLayout>
diff --git a/res/layout-xlarge-port/account_setup_basics.xml b/res/layout-xlarge-port/account_setup_basics.xml
index 6e85b06..b83bf24 100644
--- a/res/layout-xlarge-port/account_setup_basics.xml
+++ b/res/layout-xlarge-port/account_setup_basics.xml
@@ -42,28 +42,31 @@
         android:layout_height="1px"
         android:background="@color/account_setup_divider_color" />
 
-    <!-- Fragment in the middle containing the setup info -->
-    <fragment
-        android:id="@+id/setup_basics_fragment"
-        class="com.android.email.activity.setup.AccountSetupBasicsFragment"
+    <!-- Frame on the left containing the (common) setup info -->
+    <FrameLayout
+        android:id="@+id/common"
         android:layout_below="@+id/top_divider"
         android:layout_alignParentLeft="true"
         android:layout_alignParentRight="true"
         android:layout_width="match_parent"
         android:layout_height="wrap_content"
-    />
+        >
+        <include
+            layout="@layout/account_setup_basics_common"
+            />
+    </FrameLayout>
 
     <!-- Buttons below -->
     <Button
         android:id="@+id/manual_setup"
-        android:layout_below="@+id/setup_basics_fragment"
+        android:layout_below="@+id/common"
         android:layout_marginTop="48dip"
         android:layout_alignParentLeft="true"
         style="@style/accountSetupButton"
         android:text="@string/account_setup_basics_manual_setup_action" />
     <Button
         android:id="@+id/next"
-        android:layout_below="@+id/setup_basics_fragment"
+        android:layout_below="@+id/common"
         android:layout_marginTop="48dip"
         android:layout_alignParentRight="true"
         style="@style/accountSetupButton"
diff --git a/res/layout/account_setup_basics_fragment.xml b/res/layout-xlarge/account_setup_basics_common.xml
similarity index 98%
rename from res/layout/account_setup_basics_fragment.xml
rename to res/layout-xlarge/account_setup_basics_common.xml
index 5a537f7..b58262e 100644
--- a/res/layout/account_setup_basics_fragment.xml
+++ b/res/layout-xlarge/account_setup_basics_common.xml
@@ -15,6 +15,7 @@
 -->
 
 <!-- Common data-entry area of initial account setup screen - email, password, default check -->
+<!-- xlarge version -->
 <RelativeLayout
     xmlns:android="http://schemas.android.com/apk/res/android"
     android:layout_width="match_parent"
diff --git a/res/layout/account_setup_basics.xml b/res/layout/account_setup_basics.xml
index 473a78d..dc9eb80 100644
--- a/res/layout/account_setup_basics.xml
+++ b/res/layout/account_setup_basics.xml
@@ -25,29 +25,33 @@
         android:layout_height="match_parent"
         >
 
-        <!-- Fragment in the middle containing the setup info -->
-        <fragment
-            android:id="@+id/setup_basics_fragment"
-            class="com.android.email.activity.setup.AccountSetupBasicsFragment"
+        <!-- Frame on the left containing the (common) setup info -->
+        <!-- TODO need phone-sized UX here -->
+        <FrameLayout
+            android:id="@+id/common"
             android:layout_below="@+id/top_divider"
             android:layout_alignParentLeft="true"
             android:layout_alignParentRight="true"
             android:layout_width="match_parent"
             android:layout_height="wrap_content"
             android:layout_weight="1"
-        />
+            >
+            <include
+                layout="@layout/account_setup_basics_common"
+                />
+        </FrameLayout>
 
         <!-- Buttons below -->
         <Button
             android:id="@+id/manual_setup"
-            android:layout_below="@+id/setup_basics_fragment"
+            android:layout_below="@+id/common"
             android:layout_alignParentLeft="true"
             android:layout_marginTop="16dip"
             style="@style/accountSetupButton"
             android:text="@string/account_setup_basics_manual_setup_action" />
         <Button
             android:id="@+id/next"
-            android:layout_below="@+id/setup_basics_fragment"
+            android:layout_below="@+id/common"
             android:layout_alignParentRight="true"
             android:layout_marginTop="16dip"
             style="@style/accountSetupButton"
diff --git a/src/com/android/email/activity/setup/AccountSetupBasics.java b/src/com/android/email/activity/setup/AccountSetupBasics.java
index dcbbd7a..ca604b3 100644
--- a/src/com/android/email/activity/setup/AccountSetupBasics.java
+++ b/src/com/android/email/activity/setup/AccountSetupBasics.java
@@ -17,11 +17,14 @@
 package com.android.email.activity.setup;
 
 import com.android.email.Email;
+import com.android.email.EmailAddressValidator;
 import com.android.email.R;
 import com.android.email.Utility;
 import com.android.email.VendorPolicyLoader;
 import com.android.email.activity.ActivityHelper;
 import com.android.email.activity.Welcome;
+import com.android.email.activity.setup.AccountSettingsUtils.Provider;
+import com.android.email.provider.EmailContent;
 import com.android.email.provider.EmailContent.Account;
 import com.android.email.provider.EmailContent.HostAuth;
 
@@ -29,15 +32,29 @@
 import android.accounts.AccountManager;
 import android.app.Activity;
 import android.app.ActivityManager;
+import android.app.AlertDialog;
+import android.app.Dialog;
+import android.app.DialogFragment;
 import android.app.FragmentTransaction;
 import android.content.Context;
+import android.content.DialogInterface;
 import android.content.Intent;
+import android.os.AsyncTask;
 import android.os.Bundle;
+import android.text.Editable;
 import android.text.TextUtils;
+import android.text.TextWatcher;
 import android.util.Log;
 import android.view.View;
 import android.view.View.OnClickListener;
 import android.widget.Button;
+import android.widget.CheckBox;
+import android.widget.EditText;
+import android.widget.TextView;
+import android.widget.Toast;
+
+import java.net.URI;
+import java.net.URISyntaxException;
 
 /**
  * Prompts the user for the email address and password. Also prompts for "Use this account as
@@ -67,8 +84,9 @@
  * Note: Exchange accounts that require device security policies cannot be created automatically.
  */
 public class AccountSetupBasics extends AccountSetupActivity
-        implements AccountSetupBasicsFragment.Callback, AccountCheckSettingsFragment.Callbacks,
-        OnClickListener {
+        implements OnClickListener, TextWatcher, AccountCheckSettingsFragment.Callbacks {
+
+    private final static boolean ENTER_DEBUG_SCREEN = true;
 
     /**
      * Direct access for forcing account creation
@@ -81,9 +99,18 @@
     private final String EXTRA_CREATE_ACCOUNT_OUTGOING = "OUTGOING";
     private final Boolean DEBUG_ALLOW_NON_MONKEY_CREATION = true;  // STOPSHIP - must be FALSE
 
-    private AccountSetupBasicsFragment mFragment;
-    private boolean mManualButtonDisplayed;
-    private boolean mNextButtonEnabled;
+    private final static String STATE_KEY_PROVIDER = "AccountSetupBasics.provider";
+
+    // NOTE: If you change this value, confirm that the new interval exists in arrays.xml
+    private final static int DEFAULT_ACCOUNT_CHECK_INTERVAL = 15;
+
+    // Support for UI
+    private TextView mWelcomeView;
+    private EditText mEmailView;
+    private EditText mPasswordView;
+    private CheckBox mDefaultView;
+    private EmailAddressValidator mEmailValidator = new EmailAddressValidator();
+    private Provider mProvider;
     private Button mManualButton;
     private Button mNextButton;
 
@@ -168,32 +195,41 @@
 
         setContentView(R.layout.account_setup_basics);
 
-        mFragment = (AccountSetupBasicsFragment)
-                getFragmentManager().findFragmentById(R.id.setup_basics_fragment);
-        mManualButtonDisplayed = true;
+        mWelcomeView = (TextView) findViewById(R.id.instructions);
+        mEmailView = (EditText) findViewById(R.id.account_email);
+        mPasswordView = (EditText) findViewById(R.id.account_password);
+        mDefaultView = (CheckBox) findViewById(R.id.account_default);
+
+        mEmailView.addTextChangedListener(this);
+        mPasswordView.addTextChangedListener(this);
+
+        // If there are one or more accounts already in existence, then display
+        // the "use as default" checkbox (it defaults to hidden).
+        new DisplayCheckboxTask().execute();
+
+        boolean manualButtonDisplayed = true;
         boolean alternateStrings = false;
         if (flowMode == SetupData.FLOW_MODE_ACCOUNT_MANAGER_EAS) {
             // No need for manual button -> next is appropriate
-            mManualButtonDisplayed = false;
+            manualButtonDisplayed = false;
             // Swap welcome text for EAS-specific text
             alternateStrings = VendorPolicyLoader.getInstance(this).useAlternateExchangeStrings();
             setTitle(alternateStrings
                     ? R.string.account_setup_basics_exchange_title_alternate
-                            : R.string.account_setup_basics_exchange_title);
+                    : R.string.account_setup_basics_exchange_title);
+            mWelcomeView.setText(alternateStrings
+                    ? R.string.accounts_welcome_exchange_alternate
+                    : R.string.accounts_welcome_exchange);
         }
 
-        // Configure fragment
-        mFragment.setCallback(this, alternateStrings);
-
         // Configure buttons
         mManualButton = (Button) findViewById(R.id.manual_setup);
         mNextButton = (Button) findViewById(R.id.next);
-        mManualButton.setVisibility(mManualButtonDisplayed ? View.VISIBLE : View.INVISIBLE);
+        mManualButton.setVisibility(manualButtonDisplayed ? View.VISIBLE : View.INVISIBLE);
         mManualButton.setOnClickListener(this);
         mNextButton.setOnClickListener(this);
-        // Force disabled until fragment notifies otherwise
-        mNextButtonEnabled = true;
-        this.onEnableProceedButtons(false);
+        // Force disabled until validator notifies otherwise
+        onEnableProceedButtons(false);
 
         mAccountAuthenticatorResponse =
             getIntent().getParcelableExtra(AccountManager.KEY_ACCOUNT_AUTHENTICATOR_RESPONSE);
@@ -202,6 +238,18 @@
             mAccountAuthenticatorResponse.onRequestContinued();
         }
 
+        // Load fields, but only once
+        String userName = SetupData.getUsername();
+        if (userName != null) {
+            mEmailView.setText(userName);
+            SetupData.setUsername(null);
+        }
+        String password = SetupData.getPassword();
+        if (userName != null) {
+            mPasswordView.setText(password);
+            SetupData.setPassword(null);
+        }
+
         // 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 (SetupData.getFlowMode() == SetupData.FLOW_MODE_FORCE_CREATE) {
@@ -222,10 +270,14 @@
                 finish();
                 return;
             }
-            mFragment.forceCreateAccount(email, user, incoming, outgoing);
+            forceCreateAccount(email, user, incoming, outgoing);
             onCheckSettingsComplete(AccountCheckSettingsFragment.CHECK_SETTINGS_OK); // calls finish
             return;
         }
+
+        if (savedInstanceState != null && savedInstanceState.containsKey(STATE_KEY_PROVIDER)) {
+            mProvider = (Provider) savedInstanceState.getSerializable(STATE_KEY_PROVIDER);
+        }
     }
 
     @Override
@@ -243,6 +295,249 @@
         super.finish();
     }
 
+    @Override
+    public void onSaveInstanceState(Bundle outState) {
+        super.onSaveInstanceState(outState);
+        if (mProvider != null) {
+            outState.putSerializable(STATE_KEY_PROVIDER, mProvider);
+        }
+    }
+
+    /**
+     * Implements OnClickListener
+     */
+    @Override
+    public void onClick(View v) {
+        switch (v.getId()) {
+            case R.id.next:
+                onNext();
+                break;
+            case R.id.manual_setup:
+                onManualSetup(false);
+                break;
+        }
+    }
+
+    /**
+     * Implements TextWatcher
+     */
+    public void afterTextChanged(Editable s) {
+        validateFields();
+    }
+
+    /**
+     * Implements TextWatcher
+     */
+    public void beforeTextChanged(CharSequence s, int start, int count, int after) {
+    }
+
+    /**
+     * Implements TextWatcher
+     */
+    public void onTextChanged(CharSequence s, int start, int before, int count) {
+    }
+
+    private void validateFields() {
+        boolean valid = Utility.isTextViewNotEmpty(mEmailView)
+                && Utility.isTextViewNotEmpty(mPasswordView)
+                && mEmailValidator.isValid(mEmailView.getText().toString().trim());
+        onEnableProceedButtons(valid);
+    }
+
+    /**
+     * TODO this should also be in AsyncTask
+     * TODO figure out another way to get the owner name
+     */
+    private String getOwnerName() {
+        String name = null;
+        long defaultId = Account.getDefaultAccountId(this);
+        if (defaultId != -1) {
+            Account account = Account.restoreAccountWithId(this, defaultId);
+            if (account != null) {
+                name = account.getSenderName();
+            }
+        }
+        return name;
+    }
+
+    /**
+     * Finish the auto setup process, in some cases after showing a warning dialog.
+     */
+    private void finishAutoSetup() {
+        String email = mEmailView.getText().toString().trim();
+        String password = mPasswordView.getText().toString().trim();
+        String[] emailParts = email.split("@");
+        String user = emailParts[0];
+        String domain = emailParts[1];
+        URI incomingUri = null;
+        URI outgoingUri = null;
+        try {
+            String incomingUsername = mProvider.incomingUsernameTemplate;
+            incomingUsername = incomingUsername.replaceAll("\\$email", email);
+            incomingUsername = incomingUsername.replaceAll("\\$user", user);
+            incomingUsername = incomingUsername.replaceAll("\\$domain", domain);
+
+            URI incomingUriTemplate = mProvider.incomingUriTemplate;
+            incomingUri = new URI(incomingUriTemplate.getScheme(), incomingUsername + ":"
+                    + password, incomingUriTemplate.getHost(), incomingUriTemplate.getPort(),
+                    incomingUriTemplate.getPath(), null, null);
+
+            String outgoingUsername = mProvider.outgoingUsernameTemplate;
+            outgoingUsername = outgoingUsername.replaceAll("\\$email", email);
+            outgoingUsername = outgoingUsername.replaceAll("\\$user", user);
+            outgoingUsername = outgoingUsername.replaceAll("\\$domain", domain);
+
+            URI outgoingUriTemplate = mProvider.outgoingUriTemplate;
+            outgoingUri = new URI(outgoingUriTemplate.getScheme(), outgoingUsername + ":"
+                    + password, outgoingUriTemplate.getHost(), outgoingUriTemplate.getPort(),
+                    outgoingUriTemplate.getPath(), null, null);
+
+            // Stop here if the login credentials duplicate an existing account
+            // TODO this shouldn't be in UI thread
+            Account account = Utility.findExistingAccount(this, -1,
+                    incomingUri.getHost(), incomingUsername);
+            if (account != null) {
+                DuplicateAccountDialogFragment dialogFragment =
+                    DuplicateAccountDialogFragment.newInstance(account.mDisplayName);
+                dialogFragment.show(getFragmentManager(), DuplicateAccountDialogFragment.TAG);
+                return;
+            }
+
+        } catch (URISyntaxException use) {
+            /*
+             * If there is some problem with the URI we give up and go on to
+             * manual setup.  Technically speaking, AutoDiscover is OK here, since user clicked
+             * "Next" to get here.  This would never happen in practice because we don't expect
+             * to find any EAS accounts in the providers list.
+             */
+            onManualSetup(true);
+            return;
+        }
+
+        populateSetupData(getOwnerName(), email, mDefaultView.isChecked(),
+                incomingUri.toString(), outgoingUri.toString());
+
+        /**
+         * Start the account checker fragment
+         * TODO how to link directly from activity<-->fragment
+         */
+        AccountCheckSettingsFragment checkerFragment = AccountCheckSettingsFragment.newInstance(
+                SetupData.CHECK_INCOMING | SetupData.CHECK_OUTGOING, null);
+        FragmentTransaction transaction = getFragmentManager().openTransaction();
+        transaction.add(checkerFragment, AccountCheckSettingsFragment.TAG);
+        transaction.addToBackStack("back");
+        transaction.commit();
+    }
+
+    /**
+     * When "next" button is clicked
+     */
+    private void onNext() {
+        // Try auto-configuration from XML providers (unless in EAS mode, we can skip it)
+        if (SetupData.getFlowMode() != SetupData.FLOW_MODE_ACCOUNT_MANAGER_EAS) {
+            String email = mEmailView.getText().toString().trim();
+            String[] emailParts = email.split("@");
+            String domain = emailParts[1].trim();
+            mProvider = AccountSettingsUtils.findProviderForDomain(this, domain);
+            if (mProvider != null) {
+                if (mProvider.note != null) {
+                    NoteDialogFragment dialogFragment =
+                            NoteDialogFragment.newInstance(mProvider.note);
+                    dialogFragment.show(getFragmentManager(), NoteDialogFragment.TAG);
+                } else {
+                    finishAutoSetup();
+                }
+                return;
+            }
+        }
+        // Can't use auto setup (although EAS accounts may still be able to AutoDiscover)
+        onManualSetup(true);
+    }
+
+    /**
+     * When "manual setup" button is clicked
+     *
+     * @param allowAutoDiscover - true if the user clicked 'next' and (if the account is EAS)
+     * it's OK to use autodiscover.  false to prevent autodiscover and go straight to manual setup.
+     * Ignored for IMAP & POP accounts.
+     */
+    private void onManualSetup(boolean allowAutoDiscover) {
+        String email = mEmailView.getText().toString().trim();
+        String password = mPasswordView.getText().toString();
+        String[] emailParts = email.split("@");
+        String user = emailParts[0].trim();
+        String domain = emailParts[1].trim();
+
+        // Alternate entry to the debug options screen (for devices without a physical keyboard:
+        //  Username: d@d.d
+        //  Password: debug
+        if (ENTER_DEBUG_SCREEN && "d@d.d".equals(email) && "debug".equals(password)) {
+            mEmailView.setText("");
+            mPasswordView.setText("");
+            AccountSettingsXL.actionSettingsWithDebug(this);
+            return;
+        }
+
+        String uriString = null;
+        try {
+            URI uri = new URI("placeholder", user + ":" + password, domain, -1, null, null, null);
+            uriString = uri.toString();
+        } catch (URISyntaxException use) {
+            // If we can't set up the URL, don't continue - account setup pages will fail too
+            Toast.makeText(this, R.string.account_setup_username_password_toast,
+                    Toast.LENGTH_LONG).show();
+            return;
+        }
+
+        populateSetupData(getOwnerName(), email, mDefaultView.isChecked(), uriString, uriString);
+
+        SetupData.setAllowAutodiscover(allowAutoDiscover);
+        AccountSetupAccountType.actionSelectAccountType(this);
+    }
+
+    /**
+     * To support continuous testing, we allow the forced creation of accounts.
+     * This works in a manner fairly similar to automatic setup, in which the complete server
+     * Uri's are available, except that we will also skip checking (as if both checks were true)
+     * and all other UI.
+     *
+     * @param email The email address for the new account
+     * @param user The user name for the new account
+     * @param incoming The URI-style string defining the incoming account
+     * @param outgoing The URI-style string defining the outgoing account
+     */
+    private void forceCreateAccount(String email, String user, String incoming, String outgoing) {
+        populateSetupData(user, email, false, incoming, outgoing);
+    }
+
+    /**
+     * Populate SetupData's account with complete setup info.
+     */
+    private void populateSetupData(String senderName, String senderEmail, boolean isDefault,
+            String incoming, String outgoing) {
+        Account account = SetupData.getAccount();
+        account.setSenderName(senderName);
+        account.setEmailAddress(senderEmail);
+        account.setDisplayName(senderEmail);
+        account.setDefaultAccount(isDefault);
+        SetupData.setDefault(isDefault);        // TODO - why duplicated, if already set in account
+        account.setStoreUri(this, incoming);
+        account.setSenderUri(this, outgoing);
+
+        // Set sync and delete policies for specific account types
+        if (incoming.startsWith("imap")) {
+            // Delete policy must be set explicitly, because IMAP does not provide a UI selection
+            // for it. This logic needs to be followed in the auto setup flow as well.
+            account.setDeletePolicy(EmailContent.Account.DELETE_POLICY_ON_DELETE);
+        }
+
+        if (incoming.startsWith("eas")) {
+            account.setSyncInterval(Account.CHECK_INTERVAL_PUSH);
+        } else {
+            account.setSyncInterval(DEFAULT_ACCOUNT_CHECK_INTERVAL);
+        }
+    }
+
     /**
      * Implements AccountCheckSettingsFragment.Callbacks
      *
@@ -266,67 +561,76 @@
     }
 
     /**
-     * Implements OnClickListener
+     * AsyncTask checks count of accounts and displays "use this account as default" checkbox
+     * if there are more than one.
      */
-    @Override
-    public void onClick(View v) {
-        switch (v.getId()) {
-            case R.id.next:
-                mFragment.onNext();
-                break;
-            case R.id.manual_setup:
-                // no AutoDiscover - user clicked "manual"
-                mFragment.onManualSetup(false);
-                break;
+    private class DisplayCheckboxTask extends AsyncTask<Void, Void, Integer> {
+
+        @Override
+        protected Integer doInBackground(Void... params) {
+            return EmailContent.count(AccountSetupBasics.this, EmailContent.Account.CONTENT_URI);
+        }
+
+        @Override
+        protected void onPostExecute(Integer numAccounts) {
+            if (numAccounts > 0) {
+                Activity activity = AccountSetupBasics.this;
+                activity.findViewById(R.id.account_default_divider_1).setVisibility(View.VISIBLE);
+                mDefaultView.setVisibility(View.VISIBLE);
+                activity.findViewById(R.id.account_default_divider_2).setVisibility(View.VISIBLE);
+            }
         }
     }
 
-    /**
-     * Implements AccountSetupBasicsFragment.Callback
-     */
-    @Override
-    public void onEnableProceedButtons(boolean enabled) {
-        boolean wasEnabled = mNextButtonEnabled;
-        mNextButtonEnabled = enabled;
+    private void onEnableProceedButtons(boolean enabled) {
+        mManualButton.setEnabled(enabled);
+        mNextButton.setEnabled(enabled);
+    }
 
-        if (enabled != wasEnabled) {
-            mManualButton.setEnabled(enabled);
-            mNextButton.setEnabled(enabled);
+    /**
+     * Dialog fragment to show "setup note" dialog
+     */
+    public static class NoteDialogFragment extends DialogFragment {
+        private final static String TAG = "NoteDialogFragment";
+
+        // Argument bundle keys
+        private final static String BUNDLE_KEY_NOTE = "NoteDialogFragment.Note";
+
+        /**
+         * Create the dialog with parameters
+         */
+        public static NoteDialogFragment newInstance(String note) {
+            NoteDialogFragment f = new NoteDialogFragment();
+            Bundle b = new Bundle();
+            b.putString(BUNDLE_KEY_NOTE, note);
+            f.setArguments(b);
+            return f;
         }
-    }
 
-    /**
-     * Implements AccountSetupBasicsFragment.Callback
-     *
-     * This is called when auto-setup (from hardcoded server info) is attempted.
-     * Replace the name/password fragment with the account checker, which will begin to
-     * check incoming/outgoing.
-     */
-    @Override
-    public void onProceedAutomatic() {
-        AccountCheckSettingsFragment checkerFragment =
-            AccountCheckSettingsFragment.newInstance(
-                    SetupData.CHECK_INCOMING | SetupData.CHECK_OUTGOING, null);
-        FragmentTransaction transaction = getFragmentManager().openTransaction();
-        transaction.replace(R.id.setup_basics_fragment, checkerFragment);
-        transaction.addToBackStack("back");
-        transaction.commit();
-    }
+        @Override
+        public Dialog onCreateDialog(Bundle savedInstanceState) {
+            Context context = getActivity();
+            final String note = getArguments().getString(BUNDLE_KEY_NOTE);
 
-    /**
-     * Implements AccountSetupBasicsFragment.Callback
-     */
-    @Override
-    public void onProceedDebugSettings() {
-        AccountSettingsXL.actionSettingsWithDebug(this);
-    }
-
-    /**
-     * Implements AccountSetupBasicsFragment.Callback
-     */
-    @Override
-    public void onProceedManual(boolean allowAutoDiscover) {
-        SetupData.setAllowAutodiscover(allowAutoDiscover);
-        AccountSetupAccountType.actionSelectAccountType(this);
+            return new AlertDialog.Builder(context)
+                .setIcon(android.R.drawable.ic_dialog_alert)
+                .setTitle(android.R.string.dialog_alert_title)
+                .setMessage(note)
+                .setPositiveButton(
+                        R.string.okay_action,
+                        new DialogInterface.OnClickListener() {
+                            public void onClick(DialogInterface dialog, int which) {
+                                Activity a = getActivity();
+                                if (a instanceof AccountSetupBasics) {
+                                    ((AccountSetupBasics)a).finishAutoSetup();
+                                }
+                                dismiss();
+                            }
+                        })
+                .setNegativeButton(
+                        context.getString(R.string.cancel_action),
+                        null)
+                .create();
+        }
     }
 }
diff --git a/src/com/android/email/activity/setup/AccountSetupBasicsFragment.java b/src/com/android/email/activity/setup/AccountSetupBasicsFragment.java
deleted file mode 100644
index ce1e159..0000000
--- a/src/com/android/email/activity/setup/AccountSetupBasicsFragment.java
+++ /dev/null
@@ -1,538 +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 com.android.email.Email;
-import com.android.email.EmailAddressValidator;
-import com.android.email.R;
-import com.android.email.Utility;
-import com.android.email.activity.setup.AccountSettingsUtils.Provider;
-import com.android.email.provider.EmailContent;
-import com.android.email.provider.EmailContent.Account;
-
-import android.app.Activity;
-import android.app.AlertDialog;
-import android.app.Dialog;
-import android.app.DialogFragment;
-import android.app.Fragment;
-import android.content.Context;
-import android.content.DialogInterface;
-import android.os.AsyncTask;
-import android.os.Bundle;
-import android.text.Editable;
-import android.text.TextWatcher;
-import android.util.Log;
-import android.view.LayoutInflater;
-import android.view.View;
-import android.view.ViewGroup;
-import android.widget.CheckBox;
-import android.widget.EditText;
-import android.widget.TextView;
-import android.widget.Toast;
-
-import java.net.URI;
-import java.net.URISyntaxException;
-
-/**
- * Prompts the user for the email address and password. Also prompts for
- * "Use this account as default" if this is the 2nd+ account being set up.
- * Attempts to lookup default settings for the domain the user specified. If the
- * domain is known the settings are handed off to the AccountSetupCheckSettings
- * activity. If no settings are found the settings are handed off to the
- * AccountSetupAccountType activity.
- *
- * TODO: Move provider lookups to AsyncTask(s)
- * TODO: Confirm not broken on Phone UX
- */
-public class AccountSetupBasicsFragment extends Fragment implements TextWatcher {
-    private final static boolean ENTER_DEBUG_SCREEN = true;
-
-    private final static String STATE_KEY_PROVIDER =
-        "com.android.email.AccountSetupBasics.provider";
-
-    // NOTE: If you change this value, confirm that the new interval exists in arrays.xml
-    private final static int DEFAULT_ACCOUNT_CHECK_INTERVAL = 15;
-
-    // Support for UI
-    private TextView mWelcomeView;
-    private EditText mEmailView;
-    private EditText mPasswordView;
-    private CheckBox mDefaultView;
-    private EmailAddressValidator mEmailValidator = new EmailAddressValidator();
-    private Provider mProvider;
-
-    // Support for lifecycle
-    private Context mContext;
-    private Callback mCallback = EmptyCallback.INSTANCE;
-    private boolean mStarted;
-    private boolean mLoaded;
-    private boolean mUseAlternateStrings;
-
-    /**
-     * Callback interface that owning activities must implement
-     */
-    public interface Callback {
-        public void onEnableProceedButtons(boolean enable);
-        public void onProceedAutomatic();
-        public void onProceedManual(boolean allowAutoDiscover);
-        public void onProceedDebugSettings();
-    }
-
-    private static class EmptyCallback implements Callback {
-        public static final Callback INSTANCE = new EmptyCallback();
-        @Override public void onEnableProceedButtons(boolean enable) { }
-        @Override public void onProceedAutomatic() { }
-        @Override public void onProceedManual(boolean allowAutoDiscover) { }
-        @Override public void onProceedDebugSettings() { }
-    }
-
-    /**
-     * Called to do initial creation of a fragment.  This is called after
-     * {@link #onAttach(Activity)} and before {@link #onActivityCreated(Bundle)}.
-     */
-    @Override
-    public void onCreate(Bundle savedInstanceState) {
-        if (Email.DEBUG_LIFECYCLE && Email.DEBUG) {
-            Log.d(Email.LOG_TAG, "AccountSetupBasicsFragment onCreate");
-        }
-        super.onCreate(savedInstanceState);
-
-        if (savedInstanceState != null && savedInstanceState.containsKey(STATE_KEY_PROVIDER)) {
-            mProvider = (Provider) savedInstanceState.getSerializable(STATE_KEY_PROVIDER);
-        }
-    }
-
-    @Override
-    public View onCreateView(LayoutInflater inflater, ViewGroup container,
-            Bundle savedInstanceState) {
-        if (Email.DEBUG_LIFECYCLE && Email.DEBUG) {
-            Log.d(Email.LOG_TAG, "AccountSetupBasicsFragment onCreateView");
-        }
-        View view = inflater.inflate(R.layout.account_setup_basics_fragment, container, false);
-
-        mWelcomeView = (TextView) view.findViewById(R.id.instructions);
-        mEmailView = (EditText) view.findViewById(R.id.account_email);
-        mPasswordView = (EditText) view.findViewById(R.id.account_password);
-        mDefaultView = (CheckBox) view.findViewById(R.id.account_default);
-
-        mEmailView.addTextChangedListener(this);
-        mPasswordView.addTextChangedListener(this);
-
-        // If there are one or more accounts already in existence, then display
-        // the "use as default" checkbox (it defaults to hidden).
-        new DisplayCheckboxTask().execute();
-
-        return view;
-    }
-
-    @Override
-    public void onActivityCreated(Bundle savedInstanceState) {
-        if (Email.DEBUG_LIFECYCLE && Email.DEBUG) {
-            Log.d(Email.LOG_TAG, "AccountSetupBasicsFragment onActivityCreated");
-        }
-        super.onActivityCreated(savedInstanceState);
-    }
-
-    /**
-     * Called when the Fragment is visible to the user.
-     */
-    @Override
-    public void onStart() {
-        if (Email.DEBUG_LIFECYCLE && Email.DEBUG) {
-            Log.d(Email.LOG_TAG, "AccountSetupBasicsFragment onStart");
-        }
-        super.onStart();
-        mStarted = true;
-        if (!mLoaded) {
-            loadSettings();
-        }
-    }
-
-    /**
-     * Called when the fragment is visible to the user and actively running.
-     */
-    @Override
-    public void onResume() {
-        if (Email.DEBUG_LIFECYCLE && Email.DEBUG) {
-            Log.d(Email.LOG_TAG, "AccountSetupBasicsFragment onResume");
-        }
-        super.onResume();
-        validateFields();
-    }
-
-    @Override
-    public void onPause() {
-        if (Email.DEBUG_LIFECYCLE && Email.DEBUG) {
-            Log.d(Email.LOG_TAG, "AccountSetupBasicsFragment onPause");
-        }
-        super.onPause();
-    }
-
-    /**
-     * Called when the Fragment is no longer started.
-     */
-    @Override
-    public void onStop() {
-        if (Email.DEBUG_LIFECYCLE && Email.DEBUG) {
-            Log.d(Email.LOG_TAG, "AccountSetupBasicsFragment onStop");
-        }
-        super.onStop();
-        mStarted = false;
-    }
-
-    /**
-     * Called when the fragment is no longer in use.
-     */
-    @Override
-    public void onDestroy() {
-        if (Email.DEBUG_LIFECYCLE && Email.DEBUG) {
-            Log.d(Email.LOG_TAG, "AccountSetupBasicsFragment onDestroy");
-        }
-        super.onDestroy();
-    }
-
-    @Override
-    public void onSaveInstanceState(Bundle outState) {
-        if (Email.DEBUG_LIFECYCLE && Email.DEBUG) {
-            Log.d(Email.LOG_TAG, "AccountSetupBasicsFragment onSaveInstanceState");
-        }
-        super.onSaveInstanceState(outState);
-        if (mProvider != null) {
-            outState.putSerializable(STATE_KEY_PROVIDER, mProvider);
-        }
-    }
-
-    /**
-     * Activity provides callbacks here.  This also triggers loading and setting up the UX
-     */
-    public void setCallback(Callback callback, boolean useAlternateStrings) {
-        mCallback = (callback == null) ? EmptyCallback.INSTANCE : callback;
-        mUseAlternateStrings = useAlternateStrings;
-        mContext = getActivity();
-        if (mStarted && !mLoaded) {
-            loadSettings();
-        }
-    }
-
-    /**
-     * Load account data into preference UI
-     */
-    private void loadSettings() {
-        // We can only do this once, so prevent repeat
-        mLoaded = true;
-
-        int flowMode = SetupData.getFlowMode();
-        if (flowMode == SetupData.FLOW_MODE_ACCOUNT_MANAGER_EAS) {
-            // Swap welcome text for EAS-specific text
-            mWelcomeView.setText(mUseAlternateStrings
-                    ? R.string.accounts_welcome_exchange_alternate
-                            : R.string.accounts_welcome_exchange);
-        }
-
-        if (SetupData.getUsername() != null) {
-            mEmailView.setText(SetupData.getUsername());
-        }
-        if (SetupData.getPassword() != null) {
-            mPasswordView.setText(SetupData.getPassword());
-        }
-    }
-
-    public void afterTextChanged(Editable s) {
-        validateFields();
-    }
-
-    public void beforeTextChanged(CharSequence s, int start, int count, int after) {
-    }
-
-    public void onTextChanged(CharSequence s, int start, int before, int count) {
-    }
-
-    private void validateFields() {
-        boolean valid = Utility.isTextViewNotEmpty(mEmailView)
-                && Utility.isTextViewNotEmpty(mPasswordView)
-                && mEmailValidator.isValid(mEmailView.getText().toString().trim());
-        mCallback.onEnableProceedButtons(valid);
-    }
-
-    // TODO this should also be in AsyncTask
-    private String getOwnerName() {
-        String name = null;
-/* TODO figure out another way to get the owner name
-        String projection[] = {
-            ContactMethods.NAME
-        };
-        Cursor c = getContentResolver().query(
-                Uri.withAppendedPath(Contacts.People.CONTENT_URI, "owner"), projection, null, null,
-                null);
-        if (c != null) {
-            if (c.moveToFirst()) {
-                name = c.getString(0);
-            }
-            c.close();
-        }
-*/
-
-        if (name == null || name.length() == 0) {
-            long defaultId = Account.getDefaultAccountId(mContext);
-            if (defaultId != -1) {
-                Account account = Account.restoreAccountWithId(mContext, defaultId);
-                if (account != null) {
-                    name = account.getSenderName();
-                }
-            }
-        }
-        return name;
-    }
-
-    /**
-     * AsyncTask checks count of accounts and displays "use this account as default" checkbox
-     * if there are more than one.
-     */
-    private class DisplayCheckboxTask extends AsyncTask<Void, Void, Integer> {
-
-        @Override
-        protected Integer doInBackground(Void... params) {
-            return EmailContent.count(getActivity(), EmailContent.Account.CONTENT_URI);
-        }
-
-        @Override
-        protected void onPostExecute(Integer numAccounts) {
-            if (numAccounts > 0) {
-                View container = AccountSetupBasicsFragment.this.getView();
-                container.findViewById(R.id.account_default_divider_1).setVisibility(View.VISIBLE);
-                mDefaultView.setVisibility(View.VISIBLE);
-                container.findViewById(R.id.account_default_divider_2).setVisibility(View.VISIBLE);
-            }
-        }
-    }
-
-    /**
-     * Finish the auto setup process, in some cases after showing a warning dialog.
-     */
-    private void finishAutoSetup() {
-        String email = mEmailView.getText().toString().trim();
-        String password = mPasswordView.getText().toString().trim();
-        String[] emailParts = email.split("@");
-        String user = emailParts[0];
-        String domain = emailParts[1];
-        URI incomingUri = null;
-        URI outgoingUri = null;
-        try {
-            String incomingUsername = mProvider.incomingUsernameTemplate;
-            incomingUsername = incomingUsername.replaceAll("\\$email", email);
-            incomingUsername = incomingUsername.replaceAll("\\$user", user);
-            incomingUsername = incomingUsername.replaceAll("\\$domain", domain);
-
-            URI incomingUriTemplate = mProvider.incomingUriTemplate;
-            incomingUri = new URI(incomingUriTemplate.getScheme(), incomingUsername + ":"
-                    + password, incomingUriTemplate.getHost(), incomingUriTemplate.getPort(),
-                    incomingUriTemplate.getPath(), null, null);
-
-            String outgoingUsername = mProvider.outgoingUsernameTemplate;
-            outgoingUsername = outgoingUsername.replaceAll("\\$email", email);
-            outgoingUsername = outgoingUsername.replaceAll("\\$user", user);
-            outgoingUsername = outgoingUsername.replaceAll("\\$domain", domain);
-
-            URI outgoingUriTemplate = mProvider.outgoingUriTemplate;
-            outgoingUri = new URI(outgoingUriTemplate.getScheme(), outgoingUsername + ":"
-                    + password, outgoingUriTemplate.getHost(), outgoingUriTemplate.getPort(),
-                    outgoingUriTemplate.getPath(), null, null);
-
-            // Stop here if the login credentials duplicate an existing account
-            // TODO this shouldn't be in UI thread
-            Account account = Utility.findExistingAccount(mContext, -1,
-                    incomingUri.getHost(), incomingUsername);
-            if (account != null) {
-                DuplicateAccountDialogFragment dialogFragment =
-                    DuplicateAccountDialogFragment.newInstance(account.mDisplayName);
-                dialogFragment.show(getActivity(), DuplicateAccountDialogFragment.TAG);
-                return;
-            }
-
-        } catch (URISyntaxException use) {
-            /*
-             * If there is some problem with the URI we give up and go on to
-             * manual setup.  Technically speaking, AutoDiscover is OK here, since user clicked
-             * "Next" to get here.  This would never happen in practice because we don't expect
-             * to find any EAS accounts in the providers list.
-             */
-            onManualSetup(true);
-            return;
-        }
-
-        populateSetupData(getOwnerName(), email, mDefaultView.isChecked(),
-                incomingUri.toString(), outgoingUri.toString());
-
-        mCallback.onProceedAutomatic();
-    }
-
-    /**
-     * Entry point from Activity, when "next" button is clicked
-     */
-    public void onNext() {
-        // Try auto-configuration from XML providers (unless in EAS mode, we can skip it)
-        if (SetupData.getFlowMode() != SetupData.FLOW_MODE_ACCOUNT_MANAGER_EAS) {
-            String email = mEmailView.getText().toString().trim();
-            String[] emailParts = email.split("@");
-            String domain = emailParts[1].trim();
-            mProvider = AccountSettingsUtils.findProviderForDomain(mContext, domain);
-            if (mProvider != null) {
-                if (mProvider.note != null) {
-                    NoteDialogFragment dialogFragment =
-                        NoteDialogFragment.newInstance(mProvider.note, this);
-                    dialogFragment.show(getActivity(), NoteDialogFragment.TAG);
-                } else {
-                    finishAutoSetup();
-                }
-                return;
-            }
-        }
-        // Can't use auto setup (although EAS accounts may still be able to AutoDiscover)
-        onManualSetup(true);
-    }
-
-    /**
-     * Entry point from Activity, when "manual setup" button is clicked
-     *
-     * @param allowAutoDiscover - true if the user clicked 'next' and (if the account is EAS)
-     * it's OK to use autodiscover.  false to prevent autodiscover and go straight to manual setup.
-     * Ignored for IMAP & POP accounts.
-     */
-    public void onManualSetup(boolean allowAutoDiscover) {
-        String email = mEmailView.getText().toString().trim();
-        String password = mPasswordView.getText().toString();
-        String[] emailParts = email.split("@");
-        String user = emailParts[0].trim();
-        String domain = emailParts[1].trim();
-
-        // Alternate entry to the debug options screen (for devices without a physical keyboard:
-        //  Username: d@d.d
-        //  Password: debug
-        if (ENTER_DEBUG_SCREEN && "d@d.d".equals(email) && "debug".equals(password)) {
-            mEmailView.setText("");
-            mPasswordView.setText("");
-            mCallback.onProceedDebugSettings();
-            return;
-        }
-
-        String uriString = null;
-        try {
-            URI uri = new URI("placeholder", user + ":" + password, domain, -1, null, null, null);
-            uriString = uri.toString();
-        } catch (URISyntaxException use) {
-            // If we can't set up the URL, don't continue - account setup pages will fail too
-            Toast.makeText(mContext, R.string.account_setup_username_password_toast,
-                    Toast.LENGTH_LONG).show();
-            return;
-        }
-
-        populateSetupData(getOwnerName(), email, mDefaultView.isChecked(), uriString, uriString);
-
-        mCallback.onProceedManual(allowAutoDiscover);
-    }
-
-    /**
-     * To support continuous testing, we allow the forced creation of accounts.
-     * This works in a manner fairly similar to automatic setup, in which the complete server
-     * Uri's are available, except that we will also skip checking (as if both checks were true)
-     * and all other UI.
-     *
-     * @param email The email address for the new account
-     * @param user The user name for the new account
-     * @param incoming The URI-style string defining the incoming account
-     * @param outgoing The URI-style string defining the outgoing account
-     */
-    public void forceCreateAccount(String email, String user, String incoming, String outgoing) {
-        populateSetupData(user, email, false, incoming, outgoing);
-    }
-
-    /**
-     * Populate SetupData's account with complete setup info.
-     */
-    private void populateSetupData(String senderName, String senderEmail, boolean isDefault,
-            String incoming, String outgoing) {
-        Account account = SetupData.getAccount();
-        account.setSenderName(senderName);
-        account.setEmailAddress(senderEmail);
-        account.setDisplayName(senderEmail);
-        account.setDefaultAccount(isDefault);
-        SetupData.setDefault(isDefault);        // TODO - why duplicated, if already set in account
-        account.setStoreUri(mContext, incoming);
-        account.setSenderUri(mContext, outgoing);
-
-        // Set sync and delete policies for specific account types
-        if (incoming.startsWith("imap")) {
-            // Delete policy must be set explicitly, because IMAP does not provide a UI selection
-            // for it. This logic needs to be followed in the auto setup flow as well.
-            account.setDeletePolicy(EmailContent.Account.DELETE_POLICY_ON_DELETE);
-        }
-
-        if (incoming.startsWith("eas")) {
-            account.setSyncInterval(Account.CHECK_INTERVAL_PUSH);
-        } else {
-            account.setSyncInterval(DEFAULT_ACCOUNT_CHECK_INTERVAL);
-        }
-    }
-
-    /**
-     * Dialog fragment to show "setup note" dialog
-     */
-    public static class NoteDialogFragment extends DialogFragment {
-        private final static String TAG = "NoteDialogFragment";
-
-        // Argument bundle keys
-        private final static String BUNDLE_KEY_NOTE = "NoteDialogFragment.Note";
-
-        /**
-         * Create the dialog with parameters
-         */
-        public static NoteDialogFragment newInstance(String note, Fragment parentFragment) {
-            NoteDialogFragment f = new NoteDialogFragment();
-            Bundle b = new Bundle();
-            b.putString(BUNDLE_KEY_NOTE, note);
-            f.setArguments(b);
-            f.setTargetFragment(parentFragment, 0);
-            return f;
-        }
-
-        @Override
-        public Dialog onCreateDialog(Bundle savedInstanceState) {
-            Context context = getActivity();
-            final String note = getArguments().getString(BUNDLE_KEY_NOTE);
-
-            return new AlertDialog.Builder(context)
-                .setIcon(android.R.drawable.ic_dialog_alert)
-                .setTitle(android.R.string.dialog_alert_title)
-                .setMessage(note)
-                .setPositiveButton(
-                        R.string.okay_action,
-                        new DialogInterface.OnClickListener() {
-                            public void onClick(DialogInterface dialog, int which) {
-                                Fragment f = getTargetFragment();
-                                if (f instanceof AccountSetupBasicsFragment) {
-                                    ((AccountSetupBasicsFragment)f).finishAutoSetup();
-                                }
-                                dismiss();
-                            }
-                        })
-                .setNegativeButton(
-                        context.getString(R.string.cancel_action),
-                        null)
-                .create();
-        }
-    }
-}
