diff --git a/AndroidManifest.xml b/AndroidManifest.xml
index 017d804..cffe357 100644
--- a/AndroidManifest.xml
+++ b/AndroidManifest.xml
@@ -3078,6 +3078,7 @@
             android:permission="android.permission.DUMP"
             android:enabled="@bool/config_has_help" />
 
+
         <!-- Activities for moves/gestures suggestions -->
         <activity
             android:name=".Settings$CameraLiftTriggerSuggestionActivity"
@@ -3096,9 +3097,17 @@
                        android:resource="@string/camera_lift_trigger_suggestion_summary" />
         </activity>
 
-        <activity android:name=".applications.defaultapps.AutofillPickerActivity"
-                android:taskAffinity=""
-                android:noHistory="true">
+        <activity android:name=".applications.autofill.AutofillPickerActivity"
+                android:excludeFromRecents="true"
+                android:launchMode="singleInstance"
+                android:exported="false">
+        </activity>
+
+        <activity android:name=".applications.autofill.AutofillPickerTrampolineActivity"
+                android:theme="@android:style/Theme.NoDisplay"
+                android:excludeFromRecents="true"
+                android:launchMode="singleInstance"
+                android:label="@string/autofill_app">
             <intent-filter android:priority="1">
                 <action android:name="android.settings.REQUEST_SET_AUTOFILL_SERVICE" />
                 <category android:name="android.intent.category.DEFAULT" />
diff --git a/src/com/android/settings/applications/defaultapps/AutofillPickerActivity.java b/src/com/android/settings/applications/autofill/AutofillPickerActivity.java
similarity index 88%
rename from src/com/android/settings/applications/defaultapps/AutofillPickerActivity.java
rename to src/com/android/settings/applications/autofill/AutofillPickerActivity.java
index a173909..93b9880 100644
--- a/src/com/android/settings/applications/defaultapps/AutofillPickerActivity.java
+++ b/src/com/android/settings/applications/autofill/AutofillPickerActivity.java
@@ -11,16 +11,17 @@
  * KIND, either express or implied. See the License for the specific language governing
  * permissions and limitations under the License.
  */
-package com.android.settings.applications.defaultapps;
+package com.android.settings.applications.autofill;
 
 import android.content.Intent;
 import android.os.Bundle;
 
 import com.android.settings.R;
 import com.android.settings.SettingsActivity;
+import com.android.settings.applications.defaultapps.DefaultAutofillPicker;
 
 /**
- * Standalone activity used to launch {@link DefaultAppPickerFragment} from a
+ * Standalone activity used to launch a {@link DefaultAutofillPicker} fragment from a
  * {@link android.provider.Settings#ACTION_REQUEST_SET_AUTOFILL_SERVICE} intent.
  */
 public class AutofillPickerActivity extends SettingsActivity {
@@ -32,7 +33,6 @@
         intent.putExtra(EXTRA_SHOW_FRAGMENT, DefaultAutofillPicker.class.getName());
         intent.putExtra(EXTRA_SHOW_FRAGMENT_TITLE_RESID, R.string.autofill_app);
         intent.putExtra(DefaultAutofillPicker.EXTRA_PACKAGE_NAME, packageName);
-
         super.onCreate(savedInstanceState);
     }
 
