diff --git a/src/com/android/settings/Settings.java b/src/com/android/settings/Settings.java
index e92027a..a2b499d 100644
--- a/src/com/android/settings/Settings.java
+++ b/src/com/android/settings/Settings.java
@@ -40,7 +40,6 @@
     public static class PublicVolumeSettingsActivity extends SettingsActivity { /* empty */ }
     public static class WifiSettingsActivity extends SettingsActivity { /* empty */ }
     public static class WifiP2pSettingsActivity extends SettingsActivity { /* empty */ }
-    public static class InputMethodAndLanguageSettingsActivity extends SettingsActivity { /* empty */ }
     public static class AvailableVirtualKeyboardActivity extends SettingsActivity { /* empty */ }
     public static class KeyboardLayoutPickerActivity extends SettingsActivity { /* empty */ }
     public static class PhysicalKeyboardActivity extends SettingsActivity { /* empty */ }
@@ -68,10 +67,7 @@
     }
     public static class BackgroundCheckSummaryActivity extends SettingsActivity { /* empty */ }
     public static class StorageUseActivity extends SettingsActivity { /* empty */ }
-    public static class DevelopmentSettingsActivity extends SettingsActivity {
-        public static final String DASHBOARD_ALIAS =
-                "com.android.settings.DevelopmentSettingsDashboardAlias";
-    }
+    public static class DevelopmentSettingsActivity extends SettingsActivity { /* empty */ }
     public static class AccessibilitySettingsActivity extends SettingsActivity { /* empty */ }
     public static class CaptioningSettingsActivity extends SettingsActivity { /* empty */ }
     public static class AccessibilityInversionSettingsActivity extends SettingsActivity { /* empty */ }
@@ -87,7 +83,6 @@
     public static class BatterySaverSettingsActivity extends SettingsActivity { /* empty */ }
     public static class AccountSyncSettingsActivity extends SettingsActivity { /* empty */ }
     public static class AccountSyncSettingsInAddAccountActivity extends SettingsActivity { /* empty */ }
-    public static class GestureSettingsActivity extends SettingsActivity { /* empty */ }
     public static class CryptKeeperSettingsActivity extends SettingsActivity { /* empty */ }
     public static class DeviceAdminSettingsActivity extends SettingsActivity { /* empty */ }
     public static class DataUsageSummaryActivity extends SettingsActivity { /* empty */ }
diff --git a/src/com/android/settings/SettingsActivity.java b/src/com/android/settings/SettingsActivity.java
index 00bdf57..b0426ad 100644
--- a/src/com/android/settings/SettingsActivity.java
+++ b/src/com/android/settings/SettingsActivity.java
@@ -951,9 +951,6 @@
         setTileEnabled(new ComponentName(packageName,
                         Settings.DevelopmentSettingsActivity.class.getName()),
                 showDev, isAdmin);
-        setTileEnabled(new ComponentName(packageName,
-                        Settings.DevelopmentSettingsActivity.DASHBOARD_ALIAS),
-                showDev, isAdmin);
 
         if (UserHandle.MU_ENABLED && !isAdmin) {
             // When on restricted users, disable all extra categories (but only the settings ones).
@@ -981,17 +978,11 @@
         setTileEnabled(new ComponentName(packageName,
                 BackupSettingsActivity.class.getName()), true,
                 isAdmin || Utils.isCarrierDemoUser(this));
-        setTileEnabled(new ComponentName(packageName,
-                "com.android.settings.BackupResetDashboardAlias"), true, isAdmin);
 
         setTileEnabled(new ComponentName(packageName,
                 Settings.EnterprisePrivacySettingsActivity.class.getName()),
                 FeatureFactory.getFactory(this).getEnterprisePrivacyFeatureProvider(this)
                         .hasDeviceOwner(), isAdmin);
-        setTileEnabled(new ComponentName(packageName,
-                        "com.android.settings.EnterprisePrivacyDashboardAlias"),
-                FeatureFactory.getFactory(this).getEnterprisePrivacyFeatureProvider(this)
-                        .hasDeviceOwner(), isAdmin);
         // Final step, refresh categories.
         updateCategories();
     }
