diff --git a/Android.mk b/Android.mk
index c42434f..a03d671 100644
--- a/Android.mk
+++ b/Android.mk
@@ -12,7 +12,7 @@
 endif
 
 src_dirs := src src-bind $(phone_common_dir)/src
-res_dirs := res res-aosp res-bind res-icons $(phone_common_dir)/res
+res_dirs := res res-aosp res-icons $(phone_common_dir)/res
 asset_dirs := assets
 
 LOCAL_SRC_FILES := $(call all-java-files-under, $(src_dirs))
diff --git a/res-bind/layout/navigation_view.xml b/res-bind/layout/navigation_view.xml
deleted file mode 100644
index d553768..0000000
--- a/res-bind/layout/navigation_view.xml
+++ /dev/null
@@ -1,28 +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.
--->
-<android.support.design.widget.NavigationView
-    xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:app="http://schemas.android.com/apk/res-auto"
-    android:id="@+id/nav_view"
-    android:theme="@style/NavigationDrawerMenuItemTextAppearance"
-    android:layout_width="wrap_content"
-    android:layout_height="match_parent"
-    android:layout_gravity="start"
-    android:fitsSystemWindows="true"
-    android:background="@android:color/white"
-    app:itemBackground="@drawable/drawer_item_background"
-    app:headerLayout="@layout/nav_header_main"
-    app:menu="@menu/activity_main_drawer"/>
diff --git a/res/layout/contacts_drawer_activity.xml b/res/layout/contacts_drawer_activity.xml
index 904a46b..e560494 100644
--- a/res/layout/contacts_drawer_activity.xml
+++ b/res/layout/contacts_drawer_activity.xml
@@ -17,6 +17,7 @@
 
 <android.support.v4.widget.DrawerLayout
     xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:app="http://schemas.android.com/apk/res-auto"
     xmlns:tools="http://schemas.android.com/tools"
     android:id="@+id/drawer_layout"
     android:layout_width="match_parent"
@@ -25,9 +26,40 @@
     tools:openDrawer="start">
 
     <!-- To prevent hamburger menu from getting the initial focus. -->
-    <include layout="@layout/dummy_view_for_initial_focus"/>
+    <View
+        android:focusable="true"
+        android:focusableInTouchMode="true"
+        android:layout_width="1px"
+        android:layout_height="1px" >
+        <requestFocus/>
+    </View>
 
-    <include layout="@layout/contacts_main_content"/>
+    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+        android:id="@+id/fragment_container"
+        android:orientation="vertical"
+        android:layout_width="match_parent"
+        android:layout_height="match_parent">
 
-    <include layout="@layout/navigation_view"/>
+        <include
+            layout="@layout/people_activity_toolbar"
+            android:id="@+id/toolbar_parent" />
+
+        <FrameLayout
+            android:id="@+id/content_frame"
+            android:layout_width="match_parent"
+            android:layout_height="fill_parent"
+            android:background="?android:attr/windowBackground" />
+    </LinearLayout>
+
+    <android.support.design.widget.NavigationView
+        android:id="@+id/nav_view"
+        android:theme="@style/NavigationDrawerMenuItemTextAppearance"
+        android:layout_width="wrap_content"
+        android:layout_height="match_parent"
+        android:layout_gravity="start"
+        android:fitsSystemWindows="true"
+        app:itemBackground="@drawable/drawer_item_background"
+        app:headerLayout="@layout/nav_header_main"
+        app:menu="@menu/activity_main_drawer"/>
+
 </android.support.v4.widget.DrawerLayout>
\ No newline at end of file
diff --git a/res/layout/contacts_main_content.xml b/res/layout/contacts_main_content.xml
deleted file mode 100644
index 748bdbb..0000000
--- a/res/layout/contacts_main_content.xml
+++ /dev/null
@@ -1,33 +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.
--->
-<LinearLayout
-    xmlns:android="http://schemas.android.com/apk/res/android"
-    android:id="@+id/fragment_container"
-    android:orientation="vertical"
-    android:layout_width="match_parent"
-    android:layout_height="match_parent">
-
-    <include
-        layout="@layout/people_activity_toolbar"
-        android:id="@+id/toolbar_parent" />
-
-    <FrameLayout
-        android:id="@+id/content_frame"
-        android:layout_width="match_parent"
-        android:layout_height="match_parent"
-        android:background="?android:attr/windowBackground" />
-</LinearLayout>
\ No newline at end of file
diff --git a/res/layout/dummy_view_for_initial_focus.xml b/res/layout/dummy_view_for_initial_focus.xml
deleted file mode 100644
index 3876e98..0000000
--- a/res/layout/dummy_view_for_initial_focus.xml
+++ /dev/null
@@ -1,24 +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.
--->
-
-<View
-    xmlns:android="http://schemas.android.com/apk/res/android"
-    android:focusable="true"
-    android:focusableInTouchMode="true"
-    android:layout_width="1px"
-    android:layout_height="1px" >
-    <requestFocus/>
-</View>
\ No newline at end of file
diff --git a/res/values/strings.xml b/res/values/strings.xml
index 0cae65a..b1e4762 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -1835,9 +1835,6 @@
     <!-- Toast shown when a dynamic shortcut is tapped after being disabled because the contact was removed -->
     <string name="dynamic_shortcut_contact_removed_message">Contact was removed</string>
 
-    <!-- Error message displayed to user when they started the app, but could not sign in to Google's servers. [CHAR LIMIT=50]-->
-    <string name="connection_failed">Failed to sign in</string>
-
     <!-- Text for button shown in toolbar to start import of SIM contacts -->
     <string name="sim_import_button_text">Import</string>
 
