diff --git a/services/core/java/com/android/server/pm/UserManagerService.java b/services/core/java/com/android/server/pm/UserManagerService.java
index ba845da..3c702b4 100644
--- a/services/core/java/com/android/server/pm/UserManagerService.java
+++ b/services/core/java/com/android/server/pm/UserManagerService.java
@@ -1371,7 +1371,7 @@
             for (int i = 0; i < userSize; i++) {
                 UserInfo ui = mUsers.valueAt(i).info;
                 if ((excludePartial && ui.partial)
-                        || (excludeDying && isDyingLU(ui))
+                        || (excludeDying && mRemovingUserIds.get(ui.id))
                         || (excludePreCreated && ui.preCreated)) {
                     continue;
                 }
@@ -1381,17 +1381,6 @@
         }
     }
 
-    @GuardedBy("mUsersLock")
-    private boolean isDyingLU(UserInfo ui) {
-        if (mRemovingUserIds.get(ui.id)) {
-            return true;
-        }
-        if (ui.isEphemeral() && ui.isInitialized() && ui.id != getCurrentUserId()) {
-            return true;
-        }
-        return false;
-    }
-
     @Override
     public List<UserInfo> getProfiles(@UserIdInt int userId, boolean enabledOnly) {
         boolean returnFullInfo;
diff --git a/services/tests/mockingservicestests/src/com/android/server/pm/UserManagerServiceTest.java b/services/tests/mockingservicestests/src/com/android/server/pm/UserManagerServiceTest.java
index 7d58a2e..79f1574 100644
--- a/services/tests/mockingservicestests/src/com/android/server/pm/UserManagerServiceTest.java
+++ b/services/tests/mockingservicestests/src/com/android/server/pm/UserManagerServiceTest.java
@@ -778,49 +778,6 @@
     }
 
     @Test
-    public void testGetAliveUsers_shouldExcludeInitialisedEphemeralNonCurrentUsers() {
-        assertWithMessage("Ephemeral user should not exist at all initially")
-                .that(mUmi.getUsers(false).stream().anyMatch(u -> u.id == USER_ID))
-                .isFalse();
-
-        // add an ephemeral full user
-        TestUserData userData = new TestUserData(USER_ID);
-        userData.info.flags = UserInfo.FLAG_FULL | UserInfo.FLAG_EPHEMERAL;
-        addUserData(userData);
-
-        assertWithMessage("Ephemeral user should exist as alive after being created")
-                .that(mUmi.getUsers(true).stream().anyMatch(u -> u.id == USER_ID))
-                .isTrue();
-
-        // mock switch to the user (mark it as initialized & make it the current user)
-        userData.info.flags |= UserInfo.FLAG_INITIALIZED;
-        mockCurrentUser(USER_ID);
-
-        assertWithMessage("Ephemeral user should still exist as alive after being switched to")
-                .that(mUmi.getUsers(true).stream().anyMatch(u -> u.id == USER_ID))
-                .isTrue();
-
-        // switch away from the user
-        mockCurrentUser(OTHER_USER_ID);
-
-        assertWithMessage("Ephemeral user should not exist as alive after getting switched away")
-                .that(mUmi.getUsers(true).stream().anyMatch(u -> u.id == USER_ID))
-                .isFalse();
-
-        assertWithMessage("Ephemeral user should still exist as dying after getting switched away")
-                .that(mUmi.getUsers(false).stream().anyMatch(u -> u.id == USER_ID))
-                .isTrue();
-
-        // finally remove the user
-        mUms.removeUserInfo(USER_ID);
-
-        assertWithMessage("Ephemeral user should not exist at all after cleanup")
-                .that(mUmi.getUsers(false).stream().anyMatch(u -> u.id == USER_ID))
-                .isFalse();
-    }
-
-
-    @Test
     @RequiresFlagsEnabled({android.os.Flags.FLAG_ALLOW_PRIVATE_PROFILE,
             Flags.FLAG_BLOCK_PRIVATE_SPACE_CREATION, Flags.FLAG_ENABLE_PRIVATE_SPACE_FEATURES})
     public void testCreatePrivateProfileOnHeadlessSystemUser_shouldAllowCreation() {