diff --git a/src/com/android/settings/core/gateway/SettingsGateway.java b/src/com/android/settings/core/gateway/SettingsGateway.java
index e0bb8bc..add504e 100644
--- a/src/com/android/settings/core/gateway/SettingsGateway.java
+++ b/src/com/android/settings/core/gateway/SettingsGateway.java
@@ -84,11 +84,9 @@
 import com.android.settings.gestures.DoubleTapPowerSettings;
 import com.android.settings.gestures.DoubleTapScreenSettings;
 import com.android.settings.gestures.DoubleTwistGestureSettings;
-import com.android.settings.gestures.GestureSettings;
 import com.android.settings.gestures.PickupGestureSettings;
 import com.android.settings.gestures.SwipeToNotificationSettings;
 import com.android.settings.inputmethod.AvailableVirtualKeyboardFragment;
-import com.android.settings.inputmethod.InputMethodAndLanguageSettings;
 import com.android.settings.inputmethod.KeyboardLayoutPickerFragment;
 import com.android.settings.inputmethod.PhysicalKeyboardFragment;
 import com.android.settings.inputmethod.SpellCheckersSettings;
@@ -147,7 +145,6 @@
             VpnSettings.class.getName(),
             DateTimeSettings.class.getName(),
             LocaleListEditor.class.getName(),
-            InputMethodAndLanguageSettings.class.getName(),
             AvailableVirtualKeyboardFragment.class.getName(),
             LanguageAndInputSettings.class.getName(),
             SpellCheckersSettings.class.getName(),
@@ -180,7 +177,6 @@
             WifiDisplaySettings.class.getName(),
             PowerUsageSummary.class.getName(),
             AccountSyncSettings.class.getName(),
-            GestureSettings.class.getName(),
             AssistGestureSettings.class.getName(),
             SwipeToNotificationSettings.class.getName(),
             DoubleTapPowerSettings.class.getName(),
@@ -263,11 +259,9 @@
             Settings.StorageSettingsActivity.class.getName(),
             Settings.ManageApplicationsActivity.class.getName(),
             Settings.PowerUsageSummaryActivity.class.getName(),
-            Settings.GestureSettingsActivity.class.getName(),
             //personal_section
             Settings.LocationSettingsActivity.class.getName(),
             Settings.SecuritySettingsActivity.class.getName(),
-            Settings.InputMethodAndLanguageSettingsActivity.class.getName(),
             Settings.UserSettingsActivity.class.getName(),
             //system_section
             Settings.DateTimeSettingsActivity.class.getName(),
@@ -296,9 +290,5 @@
             "com.android.settings.DataUsageDashboardAlias",
             // Home page > System
             Settings.LanguageAndInputSettingsActivity.class.getName(),
-            "com.android.settings.DateTimeDashboardAlias",
-            "com.android.settings.AccessibilityDashboardAlias",
-            "com.android.settings.AboutDeviceDashboardAlias",
-            "com.android.settings.EnterprisePrivacyDashboardAlias",
     };
 }
diff --git a/src/com/android/settings/dashboard/DashboardFragmentRegistry.java b/src/com/android/settings/dashboard/DashboardFragmentRegistry.java
index 4d0b8cf..8935ee3 100644
--- a/src/com/android/settings/dashboard/DashboardFragmentRegistry.java
+++ b/src/com/android/settings/dashboard/DashboardFragmentRegistry.java
@@ -28,7 +28,6 @@
 import com.android.settings.connecteddevice.ConnectedDeviceDashboardFragment;
 import com.android.settings.deviceinfo.StorageDashboardFragment;
 import com.android.settings.fuelgauge.PowerUsageSummary;
-import com.android.settings.inputmethod.InputMethodAndLanguageSettings;
 import com.android.settings.language.LanguageAndInputSettings;
 import com.android.settings.network.NetworkDashboardFragment;
 import com.android.settings.notification.SoundSettings;
