diff --git a/res/layout/dashboard_container.xml b/res/layout/dashboard_container.xml
deleted file mode 100644
index f6b81ae..0000000
--- a/res/layout/dashboard_container.xml
+++ /dev/null
@@ -1,21 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- 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.
--->
-
-<com.android.settings.widget.RtlCompatibleViewPager
-        xmlns:android="http://schemas.android.com/apk/res/android"
-        android:id="@+id/pager"
-        android:layout_width="match_parent"
-        android:layout_height="match_parent"/>
diff --git a/res/layout/dashboard_container_header.xml b/res/layout/dashboard_container_header.xml
deleted file mode 100644
index 37412e7..0000000
--- a/res/layout/dashboard_container_header.xml
+++ /dev/null
@@ -1,23 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- 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.
--->
-
-<com.android.settings.widget.SlidingTabLayout
-    xmlns:android="http://schemas.android.com/apk/res/android"
-    android:id="@+id/sliding_tabs"
-    android:layout_width="match_parent"
-    android:layout_height="wrap_content"
-    android:layout_marginStart="@dimen/dashboard_header_margin_start"
-    android:layout_marginEnd="@dimen/dashboard_header_margin_end"/>
diff --git a/res/values-sw720dp-land/dimens.xml b/res/values-sw720dp-land/dimens.xml
index 70faa0f..b1ec4c7 100644
--- a/res/values-sw720dp-land/dimens.xml
+++ b/res/values-sw720dp-land/dimens.xml
@@ -21,10 +21,6 @@
     <dimen name="dashboard_padding_start">160dp</dimen>
     <dimen name="dashboard_padding_end">160dp</dimen>
 
-    <!-- Dashboard Header margin in its container -->
-    <dimen name="dashboard_header_margin_start">304dp</dimen>
-    <dimen name="dashboard_header_margin_end">304dp</dimen>
-
     <!-- ActionBar contentInsetStart -->
     <dimen name="actionbar_contentInsetStart">128dp</dimen>
     <dimen name="actionbar_subsettings_contentInsetStart">128dp</dimen>
diff --git a/res/values-sw720dp/dimens.xml b/res/values-sw720dp/dimens.xml
index a0be467..981c936 100644
--- a/res/values-sw720dp/dimens.xml
+++ b/res/values-sw720dp/dimens.xml
@@ -42,10 +42,6 @@
     <dimen name="dashboard_padding_start">80dp</dimen>
     <dimen name="dashboard_padding_end">80dp</dimen>
 
-    <!-- Dashboard Header margin in its container -->
-    <dimen name="dashboard_header_margin_start">176dp</dimen>
-    <dimen name="dashboard_header_margin_end">176dp</dimen>
-
     <!-- Dashboard category padding start / end -->
     <dimen name="dashboard_category_padding_start">24dp</dimen>
     <dimen name="dashboard_category_padding_end">24dp</dimen>
diff --git a/res/values/dimens.xml b/res/values/dimens.xml
index 0ddc634..fe5845a 100755
--- a/res/values/dimens.xml
+++ b/res/values/dimens.xml
@@ -88,10 +88,6 @@
     <dimen name="dashboard_padding_top">0dp</dimen>
     <dimen name="dashboard_padding_bottom">0dp</dimen>
 
-    <!-- Dashboard Header margin in its container -->
-    <dimen name="dashboard_header_margin_start">0dp</dimen>
-    <dimen name="dashboard_header_margin_end">0dp</dimen>
-
     <!-- Dashboard category padding start / end -->
     <dimen name="dashboard_category_padding_start">0dp</dimen>
     <dimen name="dashboard_category_padding_end">0dp</dimen>
diff --git a/src/com/android/settings/SettingsActivity.java b/src/com/android/settings/SettingsActivity.java
index 00bdf57..84901fb 100644
--- a/src/com/android/settings/SettingsActivity.java
+++ b/src/com/android/settings/SettingsActivity.java
@@ -58,7 +58,6 @@
 import com.android.settings.core.gateway.SettingsGateway;
 import com.android.settings.core.instrumentation.MetricsFeatureProvider;
 import com.android.settings.core.instrumentation.SharedPreferencesLogger;