diff --git a/src-bind/com/android/contactsbind/ObjectFactory.java b/src-bind/com/android/contactsbind/ObjectFactory.java
index e55b7a8..d6799e2 100644
--- a/src-bind/com/android/contactsbind/ObjectFactory.java
+++ b/src-bind/com/android/contactsbind/ObjectFactory.java
@@ -13,9 +13,7 @@
  */
 package com.android.contactsbind;
 
-import com.android.contacts.ContactsDrawerActivity;
 import com.android.contacts.common.logging.Logger;
-import com.android.contacts.common.util.NavigationDrawer;
 import com.android.contactsbind.search.AutocompleteHelper;
 import com.android.contacts.common.util.DeviceLocalAccountTypeFactory;
 
@@ -52,8 +50,4 @@
     public static Intent getContactSheetIntent(Context context, Uri contactLookupUri) {
         return null;
     }
-
-    public static NavigationDrawer getNavigationDrawer(ContactsDrawerActivity activity) {
-        return new NavigationDrawer.Default(activity);
-    }
 }
diff --git a/src/com/android/contacts/ContactsDrawerActivity.java b/src/com/android/contacts/ContactsDrawerActivity.java
index 4614a70..a56ce0d 100644
--- a/src/com/android/contacts/ContactsDrawerActivity.java
+++ b/src/com/android/contacts/ContactsDrawerActivity.java
@@ -26,7 +26,6 @@
 import android.os.Bundle;
 import android.provider.ContactsContract.Intents;
 import android.support.annotation.LayoutRes;
-import android.support.annotation.NonNull;
 import android.support.design.widget.NavigationView;
 import android.support.v4.view.GravityCompat;
 import android.support.v4.view.MenuItemCompat;
@@ -34,7 +33,6 @@
 import android.support.v7.app.ActionBarDrawerToggle;
 import android.support.v7.app.AppCompatActivity;
 import android.support.v7.widget.Toolbar;
-import android.text.TextUtils;
 import android.util.Log;
 import android.view.Gravity;
 import android.view.LayoutInflater;
@@ -63,7 +61,6 @@
 import com.android.contacts.common.util.AccountsListAdapter.AccountListFilter;
 import com.android.contacts.common.util.ImplicitIntentsUtil;
 import com.android.contacts.common.util.MaterialColorMapUtils;
-import com.android.contacts.common.util.NavigationDrawer;
 import com.android.contacts.common.util.ViewUtil;
 import com.android.contacts.editor.ContactEditorFragment;
 import com.android.contacts.editor.SelectAccountDialogFragment;
@@ -83,7 +80,6 @@
 import com.android.contactsbind.ObjectFactory;
 import com.android.contactsbind.experiments.Flags;
 
-import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.Iterator;
 import java.util.List;