@@ -80,8 +79,6 @@
                 CategoryKey.CATEGORY_ACCOUNT);
         PARENT_TO_CATEGORY_KEY_MAP.put(
                 SystemDashboardFragment.class.getName(), CategoryKey.CATEGORY_SYSTEM);
-        PARENT_TO_CATEGORY_KEY_MAP.put(InputMethodAndLanguageSettings.class.getName(),
-                CategoryKey.CATEGORY_SYSTEM_LANGUAGE);
         PARENT_TO_CATEGORY_KEY_MAP.put(LanguageAndInputSettings.class.getName(),
                 CategoryKey.CATEGORY_SYSTEM_LANGUAGE);
         PARENT_TO_CATEGORY_KEY_MAP.put(DevelopmentSettings.class.getName(),
diff --git a/src/com/android/settings/gestures/GestureSettings.java b/src/com/android/settings/gestures/GestureSettings.java
deleted file mode 100644
index 8c038ff..0000000
--- a/src/com/android/settings/gestures/GestureSettings.java
+++ /dev/null
@@ -1,148 +0,0 @@
-/*
- * Copyright (C) 2016 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.gestures;
-
-import android.content.Context;
-import android.os.Bundle;
-import android.os.UserHandle;
-import android.provider.SearchIndexableResource;
-import android.support.v7.preference.Preference;
-import android.support.v7.widget.RecyclerView;
-import android.view.LayoutInflater;
-import android.view.View;
-import android.view.ViewGroup;
-
-import com.android.internal.hardware.AmbientDisplayConfiguration;
-import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
-import com.android.settings.R;
-import com.android.settings.core.PreferenceController;
-import com.android.settings.core.lifecycle.Lifecycle;
-import com.android.settings.dashboard.DashboardFragment;
-import com.android.settings.search.BaseSearchIndexProvider;
-import com.android.settings.search.Indexable;
-
-import java.util.ArrayList;
-import java.util.List;
-
-/**
- * Top level fragment for gesture settings.
- * This will create individual switch preference for each gesture and handle updates when each
- * preference is updated
- */
-public class GestureSettings extends DashboardFragment {
-
-    private static final String TAG = "GestureSettings";
-    private List<GesturePreference> mPreferences;
-
-    @Override
-    protected int getPreferenceScreenResId() {
-        return R.xml.gesture_settings;
-    }
-
-    @Override
-    protected List<PreferenceController> getPreferenceControllers(Context context) {
-        final AmbientDisplayConfiguration ambientConfig = new AmbientDisplayConfiguration(context);
-        final List<PreferenceController> controllers = new ArrayList<>();
-        final Lifecycle lifecycle = getLifecycle();
-        controllers.add(new AssistGesturePreferenceController(context, lifecycle));
-        controllers.add(new SwipeToNotificationPreferenceController(context, lifecycle));
-        controllers.add(new DoubleTapPowerPreferenceController(context, lifecycle));
-        controllers.add(new DoubleTwistPreferenceController(context, lifecycle));
-        controllers.add(new PickupGesturePreferenceController(
-                context, lifecycle, ambientConfig, UserHandle.myUserId()));
-        controllers.add(new DoubleTapScreenPreferenceController(
-                context, lifecycle, ambientConfig, UserHandle.myUserId()));
-        return controllers;
-    }
-
-    @Override
-    public void onCreatePreferences(Bundle savedInstanceState, String rootKey) {
-        super.onCreatePreferences(savedInstanceState, rootKey);
-        mPreferences = new ArrayList();
-        addPreferenceToTrackingList(AssistGesturePreferenceController.class);
-        addPreferenceToTrackingList(SwipeToNotificationPreferenceController.class);
-        addPreferenceToTrackingList(DoubleTapScreenPreferenceController.class);
-        addPreferenceToTrackingList(DoubleTwistPreferenceController.class);
-        addPreferenceToTrackingList(PickupGesturePreferenceController.class);
-        addPreferenceToTrackingList(DoubleTapPowerPreferenceController.class);
-    }
-
-    @Override
-    public View onCreateView(LayoutInflater inflater, ViewGroup container,
-            Bundle savedInstanceState) {
-        View view = super.onCreateView(inflater, container, savedInstanceState);
-        RecyclerView listview = getListView();
-        listview.addOnScrollListener(new RecyclerView.OnScrollListener() {
-            @Override
-            public void onScrollStateChanged(RecyclerView recyclerView, int newState) {
-                if (newState == RecyclerView.SCROLL_STATE_DRAGGING) {
-                    for (GesturePreference pref : mPreferences) {
-                        pref.setScrolling(true);
-                    }
-                } else if (newState == RecyclerView.SCROLL_STATE_IDLE) {
-                    for (GesturePreference pref : mPreferences) {
-                        pref.setScrolling(false);
-                    }
-                }
-            }
-
-            @Override
-            public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
-            }
-        });
-        return view;
-    }
-
-    @Override
-    public void onStart() {
-        super.onStart();
-        for (GesturePreference preference : mPreferences) {
-            preference.onViewVisible();
-        }
-    }
-
-    @Override
-    public void onStop() {
-        super.onStop();
-        for (GesturePreference preference : mPreferences) {
-            preference.onViewInvisible();
-        }
-    }
-
-    @Override
-    protected String getLogTag() {
-        return TAG;
-    }
-
-    @Override
-    protected int getHelpResource() {
-        return R.string.help_url_gestures;
-    }
-
-    @Override
-    public int getMetricsCategory() {
-        return MetricsEvent.SETTINGS_GESTURES;
-    }
-
-    private <T extends PreferenceController> void addPreferenceToTrackingList(Class<T> clazz) {
-        final PreferenceController controller = getPreferenceController(clazz);
-        final Preference preference = findPreference(controller.getPreferenceKey());
-        if (preference != null && preference instanceof GesturePreference) {
-            mPreferences.add((GesturePreference) preference);
-        }
-    }
-}
diff --git a/src/com/android/settings/inputmethod/InputMethodAndLanguageSettings.java b/src/com/android/settings/inputmethod/InputMethodAndLanguageSettings.java
deleted file mode 100644
index 121af98..0000000
--- a/src/com/android/settings/inputmethod/InputMethodAndLanguageSettings.java
+++ /dev/null
@@ -1,251 +0,0 @@
-/*
- * Copyright (C) 2008 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.inputmethod;
-
-import android.app.Activity;
-import android.content.Context;
-import android.content.Intent;
-import android.hardware.input.InputDeviceIdentifier;
-import android.speech.tts.TtsEngines;
-import android.support.v7.preference.Preference;
-
-import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
-import com.android.settings.R;
-import com.android.settings.Settings.KeyboardLayoutPickerActivity;
-import com.android.settings.Utils;
-import com.android.settings.core.PreferenceController;
-import com.android.settings.dashboard.DashboardFragment;
-import com.android.settings.dashboard.SummaryLoader;
-import com.android.settings.language.PhoneLanguagePreferenceController;
-import com.android.settings.language.TtsPreferenceController;
-import com.android.settings.language.UserDictionaryPreferenceController;
-import com.android.settings.localepicker.LocaleFeatureProvider;
-import com.android.settings.overlay.FeatureFactory;
-import com.android.settings.search.BaseSearchIndexProvider;
-import com.android.settings.search.Indexable;
-import com.android.settings.search.SearchIndexableRaw;
-
-import java.util.ArrayList;
-import java.util.List;
-
-/**
- * @deprecated New features should use {@code InputAndGestureSettings} and
- * {@code LanguageAndRegionSettings} instead.
- */
-@Deprecated
-public class InputMethodAndLanguageSettings extends DashboardFragment
-        implements KeyboardLayoutDialogFragment.OnSetupKeyboardLayoutsListener, Indexable {
-
-    private static final String TAG = "IMEAndLanguageSetting";
-
-    private Intent mIntentWaitingForResult;
-
-    @Override
-    public int getMetricsCategory() {
-        return MetricsEvent.INPUTMETHOD_LANGUAGE;
-    }
-
-    @Override
-    protected String getLogTag() {
-        return TAG;
-    }
-
-    @Override
-    protected int getPreferenceScreenResId() {
-        return R.xml.language_settings;
-    }
-
-    @Override
-    protected List<PreferenceController> getPreferenceControllers(Context context) {
-        final GameControllerPreferenceController gameControllerPreferenceController =
-                new GameControllerPreferenceController(context);
-        getLifecycle().addObserver(gameControllerPreferenceController);
-
-        final List<PreferenceController> list = new ArrayList<>();
-        list.add(gameControllerPreferenceController);
-        list.add(new PhoneLanguagePreferenceController(context));
-        list.add(new SpellCheckerPreferenceController(context));
-        list.add(new UserDictionaryPreferenceController(context));
-        list.add(new TtsPreferenceController(context, new TtsEngines(context)));
-        return list;
-    }
-
-    @Override
-    public boolean onPreferenceTreeClick(Preference preference) {
-        // Input Method stuff
-        if (Utils.isMonkeyRunning()) {
-            return false;
-        }
-        return super.onPreferenceTreeClick(preference);
-    }
-
-    private void showKeyboardLayoutDialog(InputDeviceIdentifier inputDeviceIdentifier) {
-        KeyboardLayoutDialogFragment fragment = (KeyboardLayoutDialogFragment)
-                getFragmentManager().findFragmentByTag("keyboardLayout");
-        if (fragment == null) {
-            fragment = new KeyboardLayoutDialogFragment(inputDeviceIdentifier);
-            fragment.setTargetFragment(this, 0);
-            fragment.show(getActivity().getFragmentManager(), "keyboardLayout");
-        }
-    }
-
-    @Override
-    public void onSetupKeyboardLayouts(InputDeviceIdentifier inputDeviceIdentifier) {
-        final Intent intent = new Intent(Intent.ACTION_MAIN);
-        intent.setClass(getActivity(), KeyboardLayoutPickerActivity.class);
-        intent.putExtra(KeyboardLayoutPickerFragment.EXTRA_INPUT_DEVICE_IDENTIFIER,
-                inputDeviceIdentifier);
-        mIntentWaitingForResult = intent;
-        startActivityForResult(intent, 0);
-    }
-
-    @Override
-    public void onActivityResult(int requestCode, int resultCode, Intent data) {
-        super.onActivityResult(requestCode, resultCode, data);
-
-        if (mIntentWaitingForResult != null) {
-            InputDeviceIdentifier inputDeviceIdentifier = mIntentWaitingForResult
-                    .getParcelableExtra(KeyboardLayoutPickerFragment.EXTRA_INPUT_DEVICE_IDENTIFIER);
-            mIntentWaitingForResult = null;
-            showKeyboardLayoutDialog(inputDeviceIdentifier);
-        }
-    }
-
-    private static class SummaryProvider implements SummaryLoader.SummaryProvider {
-
-        private final SummaryLoader mSummaryLoader;
-        private LocaleFeatureProvider mLocaleFeatureProvider;
-
-        public SummaryProvider(Context context, SummaryLoader summaryLoader) {
-            mSummaryLoader = summaryLoader;
-            mLocaleFeatureProvider = FeatureFactory.getFactory(context).getLocaleFeatureProvider();
-        }
-
-        @Override
-        public void setListening(boolean listening) {
-            if (listening) {
-                String localeNames = mLocaleFeatureProvider.getLocaleNames();
-                mSummaryLoader.setSummary(this, localeNames);
-            }
-        }
-    }
-
-    public static final SummaryLoader.SummaryProviderFactory SUMMARY_PROVIDER_FACTORY
-            = new SummaryLoader.SummaryProviderFactory() {
-        @Override
-        public SummaryLoader.SummaryProvider createSummaryProvider(Activity activity,
-                SummaryLoader summaryLoader) {
-            return new SummaryProvider(activity, summaryLoader);
-        }
-    };
-
-    public static final Indexable.SearchIndexProvider SEARCH_INDEX_DATA_PROVIDER =
-            new BaseSearchIndexProvider() {
-        @Override
-        public List<SearchIndexableRaw> getRawDataToIndex(Context context, boolean enabled) {
-            List<SearchIndexableRaw> indexables = new ArrayList<>();
-
-            final String screenTitle = context.getString(R.string.language_keyboard_settings_title);
-
-            // Locale picker.
-            final PhoneLanguagePreferenceController mLanguagePrefController =
-                    new PhoneLanguagePreferenceController(context);
-            if (mLanguagePrefController.isAvailable()) {
-                String localeNames = FeatureFactory.getFactory(context).getLocaleFeatureProvider()
-                        .getLocaleNames();
-                SearchIndexableRaw indexable = new SearchIndexableRaw(context);
-                indexable.key = mLanguagePrefController.getPreferenceKey();
-                indexable.title = context.getString(R.string.phone_language);
-                indexable.summaryOn = localeNames;
-                indexable.summaryOff = localeNames;
-                indexable.screenTitle = screenTitle;
-                indexables.add(indexable);
-            }
-
-            // Spell checker.
-            SearchIndexableRaw indexable = new SearchIndexableRaw(context);
-            indexable.key = SpellCheckerPreferenceController.KEY_SPELL_CHECKERS;
-            indexable.title = context.getString(R.string.spellcheckers_settings_title);
-            indexable.screenTitle = screenTitle;
-            indexable.keywords = context.getString(R.string.keywords_spell_checker);
-            indexables.add(indexable);
-
-            // User dictionary.
-            if (UserDictionaryList.getUserDictionaryLocalesSet(context) != null) {
-                indexable = new SearchIndexableRaw(context);
-                indexable.key = "user_dict_settings";
-                indexable.title = context.getString(R.string.user_dict_settings_title);
-                indexable.screenTitle = screenTitle;
-                indexables.add(indexable);
-            }
-
-            // Keyboard settings.
-            indexable = new SearchIndexableRaw(context);
-            indexable.key = "keyboard_settings";
-            indexable.title = context.getString(R.string.keyboard_settings_category);
-            indexable.screenTitle = screenTitle;
-            indexable.keywords = context.getString(R.string.keywords_keyboard_and_ime);
-            indexables.add(indexable);
-
-            if (!PhysicalKeyboardFragment.getPhysicalFullKeyboards().isEmpty()) {
-                // Hard keyboard category.
-                indexable = new SearchIndexableRaw(context);
-                indexable.key = "builtin_keyboard_settings";
-                indexable.title = context.getString(R.string.builtin_keyboard_settings_title);
-                indexable.screenTitle = screenTitle;
-                indexables.add(indexable);
-            }
-
-            // Text-to-speech.
-            TtsEngines ttsEngines = new TtsEngines(context);
-            if (!ttsEngines.getEngines().isEmpty()) {
-                indexable = new SearchIndexableRaw(context);
-                indexable.key = "tts_settings";
-                indexable.title = context.getString(R.string.tts_settings_title);
-                indexable.screenTitle = screenTitle;
-                indexable.keywords = context.getString(R.string.keywords_text_to_speech_output);
-                indexables.add(indexable);
-            }
-
-            // Pointer settings.
-            indexable = new SearchIndexableRaw(context);
-            indexable.key = "pointer_settings_category";
-            indexable.title = context.getString(R.string.pointer_settings_category);
-            indexable.screenTitle = screenTitle;
-            indexables.add(indexable);
-
-            indexable = new SearchIndexableRaw(context);
-            indexable.key = "pointer_speed";
-            indexable.title = context.getString(R.string.pointer_speed);
-            indexable.screenTitle = screenTitle;
-            indexables.add(indexable);
-
-            // Game controllers.
-            if (!new GameControllerPreferenceController(context).isAvailable()) {
-                indexable = new SearchIndexableRaw(context);
-                indexable.key = GameControllerPreferenceController.PREF_KEY;
-                indexable.title = context.getString(R.string.vibrate_input_devices);
-                indexable.summaryOn = context.getString(R.string.vibrate_input_devices_summary);
-                indexable.summaryOff = context.getString(R.string.vibrate_input_devices_summary);
-                indexable.screenTitle = screenTitle;
-                indexables.add(indexable);
-            }
-
-            return indexables;
-        }
-    };
-}
diff --git a/src/com/android/settings/search/DynamicIndexableContentMonitor.java b/src/com/android/settings/search/DynamicIndexableContentMonitor.java
index 0cc2688..c91f381 100644
--- a/src/com/android/settings/search/DynamicIndexableContentMonitor.java
+++ b/src/com/android/settings/search/DynamicIndexableContentMonitor.java
@@ -49,9 +49,9 @@
 import com.android.internal.content.PackageMonitor;
 import com.android.settings.accessibility.AccessibilitySettings;
 import com.android.settings.inputmethod.AvailableVirtualKeyboardFragment;
