diff --git a/tests/robotests/src/com/android/car/settings/applications/ApplicationDetailsFragmentTest.java b/tests/robotests/src/com/android/car/settings/applications/ApplicationDetailsFragmentTest.java
index 8136b17..8c9ac2a 100644
--- a/tests/robotests/src/com/android/car/settings/applications/ApplicationDetailsFragmentTest.java
+++ b/tests/robotests/src/com/android/car/settings/applications/ApplicationDetailsFragmentTest.java
@@ -18,7 +18,6 @@
 
 import static com.google.common.truth.Truth.assertThat;
 
-import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.when;
 
 import android.app.Activity;
@@ -34,7 +33,6 @@
 import android.content.pm.PackageManager;
 import android.content.pm.ResolveInfo;
 import android.content.pm.Signature;
-import android.content.pm.UserInfo;
 import android.os.Bundle;
 import android.os.Handler;
 import android.os.UserHandle;
@@ -103,17 +101,15 @@
         MockitoAnnotations.initMocks(this);
         ShadowCarUserManagerHelper.setMockInstance(mCarUserManagerHelper);
         int userId = UserHandle.myUserId();
-        UserInfo userInfo = new UserInfo();
-        userInfo.id = userId;
-        when(mCarUserManagerHelper.getCurrentProcessUserId()).thenReturn(userId);
-        when(mCarUserManagerHelper.getAllUsers()).thenReturn(Collections.singletonList(userInfo));
-        UserManager mockUserManager = mock(UserManager.class);
-        when(mockUserManager.getUserInfo(userId)).thenReturn(userInfo);
-        ShadowUserManager.setInstance(mockUserManager);
 
         mContext = RuntimeEnvironment.application;
+        getShadowUserManager().addUser(userId, "userName", /* flags= */ 0);
         getShadowUserManager().addProfile(userId, userId, "profileName", /* profileFlags= */ 0);
 
+        when(mCarUserManagerHelper.getCurrentProcessUserId()).thenReturn(userId);
+        when(mCarUserManagerHelper.getAllUsers()).thenReturn(
+                Collections.singletonList(UserManager.get(mContext).getUserInfo(userId)));
+
         mActivity = new TestActivity();
         mController = ActivityController.of(mActivity);
         mController.create();
diff --git a/tests/robotests/src/com/android/car/settings/applications/managedomainurls/DomainAppPreferenceControllerTest.java b/tests/robotests/src/com/android/car/settings/applications/managedomainurls/DomainAppPreferenceControllerTest.java
index 17423a8..14e85dc 100644
--- a/tests/robotests/src/com/android/car/settings/applications/managedomainurls/DomainAppPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/car/settings/applications/managedomainurls/DomainAppPreferenceControllerTest.java
@@ -40,7 +40,6 @@
 import com.android.car.settings.testutils.ShadowApplicationsState;
 import com.android.car.settings.testutils.ShadowCarUserManagerHelper;
 import com.android.car.settings.testutils.ShadowIconDrawableFactory;
-import com.android.car.settings.testutils.ShadowUserManager;
 import com.android.settingslib.applications.ApplicationsState;
 import com.android.settingslib.core.lifecycle.Lifecycle;
 
@@ -53,14 +52,15 @@
 import org.mockito.MockitoAnnotations;
 import org.robolectric.RobolectricTestRunner;
 import org.robolectric.RuntimeEnvironment;
+import org.robolectric.Shadows;
 import org.robolectric.annotation.Config;
-import org.robolectric.shadow.api.Shadow;
+import org.robolectric.shadows.ShadowUserManager;
 
 import java.util.ArrayList;
 
 @RunWith(RobolectricTestRunner.class)
-@Config(shadows = {ShadowUserManager.class, ShadowCarUserManagerHelper.class,
-        ShadowIconDrawableFactory.class, ShadowApplicationsState.class})
+@Config(shadows = {ShadowCarUserManagerHelper.class, ShadowIconDrawableFactory.class,
+        ShadowApplicationsState.class})
 public class DomainAppPreferenceControllerTest {
 
     private static final int USER_ID = 10;
@@ -109,7 +109,6 @@
     public void tearDown() {
         ShadowApplicationsState.reset();
         ShadowCarUserManagerHelper.reset();
-        ShadowUserManager.reset();
     }
 
     @Test
@@ -165,6 +164,6 @@
     }
 
     private ShadowUserManager getShadowUserManager() {
-        return Shadow.extract(UserManager.get(mContext));
+        return Shadows.shadowOf(UserManager.get(mContext));
     }
 }