@@ -149,7 +145,7 @@
 
         private void stopSearchAndSelection() {
             final MultiSelectContactsListFragment listFragment;
-            if (isAccountView()) {
+            if (isAllContactsView() || isAccountView()) {
                 listFragment = getAllFragment();
             } else if (isGroupView()) {
                 listFragment = getGroupFragment();
@@ -196,7 +192,7 @@
     }
 
     protected ContactListFilterController mContactListFilterController;
-    protected DrawerLayout mDrawerLayout;
+    protected DrawerLayout mDrawer;
     protected ContactsActionBarDrawerToggle mToggle;
     protected Toolbar mToolbar;
     protected NavigationView mNavigationView;
@@ -206,8 +202,6 @@
     // The account the new group will be created under.
     private AccountWithDataSet mNewGroupAccount;
 
-    private NavigationDrawer mNavigationDrawer;
-
     // Recycle badge if possible
     private TextView mAssistantNewBadge;
 
@@ -218,18 +212,10 @@
     protected Map<ContactListFilter, MenuItem> mFilterMenuMap = new HashMap<>();
     protected Map<Integer, MenuItem> mIdMenuMap = new HashMap<>();
 
-    private List<GroupListItem> mGroupListItems;
-    private List<ContactListFilter> mAccountFilterItems;
-    private AccountWithDataSet mCurrentAccount;
-
-    protected boolean mShouldShowAccountSwitcher;
-
     @Override
     protected void onCreate(Bundle savedState) {
         super.onCreate(savedState);
 
-        mShouldShowAccountSwitcher = Flags.getInstance().getBoolean(Experiments.ACCOUNT_SWITCHER);
-
         mContactListFilterController = ContactListFilterController.getInstance(this);
         mContactListFilterController.checkFilterValidity(false);
 
@@ -243,11 +229,11 @@
         ViewUtil.addRectangularOutlineProvider(findViewById(R.id.toolbar_parent), getResources());
 
         // Set up hamburger button.
-        mDrawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout);
-        mToggle = new ContactsActionBarDrawerToggle(this, mDrawerLayout, mToolbar,
+        mDrawer = (DrawerLayout) findViewById(R.id.drawer_layout);
+        mToggle = new ContactsActionBarDrawerToggle(this, mDrawer, mToolbar,
                 R.string.navigation_drawer_open, R.string.navigation_drawer_close);
 
-        mDrawerLayout.setDrawerListener(mToggle);
+        mDrawer.setDrawerListener(mToggle);
         // Set fallback handler for when drawer is disabled.
         mToggle.setToolbarNavigationClickListener(new View.OnClickListener() {
             @Override
@@ -260,27 +246,21 @@
         if (savedState != null) {
             mCurrentView = ContactsView.values()[savedState.getInt(KEY_CONTACTS_VIEW)];
         } else {
-            resetContactsView();
+            mCurrentView = ContactsView.ALL_CONTACTS;
         }
 
+        // Set up hamburger menu items.
+        mNavigationView = (NavigationView) findViewById(R.id.nav_view);
+        mNavigationView.setNavigationItemSelectedListener(this);
+        setUpMenu();
+
+        initializeAssistantNewBadge();
         loadGroupsAndFilters();
 
         if (savedState != null && savedState.containsKey(KEY_NEW_GROUP_ACCOUNT)) {
             mNewGroupAccount = AccountWithDataSet.unstringify(
                     savedState.getString(KEY_NEW_GROUP_ACCOUNT));
         }
-
-        mNavigationDrawer = ObjectFactory.getNavigationDrawer(this);
-
-        mNavigationView = mNavigationDrawer.getNavigationView();
-        mNavigationView.setNavigationItemSelectedListener(this);
-        setUpMenu();
-        initializeAssistantNewBadge();
-    }
-
-    protected void resetContactsView() {
-        mCurrentView = mShouldShowAccountSwitcher
-                ? ContactsView.ACCOUNT_VIEW : ContactsView.ALL_CONTACTS;
     }
 
     private void initializeAssistantNewBadge() {
@@ -305,7 +285,7 @@
 
     public void setDrawerLockMode(boolean enabled) {
         // Prevent drawer from being opened by sliding from the start of screen.
-        mDrawerLayout.setDrawerLockMode(enabled ? DrawerLayout.LOCK_MODE_UNLOCKED
+        mDrawer.setDrawerLockMode(enabled ? DrawerLayout.LOCK_MODE_UNLOCKED
                 : DrawerLayout.LOCK_MODE_LOCKED_CLOSED);
 
         // Order of these statements matter.
@@ -346,14 +326,10 @@
             menu.removeItem(R.id.nav_help);
         }
 
-        if (!mShouldShowAccountSwitcher) {
-            final MenuItem allContactsMenu = menu.findItem(R.id.nav_all_contacts);
-            mIdMenuMap.put(R.id.nav_all_contacts, allContactsMenu);
-            if (isAllContactsView()) {
-                updateMenuSelection(allContactsMenu);
-            }
-        } else {
-            menu.removeItem(R.id.nav_all_contacts);
+        final MenuItem allContactsMenu = menu.findItem(R.id.nav_all_contacts);
+        mIdMenuMap.put(R.id.nav_all_contacts, allContactsMenu);
+        if (isAllContactsView()) {
+            updateMenuSelection(allContactsMenu);
         }
     }
 
@@ -373,11 +349,9 @@
     @Override
     protected void onResume() {
         super.onResume();
-        if (mDrawerLayout.isDrawerOpen(GravityCompat.START)) {
+        if (mDrawer.isDrawerOpen(GravityCompat.START)) {
             updateStatusBarBackground();
         }
-        // Restoring recent accounts.
-        mNavigationDrawer.onResume();
     }
 
     public void updateStatusBarBackground() {
@@ -387,34 +361,15 @@
     public void updateStatusBarBackground(int color) {
         if (!CompatUtils.isLollipopCompatible()) return;
         if (color == -1) {
-            mDrawerLayout.setStatusBarBackgroundColor(
-                    MaterialColorMapUtils.getStatusBarColor(this));
+            mDrawer.setStatusBarBackgroundColor(MaterialColorMapUtils.getStatusBarColor(this));
         } else {
-            mDrawerLayout.setStatusBarBackgroundColor(color);
+            mDrawer.setStatusBarBackgroundColor(color);
         }
-        mDrawerLayout.invalidate();
+        mDrawer.invalidate();
         getWindow().setStatusBarColor(Color.TRANSPARENT);
     }
 
     @Override
-    protected void onStart() {
-        super.onStart();
-        mNavigationDrawer.onStart();
-    }
-
-    @Override
-    protected void onPause() {
-        mNavigationDrawer.onPause();
-        super.onPause();
-    }
-
-    @Override
-    protected void onStop() {
-        mNavigationDrawer.onStop();
-        super.onStop();
-    }
-
-    @Override
     protected void onPostCreate(Bundle savedInstanceState) {
         super.onPostCreate(savedInstanceState);
         mToggle.syncState();
@@ -466,39 +421,15 @@
     public void onGroupsLoaded(List<GroupListItem> groupListItems) {
         final Menu menu = mNavigationView.getMenu();
         final MenuItem groupsMenuItem = menu.findItem(R.id.nav_groups);
-        if (groupsMenuItem == null) {
-            return;
-        }
-        final SubMenu subMenu = groupsMenuItem.getSubMenu();
-        subMenu.removeGroup(R.id.nav_groups_items);
-
-        mGroupListItems = groupListItems;
-
-        if (mShouldShowAccountSwitcher && mCurrentAccount != null) {
-            updateGroupMenuForAccount(mCurrentAccount);
-        } else {
-            updateGroupMenuForAccount(null);
-        }
-    }
-
-    /**
-     * Update menu items in group section of navigation drawer based on {@link AccountWithDataSet}.
-     * If {@link AccountWithDataSet} is null, then we show groups in all accounts.
-     */
-    public void updateGroupMenuForAccount(AccountWithDataSet account) {
-        mCurrentAccount = account;
-
-        final Menu menu = mNavigationView.getMenu();
-        final MenuItem groupsMenuItem = menu.findItem(R.id.nav_groups);
         final SubMenu subMenu = groupsMenuItem.getSubMenu();
         subMenu.removeGroup(R.id.nav_groups_items);
         mGroupMenuMap = new HashMap<>();
 
         final GroupMetaData groupMetaData = getGroupMetaData();
 
-        if (mGroupListItems != null ) {
+        if (groupListItems != null) {
             // Add each group
-            for (final GroupListItem groupListItem : getGroupsForCurrentAccount(mCurrentAccount)) {
+            for (final GroupListItem groupListItem : groupListItems) {
                 if (GroupUtil.isEmptyFFCGroup(groupListItem)) {
                     continue;
                 }
@@ -522,7 +453,7 @@
                                 updateMenuSelection(menuItem);
                             }
                         });
-                        mDrawerLayout.closeDrawer(GravityCompat.START);
+                        mDrawer.closeDrawer(GravityCompat.START);
                         return true;
                     }
                 });
@@ -547,33 +478,17 @@
                         onCreateGroupMenuItemClicked();
                     }
                 });
-                mDrawerLayout.closeDrawer(GravityCompat.START);
+                mDrawer.closeDrawer(GravityCompat.START);
                 return true;
             }
         });
 
         if (isGroupView() && groupMetaData != null) {
-            updateGroupMenuCheckedStatus(groupMetaData);
+            updateGroupMenu(groupMetaData);
         }
     }
 
-    private List<GroupListItem> getGroupsForCurrentAccount(AccountWithDataSet account) {
-        final List<GroupListItem> desiredGroupItems = new ArrayList<>();
-        if (account == null) {
-            desiredGroupItems.addAll(mGroupListItems);
-        } else {
-            for (GroupListItem group : mGroupListItems) {
-                if (TextUtils.equals(mCurrentAccount.name, group.getAccountName())
-                        && TextUtils.equals(mCurrentAccount.type, group.getAccountType())
-                        && TextUtils.equals(mCurrentAccount.dataSet, group.getDataSet())) {
-                    desiredGroupItems.add(group);
-                }
-            }
-        }
-        return desiredGroupItems;
-    }
-
-    public void updateGroupMenuCheckedStatus(GroupMetaData groupMetaData) {
+    public void updateGroupMenu(GroupMetaData groupMetaData) {
         clearCheckedMenus();
         if (groupMetaData != null && mGroupMenuMap != null
                 && mGroupMenuMap.get(groupMetaData.groupId) != null) {
@@ -613,12 +528,7 @@
         final Account account = extras == null ? null :
                 (Account) extras.getParcelable(Intents.Insert.EXTRA_ACCOUNT);
         if (account == null) {
-            if (mShouldShowAccountSwitcher && mCurrentAccount != null) {
-                // Create a new group in current account.
-                onAccountChosen(mCurrentAccount, /* extraArgs */ null);
-            } else {
-                selectAccountForNewGroup();
-            }
+            selectAccountForNewGroup();
         } else {
             final String dataSet = extras == null
                     ? null : extras.getString(Intents.Insert.EXTRA_DATA_SET);
@@ -630,11 +540,6 @@
 
     @Override
     public void onFiltersLoaded(List<ContactListFilter> accountFilterItems) {
-        mAccountFilterItems = accountFilterItems;
-
-        // Don't show accounts in menu if we enable account switcher.
-        if (mShouldShowAccountSwitcher) return;
-
         final AccountDisplayInfoFactory accountDisplayFactory = AccountDisplayInfoFactory.
                 fromListFilters(this, accountFilterItems);
 
@@ -648,6 +553,7 @@
             return;
         }
 
+
         for (int i = 0; i < accountFilterItems.size(); i++) {
             final ContactListFilter filter = accountFilterItems.get(i);
             final AccountDisplayInfo displayableAccount =
@@ -671,7 +577,7 @@
                             updateMenuSelection(menuItem);
                         }
                     });
-                    mDrawerLayout.closeDrawer(GravityCompat.START);
+                    mDrawer.closeDrawer(GravityCompat.START);
                     return true;
                 }
             });