-import com.android.settings.inputmethod.InputMethodAndLanguageSettings;
 import com.android.settings.inputmethod.PhysicalKeyboardFragment;
 import com.android.settings.inputmethod.VirtualKeyboardFragment;
+import com.android.settings.language.LanguageAndInputSettings;
 import com.android.settings.print.PrintSettingsFragment;
 
 import java.util.ArrayList;
@@ -423,7 +423,7 @@
             mContentResolver = context.getContentResolver();
             mInputMethodServices.clear();
             // Build index of {@link UserDictionary}.
-            buildIndex(InputMethodAndLanguageSettings.class, true /* rebuild */);
+            buildIndex(LanguageAndInputSettings.class, true /* rebuild */);
             // Build index of IMEs.
             buildIndex(VirtualKeyboardFragment.class, true /* rebuild */);
             buildIndex(AvailableVirtualKeyboardFragment.class, true /* rebuild */);
@@ -478,7 +478,7 @@
                 buildIndex(VirtualKeyboardFragment.class, true /* rebuild */);
                 buildIndex(AvailableVirtualKeyboardFragment.class, true /* rebuild */);
             } else if (UserDictionary.Words.CONTENT_URI.equals(uri)) {
-                buildIndex(InputMethodAndLanguageSettings.class, true /* rebuild */);
+                buildIndex(LanguageAndInputSettings.class, true /* rebuild */);
             }
         }
     }