diff --git a/tests/robotests/src/com/android/car/settings/development/DevelopmentSettingsUtilTest.java b/tests/robotests/src/com/android/car/settings/development/DevelopmentSettingsUtilTest.java
index d208f6d..3b486fb 100644
--- a/tests/robotests/src/com/android/car/settings/development/DevelopmentSettingsUtilTest.java
+++ b/tests/robotests/src/com/android/car/settings/development/DevelopmentSettingsUtilTest.java
@@ -18,8 +18,6 @@
 
 import static com.google.common.truth.Truth.assertThat;
 
-import static org.mockito.ArgumentMatchers.anyInt;
-import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.when;
 
 import android.car.userlib.CarUserManagerHelper;
@@ -30,7 +28,6 @@
 
 import com.android.car.settings.testutils.ShadowCarUserManagerHelper;
 import com.android.car.settings.testutils.ShadowLocalBroadcastManager;
-import com.android.car.settings.testutils.ShadowUserManager;
 
 import org.junit.After;
 import org.junit.Before;
@@ -40,12 +37,12 @@
 import org.mockito.MockitoAnnotations;
 import org.robolectric.RobolectricTestRunner;
 import org.robolectric.RuntimeEnvironment;
+import org.robolectric.Shadows;
 import org.robolectric.annotation.Config;
-import org.robolectric.shadow.api.Shadow;
+import org.robolectric.shadows.ShadowUserManager;
 
 @RunWith(RobolectricTestRunner.class)
-@Config(shadows = {ShadowCarUserManagerHelper.class, ShadowLocalBroadcastManager.class,
-        ShadowUserManager.class})
+@Config(shadows = {ShadowCarUserManagerHelper.class, ShadowLocalBroadcastManager.class})
 public class DevelopmentSettingsUtilTest {
 
     private static final UserInfo USER_INFO = new UserInfo(0, null, 0);
@@ -65,17 +62,14 @@
         when(mCarUserManagerHelper.isCurrentProcessDemoUser()).thenReturn(false);
         when(mCarUserManagerHelper.getCurrentProcessUserInfo()).thenReturn(USER_INFO);
 
-        mUserManager = mContext.getSystemService(UserManager.class);
-        UserManager mockUserManager = mock(UserManager.class);
-        when(mockUserManager.getUserInfo(anyInt())).thenReturn(USER_INFO);
-        ShadowUserManager.setInstance(mockUserManager);
+        mUserManager = UserManager.get(mContext);
+        getShadowUserManager().addUser(USER_INFO.id, USER_INFO.name, USER_INFO.flags);
     }
 
     @After
     public void tearDown() {
         ShadowCarUserManagerHelper.reset();
         ShadowLocalBroadcastManager.reset();
-        ShadowUserManager.reset();
     }
 
     @Test
@@ -194,6 +188,6 @@
     }
 
     private ShadowUserManager getShadowUserManager() {
-        return Shadow.extract(mContext.getSystemService(UserManager.class));
+        return Shadows.shadowOf(UserManager.get(mContext));
     }
 }
diff --git a/tests/robotests/src/com/android/car/settings/system/BuildNumberPreferenceControllerTest.java b/tests/robotests/src/com/android/car/settings/system/BuildNumberPreferenceControllerTest.java
index 2bc6a2e..402246b 100644
--- a/tests/robotests/src/com/android/car/settings/system/BuildNumberPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/car/settings/system/BuildNumberPreferenceControllerTest.java
@@ -18,9 +18,6 @@
 
 import static com.google.common.truth.Truth.assertThat;
 
-import static org.mockito.ArgumentMatchers.any;
-import static org.mockito.ArgumentMatchers.anyInt;
-import static org.mockito.ArgumentMatchers.eq;
 import static org.mockito.Mockito.when;
 
 import android.car.userlib.CarUserManagerHelper;
@@ -37,7 +34,6 @@
 import com.android.car.settings.common.PreferenceControllerTestHelper;
 import com.android.car.settings.development.DevelopmentSettingsUtil;
 import com.android.car.settings.testutils.ShadowCarUserManagerHelper;
-import com.android.car.settings.testutils.ShadowUserManager;
 
 import org.junit.After;
 import org.junit.Before;
@@ -47,11 +43,12 @@
 import org.mockito.MockitoAnnotations;
 import org.robolectric.RobolectricTestRunner;
 import org.robolectric.RuntimeEnvironment;
+import org.robolectric.Shadows;
 import org.robolectric.annotation.Config;
 import org.robolectric.shadows.ShadowToast;
 
 @RunWith(RobolectricTestRunner.class)