diff --git a/src/com/android/settings/applications/autofill/AutofillPickerTrampolineActivity.java b/src/com/android/settings/applications/autofill/AutofillPickerTrampolineActivity.java
new file mode 100644
index 0000000..1db3c82
--- /dev/null
+++ b/src/com/android/settings/applications/autofill/AutofillPickerTrampolineActivity.java
@@ -0,0 +1,63 @@
+/*
+ * Copyright (C) 2017 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.settings.applications.autofill;
+
+import android.app.Activity;
+import android.content.Intent;
+import android.os.Bundle;
+import android.view.autofill.AutofillManager;
+
+import com.android.settings.applications.defaultapps.DefaultAutofillPicker;
+
+/**
+ * Standalone activity used to launch a {@link DefaultAutofillPicker} fragment from a
+ * {@link android.provider.Settings#ACTION_REQUEST_SET_AUTOFILL_SERVICE} intent.
+ *
+ * <p>It first check for cases that can fail fast, then forward to {@link AutofillPickerActivity}
+ * if necessary.
+ */
+public class AutofillPickerTrampolineActivity extends Activity {
+
+    @Override
+    protected void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+
+        // First check if the current user's service already belongs to the app...
+        final Intent intent = getIntent();
+        final String packageName = intent.getData().getSchemeSpecificPart();
+        final String currentService = DefaultAutofillPicker.getDefaultKey(this);
+        if (currentService != null && currentService.startsWith(packageName)) {
+            // ...and succeed right away if it does.
+            setResult(RESULT_OK);
+            finish();
+            return;
+        }
+
+        // Then check if the Autofill is available for the current user...
+        final AutofillManager afm = getSystemService(AutofillManager.class);
+        if (afm == null || !afm.hasAutofillFeature() || !afm.isAutofillSupported()) {
+            // ... and fail right away if it is not.
+            setResult(RESULT_CANCELED);
+            finish();
+            return;
+        }
+
+        // Otherwise, go ahead and show the real UI...
+        final Intent newIntent = new Intent(this, AutofillPickerActivity.class)
+                .setFlags(Intent.FLAG_ACTIVITY_FORWARD_RESULT)
+                .setData(intent.getData());
+        startActivity(newIntent);
+        finish();
+    }
+}
diff --git a/src/com/android/settings/applications/defaultapps/DefaultAppPickerFragment.java b/src/com/android/settings/applications/defaultapps/DefaultAppPickerFragment.java
index 9ab704e..73f4bbe 100644
--- a/src/com/android/settings/applications/defaultapps/DefaultAppPickerFragment.java
+++ b/src/com/android/settings/applications/defaultapps/DefaultAppPickerFragment.java
@@ -55,8 +55,8 @@
         if (TextUtils.isEmpty(confirmationMessage)) {
             super.onRadioButtonClicked(selected);
         } else if (activity != null) {
-            final DialogFragment fragment = ConfirmationDialogFragment.newInstance(
-                    this, selectedKey, confirmationMessage);
+            final DialogFragment fragment =
+                    newConfirmationDialogFragment(selectedKey, confirmationMessage);
             fragment.show(activity.getFragmentManager(), ConfirmationDialogFragment.TAG);
         }
     }
@@ -74,6 +74,11 @@
         }
     }
 
+    protected ConfirmationDialogFragment newConfirmationDialogFragment(String selectedKey,
+            CharSequence confirmationMessage) {
+        return ConfirmationDialogFragment.newInstance(this, selectedKey, confirmationMessage);
+    }
+
     protected CharSequence getConfirmationMessage(CandidateInfo info) {
         return null;
     }
@@ -85,6 +90,12 @@
         public static final String EXTRA_KEY = "extra_key";
         public static final String EXTRA_MESSAGE = "extra_message";
 
