diff --git a/res/xml/app_default_settings.xml b/res/xml/app_default_settings.xml
index a382bc9..e96c070 100644
--- a/res/xml/app_default_settings.xml
+++ b/res/xml/app_default_settings.xml
@@ -67,7 +67,7 @@
         android:key="default_autofill"
         android:title="@string/autofill_app"
         android:summary="@string/app_list_preference_none"
-        android:fragment="com.android.settings.applications.defaultapps.DefaultAutoFillPicker"
+        android:fragment="com.android.settings.applications.defaultapps.DefaultAutofillPicker"
         settings:keywords="@string/autofill_keywords"
         android:order="-14"/>
 
diff --git a/src/com/android/settings/applications/AdvancedAppSettings.java b/src/com/android/settings/applications/AdvancedAppSettings.java
index c68e19f..b8ebeb4 100644
--- a/src/com/android/settings/applications/AdvancedAppSettings.java
+++ b/src/com/android/settings/applications/AdvancedAppSettings.java
@@ -20,7 +20,7 @@
 
 import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
 import com.android.settings.R;
-import com.android.settings.applications.defaultapps.DefaultAutoFillPreferenceController;
+import com.android.settings.applications.defaultapps.DefaultAutofillPreferenceController;
 import com.android.settings.applications.defaultapps.DefaultBrowserPreferenceController;
 import com.android.settings.applications.defaultapps.DefaultEmergencyPreferenceController;
 import com.android.settings.applications.defaultapps.DefaultHomePreferenceController;
@@ -61,7 +61,7 @@
         controllers.add(new DefaultSmsPreferenceController(context));
         controllers.add(new DefaultEmergencyPreferenceController(context));
         controllers.add(new DefaultHomePreferenceController(context));
-        controllers.add(new DefaultAutoFillPreferenceController(context));
+        controllers.add(new DefaultAutofillPreferenceController(context));
         return controllers;
     }
 
diff --git a/src/com/android/settings/applications/defaultapps/DefaultAutoFillPicker.java b/src/com/android/settings/applications/defaultapps/DefaultAutofillPicker.java
similarity index 62%
rename from src/com/android/settings/applications/defaultapps/DefaultAutoFillPicker.java
rename to src/com/android/settings/applications/defaultapps/DefaultAutofillPicker.java
index b8190cd..e3a7a2b 100644
--- a/src/com/android/settings/applications/defaultapps/DefaultAutoFillPicker.java
+++ b/src/com/android/settings/applications/defaultapps/DefaultAutofillPicker.java
@@ -23,7 +23,8 @@
 import android.content.pm.ServiceInfo;
 import android.provider.Settings;
 import android.service.autofill.AutoFillService;
-import android.service.autofill.AutoFillServiceInfo;
+import android.service.autofill.AutofillService;
+import android.service.autofill.AutofillServiceInfo;
 import android.text.TextUtils;
 
 import com.android.internal.logging.nano.MetricsProto;
@@ -32,10 +33,12 @@
 import java.util.ArrayList;
 import java.util.List;
 