@@ -713,21 +619,8 @@
                 AppCompatActivity.RESULT_OK, intent);
     }
 
-    public void changeFilter(AccountWithDataSet account) {
-        for (ContactListFilter filter : mAccountFilterItems) {
-            if (account.equals(filter.toAccountWithDataSet())) {
-                final Intent intent = new Intent();
-                intent.putExtra(AccountFilterActivity.EXTRA_CONTACT_LIST_FILTER, filter);
-                AccountFilterUtil.handleAccountFilterResult(mContactListFilterController,
-                        AppCompatActivity.RESULT_OK, intent);
-                clearCheckedMenus();
-                break;
-            }
-        }
-    }
-
     @Override
-    public boolean onNavigationItemSelected(@NonNull final MenuItem item) {
+    public boolean onNavigationItemSelected(final MenuItem item) {
         final int id = item.getItemId();
         mToggle.runWhenIdle(new Runnable() {
             @Override
@@ -752,14 +645,10 @@
             }
         });
 
-        mDrawerLayout.closeDrawer(GravityCompat.START);
+        mDrawer.closeDrawer(GravityCompat.START);
         return true;
     }
 
-    public void closeDrawer() {
-        mDrawerLayout.closeDrawer(GravityCompat.START);
-    }
-
     private Intent createPreferenceIntent() {
         final Intent intent = new Intent(this, ContactsPreferenceActivity.class);
         intent.putExtra(ContactsPreferenceActivity.EXTRA_NEW_LOCAL_PROFILE,
@@ -768,15 +657,12 @@
     }
 
     public void switchToAllContacts() {
-        if (mShouldShowAccountSwitcher) {
-            clearCheckedMenus();
-        } else {
-            resetFilter();
+        resetFilter();
 
-            final Menu menu = mNavigationView.getMenu();
-            final MenuItem allContacts = menu.findItem(R.id.nav_all_contacts);
-            updateMenuSelection(allContacts);
-        }
+        final Menu menu = mNavigationView.getMenu();
+        final MenuItem allContacts = menu.findItem(R.id.nav_all_contacts);
+        updateMenuSelection(allContacts);
+
         setTitle(getString(R.string.contactsList));
     }
 
@@ -811,9 +697,6 @@
     }
 
     private void setMenuChecked(MenuItem menuItem, boolean checked) {
-        if (menuItem == null) {
-            return;
-        }
         menuItem.setCheckable(checked);
         menuItem.setChecked(checked);
     }
