diff --git a/tests/unit/src/com/android/settings/users/UserSettingsTest.java b/tests/unit/src/com/android/settings/users/UserSettingsTest.java
index 213183a..2ecf161 100644
--- a/tests/unit/src/com/android/settings/users/UserSettingsTest.java
+++ b/tests/unit/src/com/android/settings/users/UserSettingsTest.java
@@ -15,34 +15,47 @@
  */
 package com.android.settings.users;
 
+import static com.google.common.truth.Truth.assertThat;
+
 import android.content.Context;
 import android.content.Intent;
+import android.support.test.InstrumentationRegistry;
 import android.support.test.filters.SmallTest;
+import android.support.test.runner.AndroidJUnit4;
 import android.support.test.uiautomator.UiDevice;
 import android.support.test.uiautomator.UiObject;
 import android.support.test.uiautomator.UiSelector;
 import android.support.test.uiautomator.UiScrollable;
-import android.test.InstrumentationTestCase;
+import android.support.test.uiautomator.UiObjectNotFoundException;
 
+import org.junit.Before;
 import org.junit.Test;
+import org.junit.runner.RunWith;
 
+@RunWith(AndroidJUnit4.class)
 @SmallTest
-public class UserSettingsTest extends InstrumentationTestCase {
+public class UserSettingsTest {
 
-    private static final String USER_AND_ACCOUNTS = "Users & accounts";
-    private static final String USERS = "Users";
+    private static final String SYSTEM = "System";
+    private static final String ADVANCED = "Advanced";
+    private static final String USERS = "Multiple users";
     private static final String EMERGNENCY_INFO = "Emergency information";
     private static final String ADD_USERS_WHEN_LOCKED = "Add users";
+    private static final String SWITCH_USER_BUTTON = "com.android.systemui:id/multi_user_switch";
+    private static final String SETTINGS_BUTTON = "com.android.systemui:id/settings_button";
+    private static final String PRIMARY_USER = "Owner";
+    private static final String GUEST_USER = "Guest";
+    private static final String ADD_GUEST = "Add guest";
+    private static final String CONTINUE = "Yes, continue";
 
     private UiDevice mDevice;
     private Context mContext;
     private String mTargetPackage;
 
-    @Override
-    protected void setUp() throws Exception {
-        super.setUp();
-        mDevice = UiDevice.getInstance(getInstrumentation());
-        mContext = getInstrumentation().getTargetContext();
+    @Before
+    public void setUp() {
+        mDevice = UiDevice.getInstance(InstrumentationRegistry.getInstrumentation());
+        mContext = InstrumentationRegistry.getTargetContext();
         mTargetPackage = mContext.getPackageName();
     }
 
@@ -51,7 +64,8 @@
         launchUserSettings();
         UiObject emergencyInfoPreference =
             mDevice.findObject(new UiSelector().text(EMERGNENCY_INFO));
-        assertFalse(emergencyInfoPreference.exists());
+
+        assertThat(emergencyInfoPreference.exists()).isFalse();
     }
 
     @Test
@@ -59,7 +73,32 @@
         launchUserSettings();
         UiObject addUsersPreference =
             mDevice.findObject(new UiSelector().text(ADD_USERS_WHEN_LOCKED));
-        assertFalse(addUsersPreference.exists());
+        assertThat(addUsersPreference.exists()).isFalse();
+    }
+
+    @Test
+    public void testUsersExistsOnSecondaryUser() throws Exception {
+        // switch to guest user
+        switchToOrCreateGuest();
+        // launch settings (launch from intent doesn't work, hence launch from quick settings)
+        mDevice.openQuickSettings();
+        mDevice.findObject(new UiSelector().resourceId(SETTINGS_BUTTON)).click();
+        // launch system settings and expand whole screen
+        final UiScrollable settings = new UiScrollable(
+            new UiSelector().packageName(mTargetPackage).scrollable(true));
+        final String titleSystem = SYSTEM;
+        settings.scrollTextIntoView(titleSystem);
+        mDevice.findObject(new UiSelector().text(titleSystem)).click();
+        mDevice.findObject(new UiSelector().text(ADVANCED)).click();
+
+        final boolean hasUsersSettings = mDevice.findObject(new UiSelector().text(USERS)).exists();
+
+        // switch back to primary user
+        mDevice.openQuickSettings();
+        mDevice.findObject(new UiSelector().resourceId(SWITCH_USER_BUTTON)).click();
+        mDevice.findObject(new UiSelector().text(PRIMARY_USER)).click();
+
+        assertThat(hasUsersSettings).isTrue();
     }
 
     private void launchSettings() {
@@ -67,17 +106,34 @@
                 .addCategory(Intent.CATEGORY_LAUNCHER)
                 .setPackage(mTargetPackage)
                 .addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
-        getInstrumentation().getContext().startActivity(settingsIntent);
+        mContext.startActivity(settingsIntent);
     }
 
     private void launchUserSettings() throws Exception  {
         launchSettings();
         final UiScrollable settings = new UiScrollable(
                 new UiSelector().packageName(mTargetPackage).scrollable(true));
-        final String titleUsersAndAccounts = USER_AND_ACCOUNTS;
-        settings.scrollTextIntoView(titleUsersAndAccounts);
-        mDevice.findObject(new UiSelector().text(titleUsersAndAccounts)).click();
+        final String titleSystem = SYSTEM;
+        settings.scrollTextIntoView(titleSystem);
+        mDevice.findObject(new UiSelector().text(titleSystem)).click();
+        mDevice.findObject(new UiSelector().text(ADVANCED)).click();
         mDevice.findObject(new UiSelector().text(USERS)).click();
     }
 
+    private void switchToOrCreateGuest() throws UiObjectNotFoundException {
+        mDevice.openQuickSettings();
+        mDevice.findObject(new UiSelector().resourceId(SWITCH_USER_BUTTON)).click();
+        // if no existing guest user, select "Add guest", otherwise select "Guest"
+        final UiObject addGuest = mDevice.findObject(new UiSelector().text(ADD_GUEST));
+        if (addGuest.exists()) {
+            addGuest.click();
+            mDevice.waitForIdle();
+            mDevice.pressBack();
+        } else {
+            mDevice.findObject(new UiSelector().text(GUEST_USER)).click();
+            mDevice.waitForIdle();
+            mDevice.findObject(new UiSelector().text(CONTINUE)).click();
+            mDevice.waitForIdle();
+        }
+    }
 }