-@Config(shadows = {ShadowCarUserManagerHelper.class, ShadowUserManager.class})
+@Config(shadows = {ShadowCarUserManagerHelper.class})
 public class BuildNumberPreferenceControllerTest {
 
     private Context mContext;
@@ -61,28 +58,28 @@
     private Preference mPreference;
     @Mock
     private CarUserManagerHelper mCarUserManagerHelper;
-    @Mock
-    private UserManager mUserManager;
 
     @Before
     public void setUp() {
         MockitoAnnotations.initMocks(this);
         ShadowCarUserManagerHelper.setMockInstance(mCarUserManagerHelper);
-        ShadowUserManager.setInstance(mUserManager);
         mContext = RuntimeEnvironment.application;
         mPreference = new Preference(mContext);
         mPreferenceControllerHelper = new PreferenceControllerTestHelper<>(mContext,
                 BuildNumberPreferenceController.class, mPreference);
         mController = mPreferenceControllerHelper.getController();
 
+        int userId = UserHandle.myUserId();
+        Shadows.shadowOf(UserManager.get(mContext)).addUser(userId, "User Name", /* flags= */ 0);
+
         // By default, user is an admin user.
         when(mCarUserManagerHelper.isCurrentProcessAdminUser()).thenReturn(true);
         when(mCarUserManagerHelper.isCurrentProcessDemoUser()).thenReturn(false);
 
         // By default, no restrictions on debugging features.
         when(mCarUserManagerHelper.getCurrentProcessUserInfo()).thenReturn(new UserInfo());
-        when(mUserManager.hasUserRestriction(eq(UserManager.DISALLOW_DEBUGGING_FEATURES),
-                any(UserHandle.class))).thenReturn(false);
+        Shadows.shadowOf(UserManager.get(mContext)).setUserRestriction(UserHandle.of(userId),
+                UserManager.DISALLOW_DEBUGGING_FEATURES, false);
 
         // By default device is provisioned.
         Settings.Global.putInt(mContext.getContentResolver(),
@@ -92,14 +89,11 @@
         Settings.Global.putInt(mContext.getContentResolver(),
                 Settings.Global.DEVELOPMENT_SETTINGS_ENABLED, 0);
         mPreferenceControllerHelper.sendLifecycleEvent(Lifecycle.Event.ON_RESUME);
-
-        when(mUserManager.getUserInfo(anyInt())).thenReturn(new UserInfo(10, null, 0));
     }
 
     @After
     public void tearDown() {
         ShadowCarUserManagerHelper.reset();
-        ShadowUserManager.reset();
     }
 
     @Test
@@ -163,7 +157,7 @@
             mPreference.performClick();
         }
         assertThat(DevelopmentSettingsUtil.isDevelopmentSettingsEnabled(mContext,
-                mCarUserManagerHelper, mUserManager)).isTrue();
+                mCarUserManagerHelper, UserManager.get(mContext))).isTrue();
     }
 
     @Test
diff --git a/tests/robotests/src/com/android/car/settings/system/DeveloperOptionsEntryPreferenceControllerTest.java b/tests/robotests/src/com/android/car/settings/system/DeveloperOptionsEntryPreferenceControllerTest.java
index b322443..0665908 100644
--- a/tests/robotests/src/com/android/car/settings/system/DeveloperOptionsEntryPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/car/settings/system/DeveloperOptionsEntryPreferenceControllerTest.java
@@ -33,7 +33,6 @@
 
 import com.android.car.settings.common.PreferenceControllerTestHelper;
 import com.android.car.settings.testutils.ShadowCarUserManagerHelper;
-import com.android.car.settings.testutils.ShadowUserManager;
 
 import org.junit.After;
 import org.junit.Before;
@@ -43,11 +42,11 @@
 import org.mockito.MockitoAnnotations;
 import org.robolectric.RobolectricTestRunner;
 import org.robolectric.RuntimeEnvironment;
+import org.robolectric.Shadows;
 import org.robolectric.annotation.Config;
-import org.robolectric.shadow.api.Shadow;
 
 @RunWith(RobolectricTestRunner.class)