@@ -839,7 +722,6 @@
 
     @Override
     public void onAccountChosen(AccountWithDataSet account, Bundle extraArgs) {
-        if (account == null) return;
         mNewGroupAccount = account;
         GroupNameEditDialogFragment.newInstanceForCreation(
                 mNewGroupAccount, GroupUtil.ACTION_CREATE_GROUP)
diff --git a/src/com/android/contacts/activities/PeopleActivity.java b/src/com/android/contacts/activities/PeopleActivity.java
index 5d5a8bf..90aa580 100644
--- a/src/com/android/contacts/activities/PeopleActivity.java
+++ b/src/com/android/contacts/activities/PeopleActivity.java
@@ -287,8 +287,8 @@
 
         if (isGroupDeleteAction(action)) {
             popSecondLevel();
-            resetContactsView();
             mMembersFragment.toastForSaveAction(action);
+            mCurrentView = ContactsView.ALL_CONTACTS;
             showFabWithAnimation(/* showFab */ true);
             return;
         }
@@ -538,9 +538,6 @@
         final int providerStatus = mProviderStatusWatcher.getProviderStatus();
         final Menu menu = mNavigationView.getMenu();
         final MenuItem groupsMenuItem = menu.findItem(R.id.nav_groups);
-        if (groupsMenuItem == null) {
-            return;
-        }
         final SubMenu subMenu = groupsMenuItem.getSubMenu();
 
         // Reload groups and filters if provider status changes to "normal" and there's no groups
@@ -644,8 +641,8 @@
         }
 
         // Handle the back event in drawer first.
-        if (mDrawerLayout.isDrawerOpen(GravityCompat.START)) {
-            mDrawerLayout.closeDrawer(GravityCompat.START);
+        if (mDrawer.isDrawerOpen(GravityCompat.START)) {
+            mDrawer.closeDrawer(GravityCompat.START);
             return;
         }
 
@@ -712,8 +709,7 @@
             return true;
         }
 