diff --git a/src/com/android/settings/search/Ranking.java b/src/com/android/settings/search/Ranking.java
index fc1b8d9..40121f4 100644
--- a/src/com/android/settings/search/Ranking.java
+++ b/src/com/android/settings/search/Ranking.java
@@ -41,8 +41,13 @@
 import com.android.settings.enterprise.EnterprisePrivacySettings;
 import com.android.settings.fuelgauge.BatterySaverSettings;
 import com.android.settings.fuelgauge.PowerUsageSummary;
-import com.android.settings.gestures.GestureSettings;
-import com.android.settings.inputmethod.InputMethodAndLanguageSettings;
+import com.android.settings.gestures.AssistGestureSettings;
+import com.android.settings.gestures.DoubleTapPowerSettings;
+import com.android.settings.gestures.DoubleTapScreenSettings;
+import com.android.settings.gestures.DoubleTwistGestureSettings;
+import com.android.settings.gestures.PickupGestureSettings;
+import com.android.settings.gestures.SwipeToNotificationSettings;
+import com.android.settings.language.LanguageAndInputSettings;
 import com.android.settings.location.LocationSettings;
 import com.android.settings.location.ScanningSettings;
 import com.android.settings.notification.ConfigureNotificationSettings;
@@ -154,7 +159,12 @@
         sRankMap.put(UserSettings.class.getName(), RANK_USERS);
 
         // Gestures