-@Config(shadows = {ShadowCarUserManagerHelper.class, ShadowUserManager.class})
+@Config(shadows = {ShadowCarUserManagerHelper.class})
 public class DeveloperOptionsEntryPreferenceControllerTest {
 
     private Context mContext;
@@ -75,7 +74,6 @@
     @After
     public void tearDown() {
         ShadowCarUserManagerHelper.reset();
-        ShadowUserManager.reset();
     }
 
     @Test
@@ -96,12 +94,8 @@
     public void testGetAvailabilityStatus_devOptionsEnabled_hasUserRestriction_isUnavailable() {
         Settings.Global.putInt(mContext.getContentResolver(),
                 Settings.Global.DEVELOPMENT_SETTINGS_ENABLED, 1);
-        getShadowUserManager().setUserRestriction(
+        Shadows.shadowOf(UserManager.get(mContext)).setUserRestriction(
                 mUserInfo.getUserHandle(), UserManager.DISALLOW_DEBUGGING_FEATURES, true);
         assertThat(mController.getAvailabilityStatus()).isEqualTo(CONDITIONALLY_UNAVAILABLE);
     }
-
-    private ShadowUserManager getShadowUserManager() {
-        return Shadow.extract(mContext.getSystemService(UserManager.class));
-    }
 }
diff --git a/tests/robotests/src/com/android/car/settings/system/MasterClearAccountsPreferenceControllerTest.java b/tests/robotests/src/com/android/car/settings/system/MasterClearAccountsPreferenceControllerTest.java
index 79a55e9..5109350 100644
--- a/tests/robotests/src/com/android/car/settings/system/MasterClearAccountsPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/car/settings/system/MasterClearAccountsPreferenceControllerTest.java
@@ -35,7 +35,6 @@
 import com.android.car.settings.common.PreferenceControllerTestHelper;
 import com.android.car.settings.testutils.ShadowAccountManager;
 import com.android.car.settings.testutils.ShadowCarUserManagerHelper;
-import com.android.car.settings.testutils.ShadowUserManager;
 
 import org.junit.After;
 import org.junit.Before;
@@ -45,13 +44,14 @@
 import org.mockito.MockitoAnnotations;
 import org.robolectric.RobolectricTestRunner;
 import org.robolectric.RuntimeEnvironment;
+import org.robolectric.Shadows;
 import org.robolectric.annotation.Config;
 import org.robolectric.shadow.api.Shadow;
+import org.robolectric.shadows.ShadowUserManager;
 
 /** Unit test for {@link MasterClearAccountsPreferenceController}. */
 @RunWith(RobolectricTestRunner.class)
-@Config(shadows = {ShadowCarUserManagerHelper.class, ShadowUserManager.class,
-        ShadowAccountManager.class})
+@Config(shadows = {ShadowCarUserManagerHelper.class, ShadowAccountManager.class})
 public class MasterClearAccountsPreferenceControllerTest {
 
     private static final int USER_ID = 111;
@@ -70,8 +70,10 @@
         MockitoAnnotations.initMocks(this);
         ShadowCarUserManagerHelper.setMockInstance(mCarUserManagerHelper);
         when(mCarUserManagerHelper.getCurrentProcessUserId()).thenReturn(USER_ID);
-
         mContext = RuntimeEnvironment.application;
+        getShadowUserManager().addProfile(USER_ID, USER_ID,
+                String.valueOf(USER_ID), /* profileFlags= */ 0);
+
         mPreferenceGroup = new PreferenceCategory(mContext);
         mControllerHelper = new PreferenceControllerTestHelper<>(mContext,
                 MasterClearAccountsPreferenceController.class, mPreferenceGroup);
@@ -81,7 +83,6 @@
     @After
     public void tearDown() {
         ShadowCarUserManagerHelper.reset();
-        ShadowUserManager.reset();
     }
 
     @Test
@@ -96,8 +97,6 @@
     @Test
     public void refreshUi_accountsPresent_showsGroup() {
         mControllerHelper.markState(Lifecycle.State.STARTED);
-        getShadowUserManager().addProfile(USER_ID, USER_ID,
-                String.valueOf(USER_ID), /* profileFlags= */ 0);
         addAccountAndDescription(USER_ID, "accountName");
 
         mController.refreshUi();
@@ -108,8 +107,6 @@
     @Test
     public void refreshUi_noAccountsPresent_hidesGroup() {
         mControllerHelper.markState(Lifecycle.State.STARTED);
-        getShadowUserManager().addProfile(USER_ID, USER_ID,
-                String.valueOf(USER_ID), /* profileFlags= */ 0);
 
         mController.refreshUi();
 
@@ -143,8 +140,6 @@
     @Test
     public void refreshUi_missingAccountDescription_skipsAccount() {
         mControllerHelper.markState(Lifecycle.State.STARTED);
-        getShadowUserManager().addProfile(USER_ID, USER_ID,
-                String.valueOf(USER_ID), /* profileFlags= */ 0);
         addAccountAndDescription(USER_ID, "account name with desc");
         String accountNameNoDesc = "account name no desc";
         getShadowAccountManager().addAccountAsUser(USER_ID,
@@ -159,8 +154,6 @@
 
     @Test
     public void refreshUi_accountAdded_addsPreferenceToGroup() {
-        getShadowUserManager().addProfile(USER_ID, USER_ID,
-                String.valueOf(USER_ID), /* profileFlags= */ 0);
         addAccountAndDescription(USER_ID, "accountName");
         mControllerHelper.markState(Lifecycle.State.STARTED);
         assertThat(mPreferenceGroup.getPreferenceCount()).isEqualTo(2);
@@ -176,8 +169,6 @@
 
     @Test
     public void refreshUi_accountRemoved_removesPreferenceFromGroup() {
-        getShadowUserManager().addProfile(USER_ID, USER_ID,
-                String.valueOf(USER_ID), /* profileFlags= */ 0);
         String accountNameToRemove = "account name to remove";
         addAccountAndDescription(USER_ID, accountNameToRemove);
         mControllerHelper.markState(Lifecycle.State.STARTED);
@@ -200,7 +191,7 @@
     }
 
     private ShadowUserManager getShadowUserManager() {
-        return Shadow.extract(UserManager.get(mContext));
+        return Shadows.shadowOf(UserManager.get(mContext));
     }
 
     private ShadowAccountManager getShadowAccountManager() {
diff --git a/tests/robotests/src/com/android/car/settings/system/MasterClearFragmentTest.java b/tests/robotests/src/com/android/car/settings/system/MasterClearFragmentTest.java
index fcc3949..eee1935 100644
--- a/tests/robotests/src/com/android/car/settings/system/MasterClearFragmentTest.java
+++ b/tests/robotests/src/com/android/car/settings/system/MasterClearFragmentTest.java
@@ -30,6 +30,8 @@
 import android.content.Context;
 import android.content.Intent;
 import android.content.pm.PackageManager;
+import android.os.UserHandle;
+import android.os.UserManager;
 import android.widget.Button;
 
 import androidx.fragment.app.Fragment;
@@ -37,8 +39,8 @@
 import com.android.car.settings.R;
 import com.android.car.settings.security.CheckLockActivity;
 import com.android.car.settings.testutils.FragmentController;
+import com.android.car.settings.testutils.ShadowAccountManager;
 import com.android.car.settings.testutils.ShadowCarUserManagerHelper;
-import com.android.car.settings.testutils.ShadowUserManager;
 
 import org.junit.After;
 import org.junit.Before;
@@ -56,7 +58,7 @@
 
 /** Unit test for {@link MasterClearFragment}. */
 @RunWith(RobolectricTestRunner.class)
-@Config(shadows = {ShadowCarUserManagerHelper.class, ShadowUserManager.class})
+@Config(shadows = {ShadowCarUserManagerHelper.class, ShadowAccountManager.class})
 public class MasterClearFragmentTest {
 
     @Mock
@@ -70,9 +72,14 @@
         MockitoAnnotations.initMocks(this);
         Context context = RuntimeEnvironment.application;
         ShadowCarUserManagerHelper.setMockInstance(mCarUserManagerHelper);
+        int userId = UserHandle.myUserId();
+        Shadows.shadowOf(UserManager.get(context)).addUser(userId, "User Name", /* flags= */ 0);
+        Shadows.shadowOf(UserManager.get(context)).addProfile(userId, userId,
+                "Profile Name", /* profileFlags= */ 0);
         Shadows.shadowOf(context.getPackageManager())
                 .setSystemFeature(PackageManager.FEATURE_AUTOMOTIVE, true);
         when(mCarUserManagerHelper.getAllSwitchableUsers()).thenReturn(Collections.emptyList());
+        when(mCarUserManagerHelper.getCurrentProcessUserId()).thenReturn(userId);
 
         mFragment = FragmentController.of(new MasterClearFragment()).setup();
     }
@@ -80,7 +87,6 @@
     @After
     public void tearDown() {
         ShadowCarUserManagerHelper.reset();
-        ShadowUserManager.reset();
     }
 
     @Test
diff --git a/tests/robotests/src/com/android/car/settings/testutils/ShadowUserManager.java b/tests/robotests/src/com/android/car/settings/testutils/ShadowUserManager.java
index b7c502d..ff314ec 100644
--- a/tests/robotests/src/com/android/car/settings/testutils/ShadowUserManager.java
+++ b/tests/robotests/src/com/android/car/settings/testutils/ShadowUserManager.java
@@ -16,7 +16,6 @@
 
 package com.android.car.settings.testutils;
 
-import android.annotation.UserIdInt;
 import android.content.pm.UserInfo;
 import android.os.UserHandle;
 import android.os.UserManager;
@@ -24,7 +23,6 @@
 
 import org.robolectric.annotation.Implementation;
 import org.robolectric.annotation.Implements;
-import org.robolectric.annotation.Resetter;
 
 import java.util.ArrayList;
 import java.util.Collections;
@@ -33,19 +31,9 @@
 
 @Implements(UserManager.class)
 public class ShadowUserManager extends org.robolectric.shadows.ShadowUserManager {
-    private static UserManager sInstance;
 
     private Map<Integer, List<UserInfo>> mProfiles = new ArrayMap<>();
 
-    public static void setInstance(UserManager manager) {
-        sInstance = manager;
-    }
-
-    @Implementation
-    protected UserInfo getUserInfo(@UserIdInt int userHandle) {
-        return sInstance.getUserInfo(userHandle);
-    }
-
     @Implementation
     protected int[] getProfileIdsWithDisabled(int userId) {
         if (mProfiles.containsKey(userId)) {
@@ -73,9 +61,4 @@
     protected void setUserRestriction(String key, boolean value, UserHandle userHandle) {
         setUserRestriction(userHandle, key, value);
     }
-
-    @Resetter
-    public static void reset() {
-        sInstance = null;
-    }
 }
diff --git a/tests/robotests/src/com/android/car/settings/users/UserDetailsBaseFragmentTest.java b/tests/robotests/src/com/android/car/settings/users/UserDetailsBaseFragmentTest.java
index 2882745..73c1b4c 100644
--- a/tests/robotests/src/com/android/car/settings/users/UserDetailsBaseFragmentTest.java
+++ b/tests/robotests/src/com/android/car/settings/users/UserDetailsBaseFragmentTest.java
@@ -21,6 +21,7 @@
 import static org.mockito.Mockito.when;
 
 import android.car.userlib.CarUserManagerHelper;
+import android.content.Context;
 import android.content.pm.UserInfo;
 import android.os.Process;
 import android.os.UserHandle;
@@ -33,7 +34,6 @@
 import com.android.car.settings.testutils.BaseTestActivity;
 import com.android.car.settings.testutils.ShadowCarUserManagerHelper;
 import com.android.car.settings.testutils.ShadowUserIconProvider;
-import com.android.car.settings.testutils.ShadowUserManager;
 
 import org.junit.After;
 import org.junit.Before;
@@ -44,14 +44,14 @@
 import org.robolectric.Robolectric;
 import org.robolectric.RobolectricTestRunner;
 import org.robolectric.RuntimeEnvironment;
+import org.robolectric.Shadows;
 import org.robolectric.annotation.Config;
-import org.robolectric.shadow.api.Shadow;
+import org.robolectric.shadows.ShadowUserManager;
 
-import java.util.Arrays;
+import java.util.Collections;
 
 @RunWith(RobolectricTestRunner.class)
-@Config(shadows = {ShadowUserManager.class, ShadowCarUserManagerHelper.class,
-        ShadowUserIconProvider.class})
+@Config(shadows = {ShadowCarUserManagerHelper.class, ShadowUserIconProvider.class})
 public class UserDetailsBaseFragmentTest {
 
     /*
@@ -71,20 +71,19 @@
         }
     }
 
+    private Context mContext;
     private BaseTestActivity mTestActivity;
     private UserDetailsBaseFragment mUserDetailsBaseFragment;
     @Mock
     private CarUserManagerHelper mCarUserManagerHelper;
-    @Mock
-    private UserManager mUserManager;
 
     private Button mRemoveUserButton;
 
     @Before
     public void setUpTestActivity() {
+        mContext = RuntimeEnvironment.application;
         MockitoAnnotations.initMocks(this);
         ShadowCarUserManagerHelper.setMockInstance(mCarUserManagerHelper);
-        ShadowUserManager.setInstance(mUserManager);
 
         mTestActivity = Robolectric.setupActivity(BaseTestActivity.class);
     }
@@ -92,7 +91,6 @@
     @After
     public void tearDown() {
         ShadowCarUserManagerHelper.reset();
-        ShadowUserManager.reset();
     }
 
     @Test
@@ -141,7 +139,7 @@
                 Process.myUserHandle(), UserManager.DISALLOW_REMOVE_USER, false);
         when(mCarUserManagerHelper.isCurrentProcessDemoUser()).thenReturn(false);
         when(mCarUserManagerHelper.getAllPersistentUsers()).thenReturn(
-                Arrays.asList(new UserInfo()));
+                Collections.singletonList(new UserInfo()));
         createUserDetailsBaseFragment(/*userId=*/1);
         mRemoveUserButton.performClick();
 
@@ -155,12 +153,12 @@
         // Use UserDetailsFragment, since we cannot test an abstract class.
         mUserDetailsBaseFragment = UserDetailsBaseFragment.addUserIdToFragmentArguments(
                 new TestUserDetailsBaseFragment(), testUser.id);
-        when(mUserManager.getUserInfo(testUser.id)).thenReturn(testUser);
+        getShadowUserManager().addUser(testUser.id, "testUser", /* flags= */ 0);
         mTestActivity.launchFragment(mUserDetailsBaseFragment);
-        mRemoveUserButton = (Button) mTestActivity.findViewById(R.id.action_button1);
+        mRemoveUserButton = mTestActivity.findViewById(R.id.action_button1);
     }
 
     private ShadowUserManager getShadowUserManager() {
-        return Shadow.extract(RuntimeEnvironment.application.getSystemService(UserManager.class));
+        return Shadows.shadowOf(UserManager.get(mContext));
     }
 }
diff --git a/tests/robotests/src/com/android/car/settings/users/UserDetailsFragmentTest.java b/tests/robotests/src/com/android/car/settings/users/UserDetailsFragmentTest.java
index fa968be..3851d24 100644
--- a/tests/robotests/src/com/android/car/settings/users/UserDetailsFragmentTest.java
+++ b/tests/robotests/src/com/android/car/settings/users/UserDetailsFragmentTest.java
@@ -18,11 +18,8 @@
 
 import static com.google.common.truth.Truth.assertThat;
 
-import static org.mockito.Mockito.when;
-
 import android.car.userlib.CarUserManagerHelper;
 import android.content.Context;
-import android.content.pm.UserInfo;
 import android.os.UserManager;
 import android.widget.TextView;
 
@@ -30,7 +27,6 @@
 import com.android.car.settings.testutils.BaseTestActivity;
 import com.android.car.settings.testutils.ShadowCarUserManagerHelper;
 import com.android.car.settings.testutils.ShadowUserIconProvider;
-import com.android.car.settings.testutils.ShadowUserManager;
 
 import org.junit.After;
 import org.junit.Before;
@@ -41,11 +37,11 @@
 import org.robolectric.Robolectric;
 import org.robolectric.RobolectricTestRunner;
 import org.robolectric.RuntimeEnvironment;
+import org.robolectric.Shadows;
 import org.robolectric.annotation.Config;
 
 @RunWith(RobolectricTestRunner.class)
-@Config(shadows = {ShadowUserManager.class, ShadowCarUserManagerHelper.class,
-        ShadowUserIconProvider.class})
+@Config(shadows = {ShadowCarUserManagerHelper.class, ShadowUserIconProvider.class})
 public class UserDetailsFragmentTest {
 
     private static final String TEST_NAME = "test_name";
@@ -53,12 +49,11 @@
     private static final int TEST_USER_ID = 10;
 
     private Context mContext;
+    private UserManager mUserManager;
     private BaseTestActivity mTestActivity;
     private UserDetailsFragment mUserDetailsFragment;
     @Mock
     private CarUserManagerHelper mCarUserManagerHelper;
-    @Mock
-    private UserManager mUserManager;
 
     private TextView mTitle;
 
@@ -66,44 +61,42 @@
     public void setUpTestActivity() {
         MockitoAnnotations.initMocks(this);
         ShadowCarUserManagerHelper.setMockInstance(mCarUserManagerHelper);
-        ShadowUserManager.setInstance(mUserManager);
 
         mContext = RuntimeEnvironment.application;
+        mUserManager = UserManager.get(mContext);
+        Shadows.shadowOf(mUserManager).addUser(TEST_USER_ID, TEST_NAME, /* flags= */ 0);
         mTestActivity = Robolectric.setupActivity(BaseTestActivity.class);
     }
 
     @After
     public void tearDown() {
         ShadowCarUserManagerHelper.reset();
-        ShadowUserManager.reset();
     }
 
     @Test
     public void testCarUserManagerHelperUpdateListener_showsCorrectText() {
-        UserInfo testUser = new UserInfo(TEST_USER_ID, TEST_NAME, /* flags= */ 0);
-        when(mUserManager.getUserInfo(TEST_USER_ID)).thenReturn(testUser);
         createUserDetailsFragment();
         mUserDetailsFragment.mOnUsersUpdateListener.onUsersUpdate();
         assertThat(mTitle.getText()).isEqualTo(
-                UserUtils.getUserDisplayName(mContext, mCarUserManagerHelper, testUser));
+                UserUtils.getUserDisplayName(mContext, mCarUserManagerHelper,
+                        mUserManager.getUserInfo(TEST_USER_ID)));
     }
 
     @Test
     public void testCarUserManagerHelperUpdateListener_textChangesWithUserUpdate() {
-        UserInfo testUser = new UserInfo(TEST_USER_ID, TEST_NAME, /* flags= */ 0);
-        when(mUserManager.getUserInfo(TEST_USER_ID)).thenReturn(testUser);
-
         createUserDetailsFragment();
         mUserDetailsFragment.mOnUsersUpdateListener.onUsersUpdate();
         assertThat(mTitle.getText()).isEqualTo(
-                UserUtils.getUserDisplayName(mContext, mCarUserManagerHelper, testUser));
+                UserUtils.getUserDisplayName(mContext, mCarUserManagerHelper,
+                        mUserManager.getUserInfo(TEST_USER_ID)));
 
-        UserInfo testUserUpdated = new UserInfo(TEST_USER_ID, TEST_UPDATED_NAME, /* flags= */ 0);
-        when(mUserManager.getUserInfo(TEST_USER_ID)).thenReturn(testUserUpdated);
+        mUserManager.removeUser(TEST_USER_ID);
+        Shadows.shadowOf(mUserManager).addUser(TEST_USER_ID, TEST_UPDATED_NAME, /* flags= */ 0);
 
         mUserDetailsFragment.mOnUsersUpdateListener.onUsersUpdate();
         assertThat(mTitle.getText()).isEqualTo(
-                UserUtils.getUserDisplayName(mContext, mCarUserManagerHelper, testUserUpdated));
+                UserUtils.getUserDisplayName(mContext, mCarUserManagerHelper,
+                        mUserManager.getUserInfo(TEST_USER_ID)));
     }
 
     private void createUserDetailsFragment() {
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 12a5eba..48fe298 100644
--- a/tests/robotests/src/com/android/car/settings/users/UsersListFragmentTest.java
+++ b/tests/robotests/src/com/android/car/settings/users/UsersListFragmentTest.java
@@ -19,14 +19,13 @@
 import static com.google.common.truth.Truth.assertThat;
 
 import static org.mockito.ArgumentMatchers.any;
-import static org.mockito.ArgumentMatchers.anyInt;
 import static org.mockito.Mockito.doReturn;
 import static org.mockito.Mockito.verify;
 
 import android.car.userlib.CarUserManagerHelper;
 import android.content.Context;
 import android.content.pm.UserInfo;
-import android.os.Process;
+import android.os.UserHandle;
 import android.os.UserManager;
 import android.widget.Button;
 
@@ -35,7 +34,6 @@
 import com.android.car.settings.testutils.BaseTestActivity;
 import com.android.car.settings.testutils.ShadowCarUserManagerHelper;
 import com.android.car.settings.testutils.ShadowUserIconProvider;
-import com.android.car.settings.testutils.ShadowUserManager;
 
 import org.junit.After;
 import org.junit.Before;
@@ -46,8 +44,8 @@
 import org.robolectric.Robolectric;
 import org.robolectric.RobolectricTestRunner;
 import org.robolectric.RuntimeEnvironment;
+import org.robolectric.Shadows;
 import org.robolectric.annotation.Config;
-import org.robolectric.shadow.api.Shadow;
 
 import java.util.ArrayList;
 
@@ -55,8 +53,7 @@
  * Tests for UserDetailsFragment.
  */
 @RunWith(RobolectricTestRunner.class)
-@Config(shadows = {ShadowCarUserManagerHelper.class, ShadowUserManager.class,
-        ShadowUserIconProvider.class})
+@Config(shadows = {ShadowCarUserManagerHelper.class, ShadowUserIconProvider.class})
 public class UsersListFragmentTest {
 
     private Context mContext;
@@ -66,8 +63,6 @@
 
     @Mock
     private CarUserManagerHelper mCarUserManagerHelper;
-    @Mock
-    private UserManager mUserManager;
 
 
     @Before
@@ -81,7 +76,6 @@
     @After
     public void tearDown() {
         ShadowCarUserManagerHelper.reset();
-        ShadowUserManager.reset();
     }
 
     /* Test that onCreateNewUserConfirmed invokes a creation of a new non-admin. */
@@ -117,8 +111,6 @@
     /* Test that if user can add other users, click on the button creates a dialog to confirm. */
     @Test
     public void testCallOnClick_showAddUserDialog() {
-        getShadowUserManager().setUserRestriction(
-                Process.myUserHandle(), UserManager.DISALLOW_ADD_USER, false);
         createUsersListFragment();
 
         mActionButton.callOnClick();
@@ -126,10 +118,11 @@
     }
 
     private void createUsersListFragment() {
-        UserInfo testUser = new UserInfo();
+        Shadows.shadowOf(UserManager.get(mContext)).addUser(UserHandle.myUserId(),
+                "User Name", /* flags= */ 0);
+        UserInfo testUser = UserManager.get(mContext).getUserInfo(UserHandle.myUserId());
         mFragment = new UsersListFragment();
         doReturn(testUser).when(mCarUserManagerHelper).getCurrentProcessUserInfo();
-        doReturn(testUser).when(mUserManager).getUserInfo(anyInt());
         doReturn(new ArrayList<UserInfo>()).when(mCarUserManagerHelper).getAllSwitchableUsers();
         doReturn(null).when(mCarUserManagerHelper).createNewNonAdminUser(any());
         mTestActivity.launchFragment(mFragment);
@@ -137,14 +130,10 @@
     }
 
     private void refreshButtons() {
-        mActionButton = (Button) mTestActivity.findViewById(R.id.action_button1);
+        mActionButton = mTestActivity.findViewById(R.id.action_button1);
     }
 
     private boolean isDialogShown(String tag) {
         return mTestActivity.getSupportFragmentManager().findFragmentByTag(tag) != null;
     }
-
-    private ShadowUserManager getShadowUserManager() {
-        return Shadow.extract(mContext.getSystemService(UserManager.class));
-    }
 }
