diff --git a/src/com/android/car/settings/users/GuestFragment.java b/src/com/android/car/settings/users/GuestFragment.java
deleted file mode 100644
index 611d548..0000000
--- a/src/com/android/car/settings/users/GuestFragment.java
+++ /dev/null
@@ -1,100 +0,0 @@
-/*
- * Copyright (C) 2018 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.car.settings.users;
-
-import android.car.user.CarUserManagerHelper;
-import android.graphics.drawable.Drawable;
-import android.os.Bundle;
-import android.view.View;
-import android.widget.Button;
-
-import androidx.car.widget.ListItem;
-import androidx.car.widget.ListItemProvider;
-import androidx.car.widget.TextListItem;
-
-import com.android.car.settings.R;
-import com.android.car.settings.common.ListItemSettingsFragment;
-
-import java.util.ArrayList;
-import java.util.List;
-
-/**
- * Shows details for a guest session, including ability to switch to guest.
- */
-public class GuestFragment extends ListItemSettingsFragment {
-    private CarUserManagerHelper mCarUserManagerHelper;
-    private ListItemProvider mItemProvider;
-    private UserIconProvider mUserIconProvider;
-
-    /**
-     * Create new GuestFragment instance.
-     */
-    public static GuestFragment newInstance() {
-        GuestFragment guestFragment = new GuestFragment();
-        Bundle bundle = ListItemSettingsFragment.getBundle();
-        bundle.putInt(EXTRA_TITLE_ID, R.string.user_details_title);
-        bundle.putInt(EXTRA_ACTION_BAR_LAYOUT, R.layout.action_bar_with_button);
-        guestFragment.setArguments(bundle);
-        return guestFragment;
-    }
-
-    @Override
-    public void onActivityCreated(Bundle savedInstanceState) {
-        mCarUserManagerHelper = new CarUserManagerHelper(getContext());
-        mUserIconProvider = new UserIconProvider(mCarUserManagerHelper);
-        mItemProvider = new ListItemProvider.ListProvider(getListItems());
-
-        // Super class's onActivityCreated need to be called after mItemProvider is initialized.
-        // Because getItemProvider is called in there.
-        super.onActivityCreated(savedInstanceState);
-
-        showSwitchButton();
-    }
-
-    private void showSwitchButton() {
-        Button switchUserBtn = (Button) getActivity().findViewById(R.id.action_button1);
-        // If the current process is not allowed to switch to another user, doe not show the switch
-        // button.
-        if (!mCarUserManagerHelper.canCurrentProcessSwitchUsers()) {
-            switchUserBtn.setVisibility(View.GONE);
-            return;
-        }
-        switchUserBtn.setVisibility(View.VISIBLE);
-        switchUserBtn.setText(R.string.user_switch);
-        switchUserBtn.setOnClickListener(v -> {
-            getActivity().onBackPressed();
-            mCarUserManagerHelper.startNewGuestSession(getContext().getString(R.string.user_guest));
-        });
-    }
-
-    private List<ListItem> getListItems() {
-        Drawable icon = mUserIconProvider.getDefaultGuestIcon(getContext());
-
-        TextListItem item = new TextListItem(getContext());
-        item.setPrimaryActionIcon(icon, /* useLargeIcon= */ false);
-        item.setTitle(getContext().getString(R.string.user_guest));
-
-        List<ListItem> items = new ArrayList<>();
-        items.add(item);
-        return items;
-    }
-
-    @Override
-    public ListItemProvider getItemProvider() {
-        return mItemProvider;
-    }
-}
diff --git a/src/com/android/car/settings/users/UsersItemProvider.java b/src/com/android/car/settings/users/UsersItemProvider.java
index 578cade..b060a6f 100644
--- a/src/com/android/car/settings/users/UsersItemProvider.java
+++ b/src/com/android/car/settings/users/UsersItemProvider.java
@@ -85,9 +85,6 @@
         TextListItem item = new TextListItem(mContext);
         item.setPrimaryActionIcon(icon, /* useLargeIcon= */ false);
         item.setTitle(mContext.getString(R.string.user_guest));
-
-        item.setOnClickListener(view -> mUserClickListener.onGuestClicked());
-        item.setSupplementalIcon(R.drawable.ic_chevron_right, false);
         return item;
     }
 
@@ -101,10 +98,5 @@
          * @param userInfo User for which the click is registered.
          */
         void onUserClicked(UserInfo userInfo);
-
-        /**
-         * Invoked when guest is clicked.
-         */
-        void onGuestClicked();
     }
 }
diff --git a/src/com/android/car/settings/users/UsersListFragment.java b/src/com/android/car/settings/users/UsersListFragment.java
index 25a27fe..a65a8ed 100644
--- a/src/com/android/car/settings/users/UsersListFragment.java
+++ b/src/com/android/car/settings/users/UsersListFragment.java
@@ -158,11 +158,6 @@
     }
 
     @Override
-    public void onGuestClicked() {
-        getFragmentController().launchFragment(GuestFragment.newInstance());
-    }
-
-    @Override
     public ListItemProvider getItemProvider() {
         return mItemProvider;
     }
diff --git a/tests/robotests/src/com/android/car/settings/users/UsersItemProviderTest.java b/tests/robotests/src/com/android/car/settings/users/UsersItemProviderTest.java
index 6168379..6c7ddbd 100644
--- a/tests/robotests/src/com/android/car/settings/users/UsersItemProviderTest.java
+++ b/tests/robotests/src/com/android/car/settings/users/UsersItemProviderTest.java
@@ -135,20 +135,6 @@
         verify(mUserClickListener).onUserClicked(otherUsers.get(0));
     }
 
-    @Test
-    public void testClickOnGuestInvokesOnGuestClicked() {
-        UserInfo currentUser = new UserInfo(/* id= */ 11, "User 11", /* flags= */ 0);
-        doReturn(currentUser).when(mCarUserManagerHelper).getCurrentProcessUserInfo();
-
-        UsersItemProvider provider = createProvider();
-
-        // Clicking on guest user invokes OnGuestClicked.
-        ShadowTextListItem guestListItem = getItem(provider, 1);
-        guestListItem.getOnClickListener().onClick(new View(application.getApplicationContext()));
-        verify(mUserClickListener).onGuestClicked();
-    }
-
-
     private UsersItemProvider createProvider() {
         return new UsersItemProvider(RuntimeEnvironment.application.getApplicationContext(),
                 mUserClickListener, mCarUserManagerHelper);
diff --git a/tests/robotests/src/com/android/car/settings/users/UsersListFragmentTest.java b/tests/robotests/src/com/android/car/settings/users/UsersListFragmentTest.java
index 879844d..612115e 100644
--- a/tests/robotests/src/com/android/car/settings/users/UsersListFragmentTest.java
+++ b/tests/robotests/src/com/android/car/settings/users/UsersListFragmentTest.java
@@ -143,16 +143,6 @@
                 .findFragmentById(R.id.fragment_container)).isNotNull();
     }
 
-    /* Test that clicking on a guest invokes user details fragment. */
-    @Test
-    public void testOnGuestClicked() {
-        createUsersListFragment();
-        mFragment.onGuestClicked();
-
-        assertThat((GuestFragment) mFragment.getFragmentManager()
-                .findFragmentById(R.id.fragment_container)).isNotNull();
-    }
-
     private void createUsersListFragment(UserInfo userInfo) {
         UserInfo testUser = userInfo == null ? new UserInfo() : userInfo;
 