-        sRankMap.put(GestureSettings.class.getName(), RANK_GESTURE);
+        sRankMap.put(AssistGestureSettings.class.getName(), RANK_GESTURE);
+        sRankMap.put(DoubleTapPowerSettings.class.getName(), RANK_GESTURE);
+        sRankMap.put(DoubleTapScreenSettings.class.getName(), RANK_GESTURE);
+        sRankMap.put(DoubleTwistGestureSettings.class.getName(), RANK_GESTURE);
+        sRankMap.put(PickupGestureSettings.class.getName(), RANK_GESTURE);
+        sRankMap.put(SwipeToNotificationSettings.class.getName(), RANK_GESTURE);
 
         // Location
         sRankMap.put(LocationSettings.class.getName(), RANK_LOCATION);
@@ -169,7 +179,7 @@
         sRankMap.put(UserAndAccountDashboardFragment.class.getName(), RANK_ACCOUNT);
 
         // IMEs
-        sRankMap.put(InputMethodAndLanguageSettings.class.getName(), RANK_IME);
+        sRankMap.put(LanguageAndInputSettings.class.getName(), RANK_IME);
 
         // Privacy
         sRankMap.put(PrivacySettings.class.getName(), RANK_PRIVACY);
diff --git a/src/com/android/settings/search/SearchIndexableResources.java b/src/com/android/settings/search/SearchIndexableResources.java
index 1968c7a..12b5eae 100644
--- a/src/com/android/settings/search/SearchIndexableResources.java
+++ b/src/com/android/settings/search/SearchIndexableResources.java
@@ -44,7 +44,6 @@
 import com.android.settings.datausage.DataUsageMeteredSettings;
 import com.android.settings.datausage.DataUsageSummary;
 import com.android.settings.deviceinfo.StorageDashboardFragment;