-        if (!mShouldShowAccountSwitcher
-                && !AccountFilterUtil.isAllContactsFilter(mContactListFilterController.getFilter())
+        if (!AccountFilterUtil.isAllContactsFilter(mContactListFilterController.getFilter())
                 && !mAllFragment.isHidden()) {
             // If mAllFragment is hidden, then mContactsUnavailableFragment is visible so we
             // don't need to switch to all contacts.
@@ -808,17 +804,6 @@
         super.onFilterMenuItemClicked(intent);
     }
 
-    @Override
-    public void changeFilter(AccountWithDataSet account) {
-        super.changeFilter(account);
-        // We must pop second level first to "restart" mAllFragment, before changing filter.
-        if (isInSecondLevel()) {
-            popSecondLevel();
-            showFabWithAnimation(/* showFab */ true);
-        }
-        mCurrentView = ContactsView.ACCOUNT_VIEW;
-    }
-
     private void switchToOrUpdateGroupView(String action) {
         // If group fragment is active and visible, we simply update it.
         if (mMembersFragment != null && !mMembersFragment.isInactive()) {
@@ -881,7 +866,7 @@
             popSecondLevel();
         }
         mShouldSwitchToAllContacts = false;
-        resetContactsView();
+        mCurrentView = ContactsView.ALL_CONTACTS;
         showFabWithAnimation(/* showFab */ true);
         mAllFragment.scrollToTop();
 
diff --git a/src/com/android/contacts/common/Experiments.java b/src/com/android/contacts/common/Experiments.java
index 5891fdb..827083b 100644
--- a/src/com/android/contacts/common/Experiments.java
+++ b/src/com/android/contacts/common/Experiments.java
@@ -21,11 +21,6 @@
 public final class Experiments {
 
     /**
-     * Experiment to enable account switcher
-     */
-    public static final String ACCOUNT_SWITCHER = "Account__account_switcher_enable";
-
-    /**
      * Experiment to enable assistant in left navigation drawer.
      */
     public static final String ASSISTANT = "Assistant__enable_assistant";
diff --git a/src/com/android/contacts/common/list/ContactListFilter.java b/src/com/android/contacts/common/list/ContactListFilter.java
index f3bac38..5b7472d 100644
--- a/src/com/android/contacts/common/list/ContactListFilter.java
+++ b/src/com/android/contacts/common/list/ContactListFilter.java
@@ -394,7 +394,7 @@
 
     /**
      * Returns true if this ContactListFilter contains at least one Google account.
-     * (see {@link #isGoogleAccountType )
+     * (see {@link #isGoogleAccountType)
      */
     public boolean isSyncable(List<AccountWithDataSet> accounts) {
         if (isGoogleAccountType() && filterType == ContactListFilter.FILTER_TYPE_ACCOUNT) {
@@ -410,7 +410,8 @@
                 // If we're showing all contacts and there is any Google account on the device then
                 // we're syncable.
                 for (AccountWithDataSet account : accounts) {
-                    if (account.isWritableGoogleAccount()) {
+                    if (GoogleAccountType.ACCOUNT_TYPE.equals(account.type)
+                            && account.dataSet == null) {
                         return true;
                     }
                 }
@@ -420,7 +421,7 @@
     }
 
     /**
-     * Returns the Google accounts (see {@link #isGoogleAccountType ) for this ContactListFilter.
+     * Returns the Google accounts (see {@link #isGoogleAccountType) for this ContactListFilter.
      */
     public List<Account> getSyncableAccounts(List<AccountWithDataSet> accounts) {
         final List<Account> syncableAccounts = new ArrayList<>();
@@ -432,7 +433,8 @@
                 || filterType == ContactListFilter.FILTER_TYPE_DEFAULT) {
             if (accounts != null && accounts.size() > 0) {
                 for (AccountWithDataSet account : accounts) {
-                    if (account.isWritableGoogleAccount()) {
+                    if (GoogleAccountType.ACCOUNT_TYPE.equals(account.type)
+                            && account.dataSet == null) {
                         syncableAccounts.add(new Account(account.name, account.type));
                     }
                 }
diff --git a/src/com/android/contacts/common/list/ContactListFilterController.java b/src/com/android/contacts/common/list/ContactListFilterController.java
index 5ceef18..4d3d6ad 100644
--- a/src/com/android/contacts/common/list/ContactListFilterController.java
+++ b/src/com/android/contacts/common/list/ContactListFilterController.java
@@ -81,8 +81,6 @@
      * which case, we should switch to the last saved filter in {@link SharedPreferences}.
      */
     public abstract void checkFilterValidity(boolean notifyListeners);
-
-    public abstract Context getContext();
 }
 
 /**
@@ -198,9 +196,4 @@
                 mFilter.accountName, mFilter.accountType, mFilter.dataSet);
         return accountTypeManager.contains(filterAccount, /* contactWritableOnly */ false);
     }
-
-    @Override
-    public Context getContext() {
-        return mContext;
-    }
 }
diff --git a/src/com/android/contacts/common/model/AccountTypeManager.java b/src/com/android/contacts/common/model/AccountTypeManager.java
index 8d01892..15c9771 100644
--- a/src/com/android/contacts/common/model/AccountTypeManager.java
+++ b/src/com/android/contacts/common/model/AccountTypeManager.java
@@ -313,13 +313,13 @@
             return -1;
         } else if (a.name == null || a.type == null) {
             return 1;
-        } else if (a.isWritableGoogleAccount() && a.equals(mDefaultAccount)) {
+        } else if (isWritableGoogleAccount(a) && a.equals(mDefaultAccount)) {
             return -1;
-        } else if (b.isWritableGoogleAccount() && b.equals(mDefaultAccount)) {
+        } else if (isWritableGoogleAccount(b) && b.equals(mDefaultAccount)) {
             return 1;
-        } else if (a.isWritableGoogleAccount() && !b.isWritableGoogleAccount()) {
+        } else if (isWritableGoogleAccount(a) && !isWritableGoogleAccount(b)) {
             return -1;
-        } else if (b.isWritableGoogleAccount() && !a.isWritableGoogleAccount()) {
+        } else if (isWritableGoogleAccount(b) && !isWritableGoogleAccount(a)) {
             return 1;
         } else {
             int diff = a.name.compareToIgnoreCase(b.name);
@@ -339,6 +339,10 @@
             }
         }
     }
+
+    private static boolean isWritableGoogleAccount(AccountWithDataSet account) {
+        return GoogleAccountType.ACCOUNT_TYPE.equals(account.type) && account.dataSet == null;
+    }
 }
 
 class AccountTypeManagerImpl extends AccountTypeManager
diff --git a/src/com/android/contacts/common/model/account/AccountDisplayInfo.java b/src/com/android/contacts/common/model/account/AccountDisplayInfo.java
index c5463d6..f68fdd5 100644
--- a/src/com/android/contacts/common/model/account/AccountDisplayInfo.java
+++ b/src/com/android/contacts/common/model/account/AccountDisplayInfo.java
@@ -65,7 +65,7 @@
     }
 
     public boolean isGoogleAccount() {
-        return mSource.isWritableGoogleAccount();
+        return GoogleAccountType.ACCOUNT_TYPE.equals(mSource.type) && mSource.dataSet == null;
     }
 
     public boolean isDeviceAccount() {
diff --git a/src/com/android/contacts/common/model/account/AccountWithDataSet.java b/src/com/android/contacts/common/model/account/AccountWithDataSet.java
index 4917abc..3ee0aab 100644
--- a/src/com/android/contacts/common/model/account/AccountWithDataSet.java
+++ b/src/com/android/contacts/common/model/account/AccountWithDataSet.java
@@ -79,10 +79,6 @@
         mAccountTypeWithDataSet = AccountTypeWithDataSet.get(type, dataSet);
     }
 
-    public boolean isWritableGoogleAccount() {
-        return GoogleAccountType.ACCOUNT_TYPE.equals(type) && dataSet == null;
-    }
-
     public boolean isNullAccount() {
         return name == null && type == null && dataSet == null;
     }