-import com.android.settings.dashboard.DashboardContainerFragment;
 import com.android.settings.dashboard.DashboardFeatureProvider;
 import com.android.settings.dashboard.DashboardSummary;
 import com.android.settings.dashboard.SearchResultsSummary;
@@ -154,6 +153,7 @@
     public static final String EXTRA_SHOW_FRAGMENT_AS_SUBSETTING =
             ":settings:show_fragment_as_subsetting";
 
+    @Deprecated
     public static final String EXTRA_HIDE_DRAWER = ":settings:hide_drawer";
 
     public static final String META_DATA_KEY_FRAGMENT_CLASS =
@@ -367,9 +367,6 @@
         if (intent.hasExtra(EXTRA_UI_OPTIONS)) {
             getWindow().setUiOptions(intent.getIntExtra(EXTRA_UI_OPTIONS, 0));
         }
-        if (intent.getBooleanExtra(EXTRA_HIDE_DRAWER, false)) {
-            setIsDrawerPresent(false);
-        }
 
         mDevelopmentPreferences = getSharedPreferences(DevelopmentSettings.PREF_FILE,
                 Context.MODE_PRIVATE);
@@ -461,17 +458,8 @@
                 mDisplaySearch = true;
                 mInitialTitleResId = R.string.dashboard_title;
 
-                // add argument to indicate which settings tab should be initially selected
-                final Bundle args = new Bundle();
-                final String extraName = DashboardContainerFragment.EXTRA_SELECT_SETTINGS_TAB;
-                args.putString(extraName, intent.getStringExtra(extraName));
-                if (isDashboardFeatureEnabled()) {
-                    switchToFragment(DashboardSummary.class.getName(), args, false, false,
+                switchToFragment(DashboardSummary.class.getName(), null /* args */, false, false,
                             mInitialTitleResId, mInitialTitle, false);
-                } else {
-                    switchToFragment(DashboardContainerFragment.class.getName(), args, false, false,
-                            mInitialTitleResId, mInitialTitle, false);
-                }
             }
         }
 