-import com.android.settings.deviceinfo.StorageProfileFragment;
 import com.android.settings.deviceinfo.StorageSettings;
 import com.android.settings.display.ScreenZoomSettings;
 import com.android.settings.enterprise.EnterprisePrivacySettings;
@@ -56,11 +55,9 @@
 import com.android.settings.gestures.DoubleTapPowerSettings;
 import com.android.settings.gestures.DoubleTapScreenSettings;
 import com.android.settings.gestures.DoubleTwistGestureSettings;
-import com.android.settings.gestures.GestureSettings;
 import com.android.settings.gestures.PickupGestureSettings;
 import com.android.settings.gestures.SwipeToNotificationSettings;
 import com.android.settings.inputmethod.AvailableVirtualKeyboardFragment;
-import com.android.settings.inputmethod.InputMethodAndLanguageSettings;
 import com.android.settings.inputmethod.PhysicalKeyboardFragment;
 import com.android.settings.inputmethod.VirtualKeyboardFragment;
 import com.android.settings.language.LanguageAndInputSettings;
@@ -139,7 +136,6 @@
         addIndex(SpecialAccessSettings.class,
                 R.xml.special_access, R.drawable.ic_settings_applications);
         addIndex(UserSettings.class, NO_DATA_RES_ID, R.drawable.ic_settings_multiuser);
-        addIndex(GestureSettings.class, NO_DATA_RES_ID, R.drawable.ic_settings_gestures);
         addIndex(AssistGestureSettings.class, NO_DATA_RES_ID, R.drawable.ic_settings_gestures);
         addIndex(PickupGestureSettings.class, NO_DATA_RES_ID, R.drawable.ic_settings_gestures);
         addIndex(DoubleTapScreenSettings.class, NO_DATA_RES_ID, R.drawable.ic_settings_gestures);
@@ -156,8 +152,6 @@
         addIndex(ScreenPinningSettings.class, NO_DATA_RES_ID, R.drawable.ic_settings_security);
         addIndex(UserAndAccountDashboardFragment.class, NO_DATA_RES_ID,
                 R.drawable.ic_settings_accounts);
-        addIndex(InputMethodAndLanguageSettings.class,
-                NO_DATA_RES_ID, R.drawable.ic_settings_language);
         addIndex(VirtualKeyboardFragment.class, NO_DATA_RES_ID, R.drawable.ic_settings_language);
         addIndex(AvailableVirtualKeyboardFragment.class,
                 NO_DATA_RES_ID, R.drawable.ic_settings_language);