+        private final DialogInterface.OnClickListener mCancelListener;
+
+        private ConfirmationDialogFragment(DialogInterface.OnClickListener cancelListener) {
+            mCancelListener = cancelListener;
+        }
+
         @Override
         public int getMetricsCategory() {
             return MetricsProto.MetricsEvent.DEFAULT_APP_PICKER_CONFIRMATION_DIALOG;
@@ -92,7 +103,14 @@
 
         public static ConfirmationDialogFragment newInstance(DefaultAppPickerFragment parent,
                 String key, CharSequence message) {
-            final ConfirmationDialogFragment fragment = new ConfirmationDialogFragment();
+            return newInstance(parent, key, message, null);
+        }
+
+        // TODO: add test case for cancelListener
+        public static ConfirmationDialogFragment newInstance(DefaultAppPickerFragment parent,
+                String key, CharSequence message, DialogInterface.OnClickListener cancelListener) {
+            final ConfirmationDialogFragment fragment = new ConfirmationDialogFragment(
+                    cancelListener);
             final Bundle argument = new Bundle();
             argument.putString(EXTRA_KEY, key);
             argument.putCharSequence(EXTRA_MESSAGE, message);
@@ -107,7 +125,7 @@
             final AlertDialog.Builder builder = new AlertDialog.Builder(getActivity())
                     .setMessage(bundle.getCharSequence(EXTRA_MESSAGE))
                     .setPositiveButton(android.R.string.ok, this)
-                    .setNegativeButton(android.R.string.cancel, null);
+                    .setNegativeButton(android.R.string.cancel, mCancelListener);
             return builder.create();
         }
 
diff --git a/src/com/android/settings/applications/defaultapps/DefaultAutofillPicker.java b/src/com/android/settings/applications/defaultapps/DefaultAutofillPicker.java
index 037cddf..2e79660 100644
--- a/src/com/android/settings/applications/defaultapps/DefaultAutofillPicker.java
+++ b/src/com/android/settings/applications/defaultapps/DefaultAutofillPicker.java
@@ -18,10 +18,13 @@
 
 import android.app.Activity;
 import android.content.ComponentName;
+import android.content.Context;
+import android.content.DialogInterface;
 import android.content.Intent;
 import android.content.pm.PackageManager;
 import android.content.pm.ResolveInfo;
 import android.content.pm.ServiceInfo;
+import android.os.Bundle;
 import android.provider.Settings;
 import android.service.autofill.AutofillService;
 import android.service.autofill.AutofillServiceInfo;
@@ -30,6 +33,7 @@
 
 import com.android.internal.logging.nano.MetricsProto;
 import com.android.settings.R;
+import com.android.settings.applications.defaultapps.DefaultAppPickerFragment.ConfirmationDialogFragment;
 
 import java.util.ArrayList;
 import java.util.List;
@@ -39,7 +43,35 @@
     static final String SETTING = Settings.Secure.AUTOFILL_SERVICE;
     static final Intent AUTOFILL_PROBE = new Intent(AutofillService.SERVICE_INTERFACE);
 
-    static final String EXTRA_PACKAGE_NAME = "package_name";
+    /**
+     * Extra set when the fragment is implementing ACTION_REQUEST_SET_AUTOFILL_SERVICE.
+     */
+    public static final String EXTRA_PACKAGE_NAME = "package_name";
+
+    /**
+     * Set when the fragment is implementing ACTION_REQUEST_SET_AUTOFILL_SERVICE.
+     */
+    public DialogInterface.OnClickListener mCancelListener;
+
+    @Override
+    public void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+
+        final Activity activity = getActivity();
+        if (activity != null && activity.getIntent().getStringExtra(EXTRA_PACKAGE_NAME) != null) {
+            mCancelListener = (d, w) -> {
+                activity.setResult(Activity.RESULT_CANCELED);
+                activity.finish();
+            };
+        }
+    }
+
+    @Override
+    protected ConfirmationDialogFragment newConfirmationDialogFragment(String selectedKey,
+            CharSequence confirmationMessage) {
+        return ConfirmationDialogFragment.newInstance(this, selectedKey, confirmationMessage,
+                mCancelListener);
+    }
 
     @Override
     public int getMetricsCategory() {
@@ -63,9 +95,13 @@
         return candidates;
     }
 
+    public static String getDefaultKey(Context context) {
+        return Settings.Secure.getString(context.getContentResolver(), SETTING);
+    }
+
     @Override
     protected String getDefaultKey() {
-        return Settings.Secure.getString(getContext().getContentResolver(), SETTING);
+        return getDefaultKey(getContext());
     }
 
     @Override