diff --git a/src/com/android/contacts/common/preference/ContactsPreferences.java b/src/com/android/contacts/common/preference/ContactsPreferences.java
index 5a79877..ac7b0e0 100644
--- a/src/com/android/contacts/common/preference/ContactsPreferences.java
+++ b/src/com/android/contacts/common/preference/ContactsPreferences.java
@@ -20,7 +20,6 @@
 import android.content.SharedPreferences;
 import android.content.SharedPreferences.Editor;
 import android.content.SharedPreferences.OnSharedPreferenceChangeListener;
-import android.os.Bundle;
 import android.os.Handler;
 import android.os.Looper;
 import android.preference.PreferenceManager;
@@ -68,10 +67,6 @@
 
     public static final boolean PREF_DISPLAY_ONLY_PHONES_DEFAULT = false;
 
-    private static final String NAV_DRAWER_FIRST_RECENT = "NavigationDrawer_first_recent";
-
-    private static final String NAV_DRAWER_SECOND_RECENT = "NavigationDrawer_second_recent";
-
     /**
      * Value to use when a preference is unassigned and needs to be read from the shared preferences
      */
@@ -238,26 +233,6 @@
         return false;
     }
 
-    public void setRecentAccounts(@NonNull List<String> recentAccounts) {
-        final int size = recentAccounts.size();
-        final Editor editor = mPreferences.edit();
-        editor.putString(NAV_DRAWER_FIRST_RECENT, size > 0 ? recentAccounts.get(0) : null);
-        editor.putString(NAV_DRAWER_SECOND_RECENT, size > 1 ? recentAccounts.get(1) : null);
-        editor.commit();
-    }
-
-    public void getRecentAccounts(List<String> recentAccounts) {
-        recentAccounts.clear();
-        String recent = mPreferences.getString(NAV_DRAWER_FIRST_RECENT, null);
-        if (recent != null) {
-            recentAccounts.add(recent);
-        }
-        recent = mPreferences.getString(NAV_DRAWER_SECOND_RECENT, null);
-        if (recent != null) {
-            recentAccounts.add(recent);
-        }
-    }
-
     public void registerChangeListener(ChangeListener listener) {
         if (mListener != null) unregisterChangeListener();
 
diff --git a/src/com/android/contacts/common/util/AccountFilterUtil.java b/src/com/android/contacts/common/util/AccountFilterUtil.java
index ed72f67..96c5113 100644
--- a/src/com/android/contacts/common/util/AccountFilterUtil.java
+++ b/src/com/android/contacts/common/util/AccountFilterUtil.java
@@ -32,7 +32,6 @@
 
 import com.android.contacts.R;
 import com.android.contacts.activities.ContactEditorActivity;
-import com.android.contacts.common.Experiments;
 import com.android.contacts.common.list.AccountFilterActivity;
 import com.android.contacts.common.list.ContactListFilter;
 import com.android.contacts.common.list.ContactListFilterController;
@@ -43,7 +42,6 @@
 import com.android.contacts.common.model.account.AccountWithDataSet;
 import com.android.contacts.common.preference.ContactsPreferences;
 import com.android.contactsbind.ObjectFactory;
-import com.android.contactsbind.experiments.Flags;
 
 import com.google.common.collect.Lists;
 
@@ -91,7 +89,8 @@
             if (filter.filterType == ContactListFilter.FILTER_TYPE_CUSTOM) {
                 filterController.selectCustomFilter();
             } else {
-                filterController.setContactListFilter(filter, shouldPersistFilter(filter));
+                filterController.setContactListFilter(filter, /* persistent */
+                        filter.filterType == ContactListFilter.FILTER_TYPE_ALL_ACCOUNTS);
             }
         }
     }
@@ -133,7 +132,6 @@
     private static List<ContactListFilter> loadAccountFilters(Context context,
             DeviceLocalAccountTypeFactory deviceAccountTypeFactory) {
         final ArrayList<ContactListFilter> accountFilters = Lists.newArrayList();
-
         final AccountTypeManager accountTypeManager = AccountTypeManager.getInstance(context);
         final List<AccountWithDataSet> accounts = accountTypeManager.getSortedAccounts(
                 /* defaultAccount */ getDefaultAccount(context), /* contactWritableOnly */ true);
@@ -238,11 +236,4 @@
         return account.withFormattedName(context, R.string.title_from_other_accounts)
                 .getNameLabel().toString();
     }
-
-    public static boolean shouldPersistFilter(ContactListFilter filter) {
-        if (Flags.getInstance().getBoolean(Experiments.ACCOUNT_SWITCHER)) {
-            return true;
-        }
-        return filter != null && filter.isContactsFilterType();
-    }
 }
diff --git a/src/com/android/contacts/common/util/DeviceLocalAccountTypeFactory.java b/src/com/android/contacts/common/util/DeviceLocalAccountTypeFactory.java
index e54b31f..040a6b4 100644
--- a/src/com/android/contacts/common/util/DeviceLocalAccountTypeFactory.java
+++ b/src/com/android/contacts/common/util/DeviceLocalAccountTypeFactory.java
@@ -52,6 +52,7 @@
 
         public static boolean isLocalAccountType(DeviceLocalAccountTypeFactory factory,
                 String type) {
+
             return isLocalAccountType(factory.classifyAccount(type));
         }
     }
