diff --git a/src/com/android/settings/deviceinfo/aboutphone/MyDeviceInfoFragment.java b/src/com/android/settings/deviceinfo/aboutphone/MyDeviceInfoFragment.java
index bb95228..03b69a5 100644
--- a/src/com/android/settings/deviceinfo/aboutphone/MyDeviceInfoFragment.java
+++ b/src/com/android/settings/deviceinfo/aboutphone/MyDeviceInfoFragment.java
@@ -21,6 +21,7 @@
 import android.app.Activity;
 import android.app.Fragment;
 import android.content.Context;
+import android.content.Intent;
 import android.content.pm.UserInfo;
 import android.os.Bundle;
 import android.os.UserManager;
@@ -126,6 +127,16 @@
         return controllers;
     }
 
+    @Override
+    public void onActivityResult(int requestCode, int resultCode, Intent data) {
+        final BuildNumberPreferenceController buildNumberPreferenceController =
+            getPreferenceController(BuildNumberPreferenceController.class);
+        if (buildNumberPreferenceController.onActivityResult(requestCode, resultCode, data)) {
+            return;
+        }
+        super.onActivityResult(requestCode, resultCode, data);
+    }
+
     private void initHeader() {
         // TODO: Migrate into its own controller.
         final LayoutPreference headerPreference =
diff --git a/tests/robotests/src/com/android/settings/deviceinfo/MyDeviceInfoFragmentTest.java b/tests/robotests/src/com/android/settings/deviceinfo/MyDeviceInfoFragmentTest.java
index 36f0662..8b21b74 100644
--- a/tests/robotests/src/com/android/settings/deviceinfo/MyDeviceInfoFragmentTest.java
+++ b/tests/robotests/src/com/android/settings/deviceinfo/MyDeviceInfoFragmentTest.java
@@ -21,15 +21,18 @@
 import static org.mockito.ArgumentMatchers.any;
 import static org.mockito.Mockito.doNothing;
 import static org.mockito.Mockito.doReturn;
+import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.spy;
 import static org.mockito.Mockito.verify;
 import static org.mockito.Mockito.when;
 
 import android.app.Activity;
 import android.content.Context;
+import android.content.Intent;
 import android.os.Bundle;
 import android.support.v7.preference.PreferenceScreen;
 import android.telephony.TelephonyManager;
+import android.util.ArrayMap;
 
 import com.android.settings.deviceinfo.aboutphone.MyDeviceInfoFragment;
 import com.android.settings.TestConfig;
@@ -39,6 +42,7 @@
 import com.android.settings.testutils.shadow.SettingsShadowSystemProperties;
 import com.android.settings.testutils.shadow.ShadowConnectivityManager;
 import com.android.settings.testutils.shadow.ShadowUserManager;
+import com.android.settingslib.core.AbstractPreferenceController;
 
 import org.junit.Before;
 import org.junit.Test;
@@ -48,6 +52,11 @@
 import org.robolectric.RuntimeEnvironment;
 import org.robolectric.annotation.Config;
 import org.robolectric.shadows.ShadowApplication;
+import org.robolectric.util.ReflectionHelpers;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
 
 @RunWith(SettingsRobolectricTestRunner.class)
 @Config(
@@ -97,4 +106,23 @@
 
         verify(mScreen).setInitialExpandedChildrenCount(Integer.MAX_VALUE);
     }
+
+    @Test
+    public void onActivityResult_shouldCallBuildNumberPreferenceController() {
+        final BuildNumberPreferenceController controller =
+            mock(BuildNumberPreferenceController.class);
+        final Map<Class, List<AbstractPreferenceController>> preferenceControllers =
+            new ArrayMap<>();
+        final List<AbstractPreferenceController> controllerList = new ArrayList<>();
+        controllerList.add(controller);
+        preferenceControllers.put(BuildNumberPreferenceController.class, controllerList);
+        ReflectionHelpers.setField(mSettings, "mPreferenceControllers", preferenceControllers);
+
+        final int requestCode = 1;
+        final int resultCode = 2;
+        final Intent data = new Intent();
+        mSettings.onActivityResult(requestCode, resultCode, data);
+
+        verify(controller).onActivityResult(requestCode, resultCode, data);
+    }
 }
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();
+        }
+    }
 }