@@ -957,12 +945,7 @@
 
         if (UserHandle.MU_ENABLED && !isAdmin) {
             // When on restricted users, disable all extra categories (but only the settings ones).
-            List<DashboardCategory> categories;
-            if (isDashboardFeatureEnabled()) {
-                categories = mDashboardFeatureProvider.getAllCategories();
-            } else {
-                categories = getDashboardCategories();
-            }
+            final List<DashboardCategory> categories = mDashboardFeatureProvider.getAllCategories();
 
             for (DashboardCategory category : categories) {
                 for (Tile tile : category.tiles) {
@@ -1017,15 +1000,6 @@
         }
     }
 
-    @Override
-    protected boolean isDashboardFeatureEnabled() {
-        if (mDashboardFeatureProvider == null) {
-            mDashboardFeatureProvider =
-                    FeatureFactory.getFactory(this).getDashboardFeatureProvider(this);
-        }
-        return mDashboardFeatureProvider.isEnabled();
-    }
-
     // give subclasses access to the Next button
     public boolean hasNextButton() {
         return mNextButton != null;
@@ -1085,16 +1059,6 @@
     }
 
     @Override
-    protected void onTileClicked(Tile tile) {
-        if (mIsShowingDashboard) {
-            // If on dashboard, don't finish so the back comes back to here.
-            openTile(tile);
-        } else {
-            super.onTileClicked(tile);
-        }
-    }
-
-    @Override
     public void onProfileTileOpen() {
         if (!mIsShowingDashboard) {
             finish();
diff --git a/src/com/android/settings/accessibility/AccessibilitySettingsForSetupWizardActivity.java b/src/com/android/settings/accessibility/AccessibilitySettingsForSetupWizardActivity.java
index cf72383..b820cc2 100644
--- a/src/com/android/settings/accessibility/AccessibilitySettingsForSetupWizardActivity.java
+++ b/src/com/android/settings/accessibility/AccessibilitySettingsForSetupWizardActivity.java
@@ -46,7 +46,6 @@
 
         // Finish configuring the content view.
         getActionBar().setDisplayHomeAsUpEnabled(true);
-        setIsDrawerPresent(false);
     }
 
     @Override
diff --git a/src/com/android/settings/dashboard/DashboardContainerFragment.java b/src/com/android/settings/dashboard/DashboardContainerFragment.java
deleted file mode 100644
index b3ee808..0000000
--- a/src/com/android/settings/dashboard/DashboardContainerFragment.java
+++ /dev/null
@@ -1,194 +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.dashboard;
-
-import android.app.Activity;
-import android.app.Fragment;
-import android.app.FragmentManager;
-import android.content.Context;
-import android.os.Bundle;
-import android.support.v13.app.FragmentPagerAdapter;
-import android.text.TextUtils;
-import android.view.LayoutInflater;
-import android.view.View;
-import android.view.ViewGroup;
-
-import com.android.internal.logging.nano.MetricsProto;
-import com.android.settings.R;
-import com.android.settings.SettingsActivity;
-import com.android.settings.core.InstrumentedFragment;
-import com.android.settings.core.instrumentation.MetricsFeatureProvider;
-import com.android.settings.overlay.FeatureFactory;
-import com.android.settings.overlay.SupportFeatureProvider;
-import com.android.settings.widget.RtlCompatibleViewPager;
-import com.android.settings.widget.SlidingTabLayout;
-import com.android.settingslib.drawer.SettingsDrawerActivity;
-
-/**
- * Container for Dashboard fragments.
- */
-public final class DashboardContainerFragment extends InstrumentedFragment {
-
-    public static final String EXTRA_SELECT_SETTINGS_TAB = ":settings:select_settings_tab";
-
-    private static final String ARG_SUPPORT_TAB = "SUPPORT";
-    private static final String ARG_SUMMARY_TAB = "SUMMARY";
-    private static final int INDEX_SUMMARY_FRAGMENT = 0;
-    private static final int INDEX_SUPPORT_FRAGMENT = 1;
-
-    private RtlCompatibleViewPager mViewPager;
-    private View mHeaderView;
-    private DashboardViewPagerAdapter mPagerAdapter;
-
-    @Override
-    public int getMetricsCategory() {
-        return MetricsProto.MetricsEvent.DASHBOARD_CONTAINER;
-    }
-
-    @Override
-    public void onCreate(Bundle savedInstanceState) {
-        super.onCreate(savedInstanceState);
-        setHasOptionsMenu(true);
-    }
-
-    @Override
-    public View onCreateView(LayoutInflater inflater, ViewGroup parent, Bundle savedInstanceState) {
-        final View content = inflater.inflate(R.layout.dashboard_container, parent, false);
-        mViewPager = (RtlCompatibleViewPager) content.findViewById(R.id.pager);
-        mPagerAdapter = new DashboardViewPagerAdapter(getContext(),
-                getChildFragmentManager(), mViewPager);
-        mViewPager.setAdapter(mPagerAdapter);
-        mViewPager.addOnPageChangeListener(
-                new TabChangeListener((SettingsActivity) getActivity(), mMetricsFeatureProvider));
-
-        // check if support tab needs to be selected
-        final String selectedTab = getArguments().
-                getString(EXTRA_SELECT_SETTINGS_TAB, ARG_SUMMARY_TAB);
-        if (TextUtils.equals(selectedTab, ARG_SUPPORT_TAB)) {
-            mViewPager.setCurrentItem(INDEX_SUPPORT_FRAGMENT);
-        } else {
-            mViewPager.setCurrentItem(INDEX_SUMMARY_FRAGMENT);
-        }
-
-        mHeaderView = inflater.inflate(R.layout.dashboard_container_header, parent, false);
-        ((SlidingTabLayout) mHeaderView).setViewPager(mViewPager);
-        return content;
-    }
-
-    @Override
-    public void onResume() {
-        super.onResume();
-        if (mPagerAdapter.getCount() > 1) {
-            final Activity activity = getActivity();
-            if (activity instanceof SettingsDrawerActivity) {
-                ((SettingsDrawerActivity) getActivity()).setContentHeaderView(mHeaderView);
-            }
-        }
-    }
-
-    private static final class DashboardViewPagerAdapter extends FragmentPagerAdapter {
-
-        private final Context mContext;
-        private final SupportFeatureProvider mSupportFeatureProvider;
-        private final RtlCompatibleViewPager mViewPager;
-
-        public DashboardViewPagerAdapter(Context context, FragmentManager fragmentManager,
-                RtlCompatibleViewPager viewPager) {
-            super(fragmentManager);
-            mContext = context;
-            mSupportFeatureProvider =
-                    FeatureFactory.getFactory(context).getSupportFeatureProvider(context);
-            mViewPager = viewPager;
-        }
-
-        @Override
-        public CharSequence getPageTitle(int position) {
-            switch (position) {
-                case INDEX_SUMMARY_FRAGMENT:
-                    return mContext.getString(R.string.page_tab_title_summary);
-                case INDEX_SUPPORT_FRAGMENT:
-                    return mContext.getString(R.string.page_tab_title_support);
-            }
-            return super.getPageTitle(position);
-        }
-
-        @Override
-        public Fragment getItem(int position) {
-            switch (position) {
-                case INDEX_SUMMARY_FRAGMENT:
-                    return new DashboardSummary();
-                case INDEX_SUPPORT_FRAGMENT:
-                    return new SupportFragment();
-                default:
-                    throw new IllegalArgumentException(
-                            String.format(
-                                    "Position %d does not map to a valid dashboard fragment",
-                                    position));
-            }
-        }
-
-        @Override
-        public Object instantiateItem(ViewGroup container, int position) {
-            return super.instantiateItem(container,
-                    mViewPager.getRtlAwareIndex(position));
-        }
-
-        @Override
-        public int getCount() {
-            return mSupportFeatureProvider == null ? 1 : 2;
-        }
-    }
-
-    private static final class TabChangeListener
-            implements RtlCompatibleViewPager.OnPageChangeListener {
-
-        private final SettingsActivity mActivity;
-        private final MetricsFeatureProvider mMetricsFeatureProvider;
-
-        public TabChangeListener(SettingsActivity activity,
-                MetricsFeatureProvider metricsFeatureProvider) {
-            mActivity = activity;
-            mMetricsFeatureProvider = metricsFeatureProvider;
-        }
-
-        @Override
-        public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
-            // Do nothing.
-        }
-
-        @Override
-        public void onPageScrollStateChanged(int state) {
-            // Do nothing
-        }
-
-        @Override
-        public void onPageSelected(int position) {
-            switch (position) {
-                case INDEX_SUMMARY_FRAGMENT:
-                    mMetricsFeatureProvider.action(
-                            mActivity, MetricsProto.MetricsEvent.ACTION_SELECT_SUMMARY);
-                    mActivity.setDisplaySearchMenu(true);
-                    break;
-                case INDEX_SUPPORT_FRAGMENT:
-                    mMetricsFeatureProvider.action(
-                            mActivity, MetricsProto.MetricsEvent.ACTION_SELECT_SUPPORT_FRAGMENT);
-                    mActivity.setDisplaySearchMenu(false);
-                    break;
-            }
-        }
-    }
-}
diff --git a/tests/app/src/com/android/settings/dashboard/TabSelectionOnLaunchTest.java b/tests/app/src/com/android/settings/dashboard/TabSelectionOnLaunchTest.java
deleted file mode 100644
index 24c1ead..0000000
--- a/tests/app/src/com/android/settings/dashboard/TabSelectionOnLaunchTest.java
+++ /dev/null
@@ -1,108 +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.dashboard;
-
-import android.content.Intent;
-import android.support.test.InstrumentationRegistry;
-import android.support.test.filters.SmallTest;
-import android.support.test.rule.ActivityTestRule;
-import android.support.test.runner.AndroidJUnit4;
-import com.android.settings.Settings;
-import org.junit.Rule;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-
-import static android.support.test.espresso.Espresso.onView;
-import static android.support.test.espresso.assertion.ViewAssertions.matches;
-import static android.support.test.espresso.matcher.ViewMatchers.isSelected;
-import static android.support.test.espresso.matcher.ViewMatchers.withText;
-import static org.hamcrest.core.IsNot.not;
-
-@RunWith(AndroidJUnit4.class)
-@SmallTest
-public class TabSelectionOnLaunchTest {
-    @Rule
-    public ActivityTestRule<Settings> mActivityRule =
-            new ActivityTestRule<>(Settings.class, true, false);
-
-    private final int FLAG_RESTART = Intent.FLAG_ACTIVITY_CLEAR_TASK|Intent.FLAG_ACTIVITY_NEW_TASK;
-    private final String ARG_SELECT_SUPPORT_TAB = "SUPPORT";
-    private final String ARG_SELECT_FAKE_TAB = "NOT_SUPPORT";
-
-    @Test
-    /* cold start for settings app with correct flags and extra always selects support tab */
-    public void test_ColdStartWithCorrectArgsCorrectFlags_SupportSelected() {
-        launchSettingsWithFlags(ARG_SELECT_SUPPORT_TAB, FLAG_RESTART);
-        verifySupportSelected();
-    }
-
-    @Test
-    /* cold start with correct flags and wrong extra defaults to all tab */
-    public void test_ColdStartWithWrongExtra_DoesNotSelectSupport() {
-        launchSettingsWithFlags(ARG_SELECT_FAKE_TAB, FLAG_RESTART);
-        verifySupportNotSelected();
-    }
-
-    @Test
-    /* warm start from elsewhere in settings with wrong flags does not select support */
-    public void test_WarmStartSummarySelectedCorrectExtraWrongFlags_DoesNotSelectSupport() {
-        InstrumentationRegistry.getContext().
-                startActivity(new Intent(android.provider.Settings.ACTION_SETTINGS));
-        launchSettingsNoFlags(ARG_SELECT_SUPPORT_TAB);
-        verifySupportNotSelected();
-    }
-
-    @Test
-    /* warm start from elsewhere in settings with with wrong flags & extra does not select support*/
-    public void test_WarmStartSummarySelectedWrongExtraWrongFlags_DoesNotSelectSupport() {
-        InstrumentationRegistry.getContext().
-                startActivity(new Intent(android.provider.Settings.ACTION_SETTINGS));
-        launchSettingsNoFlags(ARG_SELECT_FAKE_TAB);
-        verifySupportNotSelected();
-    }
-
-    @Test
-    /* settings does not crash on null string */
-    public void test_DoesNotCrashOnNullExtra_DoesNotSelectSupport() {
-        launchSettingsWithFlags(null, FLAG_RESTART);
-        verifySupportNotSelected();
-    }
-
-    private void verifySupportNotSelected() {
-        onView(withText(mActivityRule.getActivity().getApplicationContext().
-                getString(com.android.settings.R.string.page_tab_title_support))).
-                check(matches(not(isSelected())));
-    }
-
-    private void verifySupportSelected() {
-        onView(withText(mActivityRule.getActivity().getApplicationContext().
-                getString(com.android.settings.R.string.page_tab_title_support))).
-                check(matches(isSelected()));
-    }
-
-    private void launchSettingsWithFlags(String extra, int flags) {
-        Intent intent = new Intent(android.provider.Settings.ACTION_SETTINGS);
-        intent.setFlags(flags);
-        intent.putExtra(DashboardContainerFragment.EXTRA_SELECT_SETTINGS_TAB, extra);
-        mActivityRule.launchActivity(intent);
-    }
-
-    private void launchSettingsNoFlags(String extra) {
-        Intent intent = new Intent(android.provider.Settings.ACTION_SETTINGS);
-        intent.putExtra(DashboardContainerFragment.EXTRA_SELECT_SETTINGS_TAB, extra);
-        mActivityRule.launchActivity(intent);
-    }
-}
\ No newline at end of file