diff --git a/src/com/android/contacts/common/util/NavigationDrawer.java b/src/com/android/contacts/common/util/NavigationDrawer.java
deleted file mode 100644
index c60f029..0000000
--- a/src/com/android/contacts/common/util/NavigationDrawer.java
+++ /dev/null
@@ -1,56 +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.contacts.common.util;
-
-import android.support.design.widget.NavigationView;
-import android.support.v7.app.AppCompatActivity;
-
-import com.android.contacts.R;
-
-public interface NavigationDrawer {
-    void onStart();
-    void onResume();
-    void onPause();
-    void onStop();
-    NavigationView getNavigationView();
-
-    class Default implements NavigationDrawer {
-
-        AppCompatActivity mActivity;
-
-        public Default(AppCompatActivity activity) {
-            mActivity = activity;
-        }
-
-        @Override
-        public void onStart() {}
-
-        @Override
-        public void onResume() {}
-
-        @Override
-        public void onPause() {}
-
-        @Override
-        public void onStop() {}
-
-        @Override
-        public NavigationView getNavigationView() {
-            return (NavigationView) mActivity.findViewById(R.id.nav_view);
-        }
-    }
-}
diff --git a/src/com/android/contacts/group/GroupMembersFragment.java b/src/com/android/contacts/group/GroupMembersFragment.java
index ab978ac..be3b127 100644
--- a/src/com/android/contacts/group/GroupMembersFragment.java
+++ b/src/com/android/contacts/group/GroupMembersFragment.java
@@ -786,7 +786,7 @@
         maybeAttachCheckBoxListener();
 
         mActivity.setTitle(mGroupMetaData.groupName);
-        mActivity.updateGroupMenuCheckedStatus(mGroupMetaData);
+        mActivity.updateGroupMenu(mGroupMetaData);
         mActivity.invalidateOptionsMenu();
 
         // Start loading the group members
diff --git a/src/com/android/contacts/list/DefaultContactBrowseListFragment.java b/src/com/android/contacts/list/DefaultContactBrowseListFragment.java
index ad1a2ca..5539428 100644
--- a/src/com/android/contacts/list/DefaultContactBrowseListFragment.java
+++ b/src/com/android/contacts/list/DefaultContactBrowseListFragment.java
@@ -29,7 +29,6 @@
 import android.content.res.Resources;
 import android.database.Cursor;
 import android.graphics.Rect;
-import android.graphics.drawable.Drawable;
 import android.net.Uri;
 import android.os.Bundle;
 import android.os.Handler;
@@ -73,13 +72,8 @@
 import com.android.contacts.common.logging.Logger;
 import com.android.contacts.common.logging.ScreenEvent;
 import com.android.contacts.common.model.AccountTypeManager;
-import com.android.contacts.common.model.account.AccountDisplayInfo;
-import com.android.contacts.common.model.account.AccountDisplayInfoFactory;
-import com.android.contacts.common.model.account.AccountType;
 import com.android.contacts.common.model.account.AccountWithDataSet;
-import com.android.contacts.common.preference.ContactsPreferences;
 import com.android.contacts.common.util.AccountFilterUtil;
-import com.android.contacts.common.util.DeviceLocalAccountTypeFactory;
 import com.android.contacts.common.util.ImplicitIntentsUtil;
 import com.android.contacts.interactions.ContactDeletionInteraction;
 import com.android.contacts.interactions.ContactMultiDeletionInteraction;
@@ -89,7 +83,6 @@
 import com.android.contacts.util.SyncUtil;
 import com.android.contactsbind.experiments.Flags;
 import com.android.contactsbind.FeatureHighlightHelper;
-import com.android.contactsbind.ObjectFactory;
 
 import java.util.List;
 import java.util.Locale;
@@ -163,7 +156,6 @@
     private ContactsDrawerActivity mActivity;
     private ContactsRequest mContactsRequest;
     private ContactListFilterController mContactListFilterController;
-    private DeviceLocalAccountTypeFactory mDeviceLocalFactory;
 
     private final ActionBarAdapter.Listener mActionBarListener = new ActionBarAdapter.Listener() {
         @Override
@@ -457,14 +449,13 @@
         mIsRecreatedInstance = (savedState != null);
         mContactListFilterController = ContactListFilterController.getInstance(getContext());
         mContactListFilterController.checkFilterValidity(false);
-        mDeviceLocalFactory = ObjectFactory.getDeviceLocalAccountTypeFactory(getContext());
-        if (!Flags.getInstance().getBoolean(Experiments.ACCOUNT_SWITCHER)
-                && !mIsRecreatedInstance) {
-            // Use FILTER_TYPE_ALL_ACCOUNTS filter if the instance is not a re-created one.
-            // This is useful when user upgrades app while an account filter was
-            // stored in sharedPreference in a previous version of Contacts app.
-            setContactListFilter(AccountFilterUtil.createContactsFilter(getContext()));
-        }
+        // Use FILTER_TYPE_ALL_ACCOUNTS filter if the instance is not a re-created one.
+        // This is useful when user upgrades app while an account filter was
+        // stored in sharedPreference in a previous version of Contacts app.
+        final ContactListFilter filter = mIsRecreatedInstance
+                ? getFilter()
+                : AccountFilterUtil.createContactsFilter(getContext());
+        setContactListFilter(filter);
     }
 
     @Override
@@ -960,7 +951,7 @@
      */
     private void setContactListFilter(ContactListFilter filter) {
         mContactListFilterController.setContactListFilter(filter,
-                AccountFilterUtil.shouldPersistFilter(filter));
+                /* persistent */ isAllContactsFilter(filter));
     }
 
     @Override