-public class DefaultAutoFillPicker extends DefaultAppPickerFragment {
+public class DefaultAutofillPicker extends DefaultAppPickerFragment {
 
-    static final String SETTING = Settings.Secure.AUTO_FILL_SERVICE;
-    static final Intent AUTO_FILL_PROBE = new Intent(AutoFillService.SERVICE_INTERFACE);
+    static final String SETTING = Settings.Secure.AUTOFILL_SERVICE;
+    // TODO(b/35956626): remove once clients migrated
+    static final Intent OLD_AUTO_FILL_PROBE = new Intent(AutoFillService.OLD_SERVICE_INTERFACE);
+    static final Intent AUTOFILL_PROBE = new Intent(AutofillService.SERVICE_INTERFACE);
 
     @Override
     public int getMetricsCategory() {
@@ -51,11 +54,17 @@
     protected List<DefaultAppInfo> getCandidates() {
         final List<DefaultAppInfo> candidates = new ArrayList<>();
         final List<ResolveInfo> resolveInfos = mPm.getPackageManager()
-                .queryIntentServices(AUTO_FILL_PROBE, PackageManager.GET_META_DATA);
+                .queryIntentServices(AUTOFILL_PROBE, PackageManager.GET_META_DATA);
         for (ResolveInfo info : resolveInfos) {
             candidates.add(new DefaultAppInfo(mUserId, new ComponentName(
                     info.serviceInfo.packageName, info.serviceInfo.name)));
         }
+        final List<ResolveInfo> oldResolveInfos = mPm.getPackageManager()
+                .queryIntentServices(OLD_AUTO_FILL_PROBE, PackageManager.GET_META_DATA);
+        for (ResolveInfo info : oldResolveInfos) {
+            candidates.add(new DefaultAppInfo(mUserId, new ComponentName(
+                    info.serviceInfo.packageName, info.serviceInfo.name)));
+        }
         return candidates;
     }
 
@@ -82,13 +91,12 @@
     /**
      * Provides Intent to setting activity for the specified auto-fill service.
      */
-    static final class AutoFillSettingIntentProvider
-            implements SettingIntentProvider {
+    static final class AutofillSettingIntentProvider implements SettingIntentProvider {
 
         private final String mSelectedKey;
         private final PackageManager mPackageManager;
 
-        public AutoFillSettingIntentProvider(PackageManager packageManager, String key) {
+        public AutofillSettingIntentProvider(PackageManager packageManager, String key) {
             mSelectedKey = key;
             mPackageManager = packageManager;
         }
@@ -96,14 +104,33 @@
         @Override
         public Intent getIntent() {
             final List<ResolveInfo> resolveInfos = mPackageManager.queryIntentServices(
-                    AUTO_FILL_PROBE, PackageManager.GET_META_DATA);
+                    AUTOFILL_PROBE, PackageManager.GET_META_DATA);
 
             for (ResolveInfo resolveInfo : resolveInfos) {
                 final ServiceInfo serviceInfo = resolveInfo.serviceInfo;
                 final String flattenKey = new ComponentName(
                         serviceInfo.packageName, serviceInfo.name).flattenToString();
                 if (TextUtils.equals(mSelectedKey, flattenKey)) {
-                    final String settingsActivity = new AutoFillServiceInfo(
+                    final String settingsActivity = new AutofillServiceInfo(
+                            mPackageManager, serviceInfo)
+                            .getSettingsActivity();
+                    if (TextUtils.isEmpty(settingsActivity)) {
+                        return null;
+                    }
+                    return new Intent(Intent.ACTION_MAIN).setComponent(
+                            new ComponentName(serviceInfo.packageName, settingsActivity));
+                }
+            }
+
+            final List<ResolveInfo> oldResolveInfos = mPackageManager.queryIntentServices(
+                    OLD_AUTO_FILL_PROBE, PackageManager.GET_META_DATA);
+
+            for (ResolveInfo resolveInfo : oldResolveInfos) {
+                final ServiceInfo serviceInfo = resolveInfo.serviceInfo;
+                final String flattenKey = new ComponentName(
+                        serviceInfo.packageName, serviceInfo.name).flattenToString();
+                if (TextUtils.equals(mSelectedKey, flattenKey)) {
+                    final String settingsActivity = new AutofillServiceInfo(
                             mPackageManager, serviceInfo)
                             .getSettingsActivity();
                     if (TextUtils.isEmpty(settingsActivity)) {
diff --git a/src/com/android/settings/applications/defaultapps/DefaultAutoFillPreferenceController.java b/src/com/android/settings/applications/defaultapps/DefaultAutofillPreferenceController.java
similarity index 85%
rename from src/com/android/settings/applications/defaultapps/DefaultAutoFillPreferenceController.java
rename to src/com/android/settings/applications/defaultapps/DefaultAutofillPreferenceController.java
index b7f3b77..c536dbb 100644
--- a/src/com/android/settings/applications/defaultapps/DefaultAutoFillPreferenceController.java
+++ b/src/com/android/settings/applications/defaultapps/DefaultAutofillPreferenceController.java
@@ -22,9 +22,9 @@
 import android.provider.Settings;
 import android.text.TextUtils;
 
-public class DefaultAutoFillPreferenceController extends DefaultAppPreferenceController {
+public class DefaultAutofillPreferenceController extends DefaultAppPreferenceController {
 
-    public DefaultAutoFillPreferenceController(Context context) {
+    public DefaultAutofillPreferenceController(Context context) {
         super(context);
     }
 
@@ -43,8 +43,8 @@
         if (info == null) {
             return null;
         }
-        final DefaultAutoFillPicker.AutoFillSettingIntentProvider intentProvider =
-                new DefaultAutoFillPicker.AutoFillSettingIntentProvider(
+        final DefaultAutofillPicker.AutofillSettingIntentProvider intentProvider =
+                new DefaultAutofillPicker.AutofillSettingIntentProvider(
                         mPackageManager.getPackageManager(), info.getKey());
         return intentProvider.getIntent();
     }
@@ -52,7 +52,7 @@
     @Override
     protected DefaultAppInfo getDefaultAppInfo() {
         final String flattenComponent = Settings.Secure.getString(mContext.getContentResolver(),
-                DefaultAutoFillPicker.SETTING);
+                DefaultAutofillPicker.SETTING);
         if (!TextUtils.isEmpty(flattenComponent)) {
             DefaultAppInfo appInfo = new DefaultAppInfo(
                     mUserId, ComponentName.unflattenFromString(flattenComponent));
diff --git a/tests/robotests/src/com/android/settings/applications/defaultapps/DefaultAutoFillPickerTest.java b/tests/robotests/src/com/android/settings/applications/defaultapps/DefaultAutofillPickerTest.java
similarity index 95%
rename from tests/robotests/src/com/android/settings/applications/defaultapps/DefaultAutoFillPickerTest.java
rename to tests/robotests/src/com/android/settings/applications/defaultapps/DefaultAutofillPickerTest.java
index 1ee18cf..1bd611b 100644
--- a/tests/robotests/src/com/android/settings/applications/defaultapps/DefaultAutoFillPickerTest.java
+++ b/tests/robotests/src/com/android/settings/applications/defaultapps/DefaultAutofillPickerTest.java
@@ -46,7 +46,7 @@
 
 @RunWith(SettingsRobolectricTestRunner.class)
 @Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION)
-public class DefaultAutoFillPickerTest {
+public class DefaultAutofillPickerTest {
 
     private static final String TEST_APP_KEY = "123";
 
@@ -56,14 +56,14 @@
     private UserManager mUserManager;
     @Mock
     private PackageManagerWrapper mPackageManager;
-    private DefaultAutoFillPicker mPicker;
+    private DefaultAutofillPicker mPicker;
 
     @Before
     public void setUp() {
         MockitoAnnotations.initMocks(this);
         FakeFeatureFactory.setupForTest(mActivity);
         when(mActivity.getSystemService(Context.USER_SERVICE)).thenReturn(mUserManager);
-        mPicker = spy(new DefaultAutoFillPicker());
+        mPicker = spy(new DefaultAutofillPicker());
         mPicker.onAttach((Context) mActivity);
 
         ReflectionHelpers.setField(mPicker, "mPm", mPackageManager);
diff --git a/tests/robotests/src/com/android/settings/applications/defaultapps/DefaultAutoFillPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/applications/defaultapps/DefaultAutofillPreferenceControllerTest.java
similarity index 90%
rename from tests/robotests/src/com/android/settings/applications/defaultapps/DefaultAutoFillPreferenceControllerTest.java
rename to tests/robotests/src/com/android/settings/applications/defaultapps/DefaultAutofillPreferenceControllerTest.java
index 1c37368..7bcbcb0 100644
--- a/tests/robotests/src/com/android/settings/applications/defaultapps/DefaultAutoFillPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/applications/defaultapps/DefaultAutofillPreferenceControllerTest.java
@@ -45,7 +45,7 @@
 
 @RunWith(SettingsRobolectricTestRunner.class)
 @Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION)
-public class DefaultAutoFillPreferenceControllerTest {
+public class DefaultAutofillPreferenceControllerTest {
 
     @Mock
     private Context mContext;
@@ -54,14 +54,14 @@
     @Mock(answer = Answers.RETURNS_DEEP_STUBS)
     private PackageManagerWrapper mPackageManager;
 
-    private DefaultAutoFillPreferenceController mController;
+    private DefaultAutofillPreferenceController mController;
 
     @Before
     public void setUp() {
         MockitoAnnotations.initMocks(this);
         when(mContext.getSystemService(Context.USER_SERVICE)).thenReturn(mUserManager);
 
-        mController = spy(new DefaultAutoFillPreferenceController(mContext));
+        mController = spy(new DefaultAutofillPreferenceController(mContext));
         ReflectionHelpers.setField(mController, "mPackageManager", mPackageManager);
     }
 
@@ -82,7 +82,7 @@
     public void getDefaultAppInfo_shouldHaveSettingsProvider() {
         ReflectionHelpers.setField(mController, "mContext", RuntimeEnvironment.application);
         Settings.Secure.putString(RuntimeEnvironment.application.getContentResolver(),
-                DefaultAutoFillPicker.SETTING, "com.android.settings/SettingsActivity.class");
+                DefaultAutofillPicker.SETTING, "com.android.settings/SettingsActivity.class");
 
         final DefaultAppInfo info = mController.getDefaultAppInfo();
 
@@ -91,6 +91,6 @@
         mController.getSettingIntent(info);
 
         verify(mPackageManager.getPackageManager()).queryIntentServices(
-                DefaultAutoFillPicker.AUTO_FILL_PROBE, PackageManager.GET_META_DATA);
+                DefaultAutofillPicker.AUTOFILL_PROBE, PackageManager.GET_META_DATA);
     }
 }
