Snap for 7550930 from c5d343d7b889ebca8998b27713a4fcb03d267aba to mainline-captiveportallogin-release

Change-Id: I4b1c0a90aa62b3d2ccec060e9fd16c5933c79623
diff --git a/Android.bp b/Android.bp
index f8db47b..112833b 100644
--- a/Android.bp
+++ b/Android.bp
@@ -12,41 +12,41 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
+package {
+    default_visibility: [":__subpackages__"],
+    default_applicable_licenses: ["external_robolectric-shadows_license"],
+}
+
+// Added automatically by a large-scale-change that took the approach of
+// 'apply every license found to every target'. While this makes sure we respect
+// every license restriction, it may not be entirely correct.
+//
+// e.g. GPL in an MIT project might only apply to the contrib/ directory.
+//
+// Please consider splitting the single license below into multiple licenses,
+// taking care not to lose any license_kind information, and overriding the
+// default license using the 'licenses: [...]' property on targets as needed.
+//
+// For unused files, consider creating a 'fileGroup' with "//visibility:private"
+// to attach the license to, and including a comment whether the files may be
+// used in the current project.
+// See: http://go/android-license-faq
+license {
+    name: "external_robolectric-shadows_license",
+    visibility: [":__subpackages__"],
+    license_kinds: [
+        "SPDX-license-identifier-Apache-2.0",
+        "SPDX-license-identifier-MIT",
+    ],
+    license_text: [
+        "LICENSE",
+    ],
+}
+
+// Empty library. Should be removed
 java_library {
     name: "robolectric_android-all-stub",
-
-    static_libs: [
-        "conscrypt",
-        "core-icu4j",
-        "core-libart",
-        "ext",
-        "framework-all",
-        "icu4j-icudata-jarjar",
-        "icu4j-icutzdata-jarjar",
-        "ims-common",
-        "android.test.base_static",
-        "libphonenumber-platform",
-        "okhttp",
-        "services",
-        "services.accessibility",
-        "telephony-common",
-
-        "robolectric_tzdata",
-        "robolectric_framework_res",
-        "robolectric_framework_raw_res",
-    ],
-
-    java_resources: [
-        // Copy the build.prop
-        ":robolectric_build_props",
-    ],
-    dist: {
-        targets: [
-            "sdk",
-            "win_sdk",
-        ],
-        dest: "android-all-robolectric.jar",
-    }
+    visibility: ["//visibility:public"],
 }
 
 // build.prop file created by module type defined in soong/robolectric.go
@@ -63,7 +63,7 @@
 
 // Move the raw/uncompiled resources and assets into raw-res/
 // This logic can be removed once the transition to binary resources is complete
-java_genrule {
+java_genrule_host {
     name: "robolectric_framework_raw_res",
     out: ["robolectric_framework_raw_res.jar"],
     srcs: [":robolectric_framework_raw_res_orig"],
@@ -75,7 +75,7 @@
         "**/*:raw-res/",
 }
 
-java_genrule {
+java_genrule_host {
     name: "robolectric_framework_res",
     tools: ["zip2zip"],
     srcs: [":framework-res"],
@@ -88,10 +88,51 @@
         "-0 resources.arsc",
 }
 
-// Make robolectric_android-all-stub available as a host jar
 java_device_for_host {
+    name: "robolectric_android-all-device-deps",
+    libs: [
+        "conscrypt-for-host",
+        "core-icu4j-for-host",
+        "core-libart-for-host",
+        "ext",
+        "framework-all",
+        "icu4j-icudata-jarjar",
+        "icu4j-icutzdata-jarjar",
+        "ims-common",
+        "android.test.base_static",
+        "libphonenumber-platform",
+        "okhttp-for-host",
+        "services",
+        "services.accessibility",
+        "telephony-common",
+
+    ],
+}
+
+java_library_host {
     name: "robolectric-host-android_all",
-    libs: ["robolectric_android-all-stub"],
+    static_libs: [
+        "robolectric_android-all-device-deps",
+        "robolectric_tzdata",
+        "robolectric_framework_res",
+        "robolectric_framework_raw_res",
+    ],
+    dist: {
+        targets: [
+            "sdk",
+            "win_sdk",
+        ],
+        dest: "android-all-robolectric.jar",
+    },
+
+    java_resources: [
+        // Copy the build.prop
+        ":robolectric_build_props",
+    ],
+    visibility: [
+        ":__subpackages__",
+        "//prebuilts/misc/common/robolectric",
+    ],
 }
 
 //#############################################
@@ -137,6 +178,7 @@
 java_host_for_device {
     name: "Robolectric_all-target",
     libs: ["Robolectric_all"],
+    visibility: ["//visibility:public"],
 }
 
 // Make dependencies available as host jars
diff --git a/METADATA b/METADATA
new file mode 100644
index 0000000..d97975c
--- /dev/null
+++ b/METADATA
@@ -0,0 +1,3 @@
+third_party {
+  license_type: NOTICE
+}
diff --git a/OWNERS b/OWNERS
index 46cc9a0..dc17b81 100644
--- a/OWNERS
+++ b/OWNERS
@@ -3,4 +3,6 @@
 jongerrish@google.com
 jplemieux@google.com
 justinklaassen@google.com
-yukl@google.com
\ No newline at end of file
+leechou@google.com
+yukl@google.com
+tmfang@google.com
\ No newline at end of file
diff --git a/annotations/Android.bp b/annotations/Android.bp
index c4f3952..bc8fa9f 100644
--- a/annotations/Android.bp
+++ b/annotations/Android.bp
@@ -2,6 +2,15 @@
 // Compile Robolectric annotations
 //#############################################
 
+package {
+    // See: http://go/android-license-faq
+    // A large-scale-change added 'default_applicable_licenses' to import
+    // all of the 'license_kinds' from "external_robolectric-shadows_license"
+    // to get the below license kinds:
+    //   SPDX-license-identifier-MIT
+    default_applicable_licenses: ["external_robolectric-shadows_license"],
+}
+
 java_library_host {
     name: "Robolectric_annotations",
     static_libs: [
diff --git a/junit/Android.bp b/junit/Android.bp
index 2402e94..65f12ad 100644
--- a/junit/Android.bp
+++ b/junit/Android.bp
@@ -2,6 +2,15 @@
 // Compile Robolectric junit
 //##########################################
 
+package {
+    // See: http://go/android-license-faq
+    // A large-scale-change added 'default_applicable_licenses' to import
+    // all of the 'license_kinds' from "external_robolectric-shadows_license"
+    // to get the below license kinds:
+    //   SPDX-license-identifier-MIT
+    default_applicable_licenses: ["external_robolectric-shadows_license"],
+}
+
 java_library_host {
     name: "Robolectric_junit",
     libs: [
diff --git a/processor/Android.bp b/processor/Android.bp
index ee9b80c..fdf2dc6 100644
--- a/processor/Android.bp
+++ b/processor/Android.bp
@@ -2,6 +2,16 @@
 // Compile Robolectric processor
 //#############################################
 
+package {
+    // See: http://go/android-license-faq
+    // A large-scale-change added 'default_applicable_licenses' to import
+    // all of the 'license_kinds' from "external_robolectric-shadows_license"
+    // to get the below license kinds:
+    //   SPDX-license-identifier-Apache-2.0
+    //   SPDX-license-identifier-MIT
+    default_applicable_licenses: ["external_robolectric-shadows_license"],
+}
+
 java_plugin {
     name: "Robolectric_processor",
     processor_class: "org.robolectric.annotation.processing.RobolectricProcessor",
@@ -42,7 +52,7 @@
         "Robolectric_processor",
         "Robolectric_shadowapi",
         "robolectric-javax.annotation-api-1.2",
-        "robolectric-compile-testing-0.15",
+        "robolectric-compile-testing-0.19",
         "mockito",
         "hamcrest",
         "guava",
diff --git a/processor/Android.mk b/processor/Android.mk
index 07e8200..45f635d 100644
--- a/processor/Android.mk
+++ b/processor/Android.mk
@@ -6,6 +6,9 @@
 include $(CLEAR_VARS)
 
 LOCAL_MODULE := Run_robolectric_processor_tests
+LOCAL_LICENSE_KINDS := SPDX-license-identifier-Apache-2.0 SPDX-license-identifier-MIT
+LOCAL_LICENSE_CONDITIONS := notice
+LOCAL_NOTICE_FILE := $(LOCAL_PATH)/../LICENSE
 
 test_source_directory := $(LOCAL_PATH)/src/test/java
 
diff --git a/processor/sdks.txt b/processor/sdks.txt
index e619220..b9931ca 100644
--- a/processor/sdks.txt
+++ b/processor/sdks.txt
@@ -11,3 +11,5 @@
 prebuilts/misc/common/robolectric/android-all/android-all-8.1.0-robolectric-4611349.jar
 prebuilts/misc/common/robolectric/android-all/android-all-9-robolectric-4913185-2.jar
 prebuilts/misc/common/robolectric/android-all/android-all-9plus-robolectric-5616371.jar
+prebuilts/misc/common/robolectric/android-all/android-all-10-robolectric-5803371.jar
+prebuilts/misc/common/robolectric/android-all/android-all-R-beta2-robolectric-6625208.jar
diff --git a/processor/src/test/java/org/robolectric/annotation/processing/validator/SingleClassSubject.java b/processor/src/test/java/org/robolectric/annotation/processing/validator/SingleClassSubject.java
index b702b3b..c016495 100644
--- a/processor/src/test/java/org/robolectric/annotation/processing/validator/SingleClassSubject.java
+++ b/processor/src/test/java/org/robolectric/annotation/processing/validator/SingleClassSubject.java
@@ -17,7 +17,7 @@
 import org.robolectric.annotation.processing.RobolectricProcessor;
 import org.robolectric.annotation.processing.Utils;
 
-public final class SingleClassSubject extends Subject<SingleClassSubject, String> {
+public final class SingleClassSubject extends Subject {
 
   public static Subject.Factory<SingleClassSubject, String> singleClass() {
 
diff --git a/resources/Android.bp b/resources/Android.bp
index 76e584c..76c2c05 100644
--- a/resources/Android.bp
+++ b/resources/Android.bp
@@ -2,6 +2,15 @@
 // Compile Robolectric resources
 //#############################################
 
+package {
+    // See: http://go/android-license-faq
+    // A large-scale-change added 'default_applicable_licenses' to import
+    // all of the 'license_kinds' from "external_robolectric-shadows_license"
+    // to get the below license kinds:
+    //   SPDX-license-identifier-Apache-2.0
+    default_applicable_licenses: ["external_robolectric-shadows_license"],
+}
+
 java_library_host {
     name: "Robolectric_resources",
     srcs: ["src/main/java/**/*.java"],
diff --git a/resources/Android.mk b/resources/Android.mk
index 1822ba2..1e98e84 100644
--- a/resources/Android.mk
+++ b/resources/Android.mk
@@ -6,6 +6,9 @@
 include $(CLEAR_VARS)
 
 LOCAL_MODULE := Run_robolectric_resources_tests
+LOCAL_LICENSE_KINDS := SPDX-license-identifier-Apache-2.0
+LOCAL_LICENSE_CONDITIONS := notice
+LOCAL_NOTICE_FILE := $(LOCAL_PATH)/../LICENSE
 
 test_source_directory := $(LOCAL_PATH)/src/test/java
 
diff --git a/robolectric/Android.bp b/robolectric/Android.bp
index 63f9f69..90c413d 100644
--- a/robolectric/Android.bp
+++ b/robolectric/Android.bp
@@ -2,6 +2,15 @@
 // Compile Robolectric robolectric
 //#############################################
 
+package {
+    // See: http://go/android-license-faq
+    // A large-scale-change added 'default_applicable_licenses' to import
+    // all of the 'license_kinds' from "external_robolectric-shadows_license"
+    // to get the below license kinds:
+    //   SPDX-license-identifier-Apache-2.0
+    default_applicable_licenses: ["external_robolectric-shadows_license"],
+}
+
 java_library_host {
     name: "Robolectric_robolectric",
     libs: [
@@ -75,4 +84,8 @@
         "jsr305",
     ],
     libs: ["robolectric-host-android_all"],
+    // Robolectric tests do not work well with unit tests setup yet
+    test_options: {
+        unit_test: false,
+    },
 }
diff --git a/robolectric/Android.mk b/robolectric/Android.mk
index 5af8956..3bf70f5 100644
--- a/robolectric/Android.mk
+++ b/robolectric/Android.mk
@@ -6,6 +6,9 @@
 include $(CLEAR_VARS)
 
 LOCAL_MODULE := Run_robolectric_robolectric_tests
+LOCAL_LICENSE_KINDS := SPDX-license-identifier-Apache-2.0
+LOCAL_LICENSE_CONDITIONS := notice
+LOCAL_NOTICE_FILE := $(LOCAL_PATH)/../LICENSE
 
 test_source_directory := $(LOCAL_PATH)/src/test/java
 
diff --git a/robolectric/src/main/java/org/robolectric/android/AndroidInterceptors.java b/robolectric/src/main/java/org/robolectric/android/AndroidInterceptors.java
index 8a2159e..51ea2a7 100644
--- a/robolectric/src/main/java/org/robolectric/android/AndroidInterceptors.java
+++ b/robolectric/src/main/java/org/robolectric/android/AndroidInterceptors.java
@@ -31,7 +31,7 @@
         new SystemTimeInterceptor(),
         new SystemArrayCopyInterceptor(),
         new LocaleAdjustLanguageCodeInterceptor(),
-        new SystemLogEInterceptor(),
+        new SystemLogInterceptor(),
         new NoOpInterceptor()
     );
   }
@@ -196,34 +196,45 @@
     }
   }
 
-  public static class SystemLogEInterceptor extends Interceptor {
-    public SystemLogEInterceptor() {
-      super(new MethodRef(System.class.getName(), "logE"));
+  /** AndroidInterceptor for System.logE and System.logW. */
+  public static class SystemLogInterceptor extends Interceptor {
+    public SystemLogInterceptor() {
+      super(
+          new MethodRef(System.class.getName(), "logE"),
+          new MethodRef(System.class.getName(), "logW"));
     }
 
     static void logE(Object... params) {
-      String message = "System.logE: ";
+      log("System.logE: ", params);
+    }
+
+    static void logW(Object... params) {
+      log("System.logW: ", params);
+    }
+
+    static void log(String prefix, Object... params) {
+      StringBuilder message = new StringBuilder(prefix);
       for (Object param : params) {
-        message += param.toString();
+        message.append(param.toString());
       }
       System.err.println(message);
     }
 
     @Override
     public Function<Object, Object> handle(MethodSignature methodSignature) {
-      return new Function<Object, Object>() {
-        @Override
-        public Object call(Class<?> theClass, Object value, Object[] params) {
+      return (theClass, value, params) -> {
+        if ("logE".equals(methodSignature.methodName)) {
           logE(params);
-          return null;
+        } else if ("logW".equals(methodSignature.methodName)) {
+          logW(params);
         }
+        return null;
       };
     }
 
     @Override
     public MethodHandle getMethodHandle(String methodName, MethodType type) throws NoSuchMethodException, IllegalAccessException {
-      return lookup.findStatic(getClass(), "logE",
-          methodType(void.class, Object[].class));
+      return lookup.findStatic(getClass(), methodName, methodType(void.class, Object[].class));
     }
   }
 
diff --git a/robolectric/src/main/java/org/robolectric/android/internal/ParallelUniverse.java b/robolectric/src/main/java/org/robolectric/android/internal/ParallelUniverse.java
index b100c27..e74a03c 100644
--- a/robolectric/src/main/java/org/robolectric/android/internal/ParallelUniverse.java
+++ b/robolectric/src/main/java/org/robolectric/android/internal/ParallelUniverse.java
@@ -147,8 +147,17 @@
       RuntimeEnvironment.setAndroidFrameworkJarPath(
           apkLoader.getArtifactUrl(sdkConfig.getAndroidSdkDependency()).getFile());
 
+      // PackageParser.parseBaseApkCommon() relies on an initial Application object in order to
+      // resolve PermissionManager service.
+      createInitialApplication(appManifest, config);
+
       FsFile packageFile = appManifest.getApkFile();
       parsedPackage = ShadowPackageParser.callParsePackage(packageFile);
+
+      // Create a new ActivityThread for RuntimeEnvironment since the original one is bound to a
+      // system context stub in createInitialApplication(), which causes Resources not found.
+      activityThread = ReflectionHelpers.newInstance(ActivityThread.class);
+      RuntimeEnvironment.setActivityThread(activityThread);
     }
 
     ApplicationInfo applicationInfo = parsedPackage.applicationInfo;
@@ -173,7 +182,23 @@
         ReflectionHelpers.loadClass(
             getClass().getClassLoader(), ShadowContextImpl.CLASS_NAME);
 
-    ReflectionHelpers.setField(activityThread, "mCompatConfiguration", configuration);
+    if (sdkConfig.getApiLevel() < Build.VERSION_CODES.S) {
+      ReflectionHelpers.setField(activityThread, "mCompatConfiguration", configuration);
+    } else {
+      Class<?> activityThreadInternalClass =
+              ReflectionHelpers.loadClass(
+                      getClass().getClassLoader(), "android.app.ActivityThreadInternal");
+      Class<?> configurationControllerClass =
+              ReflectionHelpers.loadClass(
+                      getClass().getClassLoader(), "android.app.ConfigurationController");
+      Object configController = ReflectionHelpers.callConstructor(configurationControllerClass,
+              from(activityThreadInternalClass, activityThread));
+      ReflectionHelpers.callInstanceMethod(configController, "setCompatConfiguration",
+              from(Configuration.class, configuration));
+      configuration = ReflectionHelpers.callInstanceMethod(configController,
+              "getCompatConfiguration");
+      ReflectionHelpers.setField(activityThread, "mConfigurationController", configController);
+    }
     ReflectionHelpers
         .setStaticField(ActivityThread.class, "sMainThreadHandler", new Handler(Looper.myLooper()));
 
@@ -221,7 +246,7 @@
         ReflectionHelpers.callInstanceMethod(
             contextImpl,
             "setOuterContext",
-            ReflectionHelpers.ClassParameter.from(Context.class, application));
+            from(Context.class, application));
       } catch (PackageManager.NameNotFoundException e) {
         throw new RuntimeException(e);
       }
@@ -247,6 +272,41 @@
     }
   }
 
+  private void createInitialApplication(AndroidManifest appManifest, Config config) {
+    ShadowActivityThread.setApplicationInfo(createApplicationInfo(appManifest));
+    ActivityThread activityThread = ActivityThread.currentActivityThread();
+
+    Class<?> contextImplClass =
+        ReflectionHelpers.loadClass(
+            getClass().getClassLoader(), ShadowContextImpl.CLASS_NAME);
+    Context systemContextImpl = ReflectionHelpers.callStaticMethod(contextImplClass,
+        "createSystemContext", from(ActivityThread.class, activityThread));
+
+    Application application = createApplication(appManifest, config);
+
+    if (application != null) {
+      try {
+        Context contextImpl = systemContextImpl
+            .createPackageContext(appManifest.getPackageName(), Context.CONTEXT_INCLUDE_CODE);
+
+        ReflectionHelpers
+            .setField(ActivityThread.class, activityThread, "mInitialApplication", application);
+        ShadowApplication shadowApplication = Shadow.extract(application);
+        shadowApplication.callAttach(contextImpl);
+      } catch (PackageManager.NameNotFoundException e) {
+        throw new RuntimeException(e);
+      }
+    }
+  }
+
+  private ApplicationInfo createApplicationInfo(AndroidManifest appManifest) {
+    final ApplicationInfo info = new ApplicationInfo();
+    info.targetSdkVersion = appManifest.getTargetSdkVersion();
+    info.packageName = appManifest.getPackageName();
+    info.processName = appManifest.getProcessName();
+    return info;
+  }
+
   private void injectResourceStuffForLegacy(ApkLoader apkLoader, AndroidManifest appManifest,
       SdkEnvironment sdkEnvironment) {
     PackageResourceTable systemResourceTable = apkLoader.getSystemResourceTable(sdkEnvironment);
diff --git a/robolectric/src/main/java/org/robolectric/internal/SdkConfig.java b/robolectric/src/main/java/org/robolectric/internal/SdkConfig.java
index 99ef10a..d2cbf14 100644
--- a/robolectric/src/main/java/org/robolectric/internal/SdkConfig.java
+++ b/robolectric/src/main/java/org/robolectric/internal/SdkConfig.java
@@ -31,7 +31,9 @@
               addSdk(Build.VERSION_CODES.P, "9", "4913185-2", "REL");
               addSdk(Build.VERSION_CODES.Q, "10", "5803371", "REL");
               // BEGIN-INTERNAL
-              addSdk(Build.VERSION_CODES.R, "R", "r0", "R");
+              // TODO: Update jar with final R release.
+              addSdk(Build.VERSION_CODES.R, "R-beta2", "6625208", "REL");
+              addSdk(Build.VERSION_CODES.S, "S", "r0", "S");
               // END-INTERNAL
             }
 
diff --git a/robolectric/src/test/java/org/robolectric/ConfigMergerTest.java b/robolectric/src/test/java/org/robolectric/ConfigMergerTest.java
index 731dfd7..d4474f3 100644
--- a/robolectric/src/test/java/org/robolectric/ConfigMergerTest.java
+++ b/robolectric/src/test/java/org/robolectric/ConfigMergerTest.java
@@ -434,9 +434,9 @@
     assertThat(config.qualifiers()).isEqualTo(qualifiers);
     assertThat(config.resourceDir()).isEqualTo(resourceDir);
     assertThat(config.assetDir()).isEqualTo(assetsDir);
-    assertThat(config.shadows()).asList().containsAllIn(shadows).inOrder();
-    assertThat(config.instrumentedPackages()).asList().containsAllIn(instrumentedPackages);
-    assertThat(config.libraries()).asList().containsAllIn(libraries);
+    assertThat(config.shadows()).asList().containsAtLeastElementsIn(shadows).inOrder();
+    assertThat(config.instrumentedPackages()).asList().containsAtLeastElementsIn(instrumentedPackages);
+    assertThat(config.libraries()).asList().containsAtLeastElementsIn(libraries);
   }
 
   @Ignore
diff --git a/robolectric/src/test/java/org/robolectric/ConfigTest.java b/robolectric/src/test/java/org/robolectric/ConfigTest.java
index 4e04d35..0c6ee6c 100644
--- a/robolectric/src/test/java/org/robolectric/ConfigTest.java
+++ b/robolectric/src/test/java/org/robolectric/ConfigTest.java
@@ -112,7 +112,7 @@
 
     Config withMore = overlay(withString,
         new Builder().setShadows(new Class[]{Map.class, String.class}).build());
-    assertThat(withMore.shadows()).asList().containsAllOf(String.class, Map.class, String.class);
+    assertThat(withMore.shadows()).asList().containsAtLeast(String.class, Map.class, String.class);
   }
 
   @Test
diff --git a/robolectric/src/test/java/org/robolectric/RobolectricTestRunnerSelfTest.java b/robolectric/src/test/java/org/robolectric/RobolectricTestRunnerSelfTest.java
index 8c04b21..f2adc1e 100644
--- a/robolectric/src/test/java/org/robolectric/RobolectricTestRunnerSelfTest.java
+++ b/robolectric/src/test/java/org/robolectric/RobolectricTestRunnerSelfTest.java
@@ -1,6 +1,7 @@
 package org.robolectric;
 
 import static com.google.common.truth.Truth.assertThat;
+import static com.google.common.truth.Truth.assertWithMessage;
 import static org.junit.Assert.fail;
 
 import android.app.Application;
@@ -21,15 +22,14 @@
 
   @Test
   public void shouldInitializeAndBindApplicationButNotCallOnCreate() {
-    assertThat((Application) ApplicationProvider.getApplicationContext())
-        .named("application")
+    assertWithMessage("application").that((Application) ApplicationProvider.getApplicationContext())
         .isInstanceOf(MyTestApplication.class);
-    assertThat(((MyTestApplication) ApplicationProvider.getApplicationContext()).onCreateWasCalled)
-        .named("onCreate called")
+    assertWithMessage("onCreate called")
+        .that(((MyTestApplication) ApplicationProvider.getApplicationContext()).onCreateWasCalled)
         .isTrue();
     if (RuntimeEnvironment.useLegacyResources()) {
-      assertThat(RuntimeEnvironment.getAppResourceTable())
-          .named("Application resource loader")
+      assertWithMessage("Application resource loader")
+          .that(RuntimeEnvironment.getAppResourceTable())
           .isNotNull();
     }
   }
@@ -39,12 +39,12 @@
     Resources systemResources = Resources.getSystem();
     Resources appResources = ApplicationProvider.getApplicationContext().getResources();
 
-    assertThat(systemResources).named("system resources").isNotNull();
+    assertWithMessage("system resources").that(systemResources).isNotNull();
 
-    assertThat(systemResources.getString(android.R.string.copy)).named("system resource")
+    assertWithMessage("system resource").that(systemResources.getString(android.R.string.copy))
         .isEqualTo(appResources.getString(android.R.string.copy));
 
-    assertThat(appResources.getString(R.string.howdy)).named("app resource")
+    assertWithMessage("app resource").that(appResources.getString(R.string.howdy))
       .isNotNull();
     try {
       systemResources.getString(R.string.howdy);
diff --git a/robolectric/src/test/java/org/robolectric/RuntimeEnvironmentTest.java b/robolectric/src/test/java/org/robolectric/RuntimeEnvironmentTest.java
index 1fb8a94..ff42114 100644
--- a/robolectric/src/test/java/org/robolectric/RuntimeEnvironmentTest.java
+++ b/robolectric/src/test/java/org/robolectric/RuntimeEnvironmentTest.java
@@ -1,6 +1,7 @@
 package org.robolectric;
 
 import static com.google.common.truth.Truth.assertThat;
+import static com.google.common.truth.Truth.assertWithMessage;
 import static java.util.concurrent.TimeUnit.MILLISECONDS;
 
 import java.util.concurrent.CountDownLatch;
@@ -16,14 +17,14 @@
   @Test
   public void setMainThread_forCurrentThread() {
     RuntimeEnvironment.setMainThread(Thread.currentThread());
-    assertThat(RuntimeEnvironment.getMainThread()).isSameAs(Thread.currentThread());
+    assertThat(RuntimeEnvironment.getMainThread()).isSameInstanceAs(Thread.currentThread());
   }
 
   @Test
   public void setMainThread_forNewThread() {
     Thread t = new Thread();
     RuntimeEnvironment.setMainThread(t);
-    assertThat(RuntimeEnvironment.getMainThread()).isSameAs(t);
+    assertThat(RuntimeEnvironment.getMainThread()).isSameInstanceAs(t);
   }
 
   @Test
@@ -42,8 +43,8 @@
     if (!finished.await(1000, MILLISECONDS)) {
       throw new InterruptedException("Thread " + t + " didn't finish timely");
     }
-    assertThat(RuntimeEnvironment.isMainThread()).named("testThread").isTrue();
-    assertThat(res.get()).named("thread t").isFalse();
+    assertWithMessage("testThread").that(RuntimeEnvironment.isMainThread()).isTrue();
+    assertWithMessage("thread t").that(res.get()).isFalse();
   }
 
   @Test
@@ -62,8 +63,8 @@
     if (!finished.await(1000, MILLISECONDS)) {
       throw new InterruptedException("Thread " + t + " didn't finish timely");
     }
-    assertThat(RuntimeEnvironment.isMainThread()).named("testThread").isFalse();
-    assertThat(res.get()).named("thread t").isTrue();
+    assertWithMessage("testThread").that(RuntimeEnvironment.isMainThread()).isFalse();
+    assertWithMessage("thread t").that(res.get()).isTrue();
   }
 
   @Test
@@ -77,6 +78,6 @@
   public void getSetMasterScheduler() {
     Scheduler s = new Scheduler();
     RuntimeEnvironment.setMasterScheduler(s);
-    assertThat(RuntimeEnvironment.getMasterScheduler()).isSameAs(s);
+    assertThat(RuntimeEnvironment.getMasterScheduler()).isSameInstanceAs(s);
   }
-}
\ No newline at end of file
+}
diff --git a/robolectric/src/test/java/org/robolectric/android/AndroidInterceptorsTest.java b/robolectric/src/test/java/org/robolectric/android/AndroidInterceptorsTest.java
index 53be889..6241907 100644
--- a/robolectric/src/test/java/org/robolectric/android/AndroidInterceptorsTest.java
+++ b/robolectric/src/test/java/org/robolectric/android/AndroidInterceptorsTest.java
@@ -12,7 +12,7 @@
 public class AndroidInterceptorsTest {
   @Test
   public void allMethodRefs() throws Exception {
-    assertThat(new Interceptors(AndroidInterceptors.all()).getAllMethodRefs()).containsAllOf(
+    assertThat(new Interceptors(AndroidInterceptors.all()).getAllMethodRefs()).containsAtLeast(
             new MethodRef("java.util.LinkedHashMap", "eldest"),
             new MethodRef("java.lang.System", "loadLibrary"),
             new MethodRef("android.os.StrictMode", "trackActivity"),
diff --git a/robolectric/src/test/java/org/robolectric/android/XmlResourceParserImplTest.java b/robolectric/src/test/java/org/robolectric/android/XmlResourceParserImplTest.java
index 3fcbcbe..0247a12 100644
--- a/robolectric/src/test/java/org/robolectric/android/XmlResourceParserImplTest.java
+++ b/robolectric/src/test/java/org/robolectric/android/XmlResourceParserImplTest.java
@@ -1,6 +1,7 @@
 package org.robolectric.android;
 
 import static com.google.common.truth.Truth.assertThat;
+import static com.google.common.truth.Truth.assertWithMessage;
 import static java.nio.charset.StandardCharsets.UTF_8;
 import static java.util.Arrays.asList;
 import static org.junit.Assert.assertTrue;
@@ -357,20 +358,20 @@
 
   @Test
   public void testIsEmptyElementTag() throws Exception {
-    assertThat(parser.isEmptyElementTag()).named("Before START_DOCUMENT should return false.").isEqualTo(false);
+    assertWithMessage("Before START_DOCUMENT should return false.").that(parser.isEmptyElementTag()).isEqualTo(false);
 
     forgeAndOpenDocument("<foo><bar/></foo>");
-    assertThat(parser.isEmptyElementTag()).named("Not empty tag should return false.").isEqualTo(false);
+    assertWithMessage("Not empty tag should return false.").that(parser.isEmptyElementTag()).isEqualTo(false);
 
     forgeAndOpenDocument("<foo/>");
-    assertThat(parser.isEmptyElementTag()).named(
-        "In the Android implementation this method always return false.").isEqualTo(false);
+    assertWithMessage("In the Android implementation this method always return false.")
+       .that(parser.isEmptyElementTag()).isEqualTo(false);
   }
 
   @Test
   public void testGetAttributeCount() throws Exception {
-    assertThat(parser.getAttributeCount())
-        .named("When no node is being explored the number of attributes should be -1.").isEqualTo(-1);
+    assertWithMessage("When no node is being explored the number of attributes should be -1.")
+        .that(parser.getAttributeCount()).isEqualTo(-1);
 
     forgeAndOpenDocument("<foo bar=\"bar\"/>");
     assertThat(parser.getAttributeCount()).isEqualTo(1);
@@ -629,8 +630,8 @@
     // Negative unsigned int must be
     forgeAndOpenDocument("<foo xmlns:app=\"http://schemas.android.com/apk/res-auto\" app:bar=\"-12\"/>");
 
-    assertThat(parser.getAttributeUnsignedIntValue(RES_AUTO_NS, "bar", 0))
-        .named("Getting a negative number as unsigned should return the default value.").isEqualTo(0);
+    assertWithMessage("Getting a negative number as unsigned should return the default value.")
+        .that(parser.getAttributeUnsignedIntValue(RES_AUTO_NS, "bar", 0)).isEqualTo(0);
   }
 
   @Test
@@ -644,8 +645,8 @@
     // Negative unsigned int must be
     forgeAndOpenDocument("<foo bar=\"-12\"/>");
 
-    assertThat(parser.getAttributeUnsignedIntValue(0, 0))
-        .named("Getting a negative number as unsigned should return the default value.").isEqualTo(0);
+    assertWithMessage("Getting a negative number as unsigned should return the default value.")
+        .that(parser.getAttributeUnsignedIntValue(0, 0)).isEqualTo(0);
   }
 
   @Test
diff --git a/robolectric/src/test/java/org/robolectric/android/controller/ActivityControllerTest.java b/robolectric/src/test/java/org/robolectric/android/controller/ActivityControllerTest.java
index ea43757..e12527e 100644
--- a/robolectric/src/test/java/org/robolectric/android/controller/ActivityControllerTest.java
+++ b/robolectric/src/test/java/org/robolectric/android/controller/ActivityControllerTest.java
@@ -1,6 +1,7 @@
 package org.robolectric.android.controller;
 
 import static com.google.common.truth.Truth.assertThat;
+import static com.google.common.truth.Truth.assertWithMessage;
 import static org.robolectric.Shadows.shadowOf;
 
 import android.app.Activity;
@@ -66,8 +67,8 @@
     final Scheduler s = Robolectric.getForegroundThreadScheduler();
     final long startTime = s.getCurrentTime();
     TestDelayedPostActivity activity = Robolectric.setupActivity(TestDelayedPostActivity.class);
-    assertThat(activity.r1.wasRun).named("immediate task").isTrue();
-    assertThat(s.getCurrentTime()).named("currentTime").isEqualTo(startTime);
+    assertWithMessage("immediate task").that(activity.r1.wasRun).isTrue();
+    assertWithMessage("currentTime").that(s.getCurrentTime()).isEqualTo(startTime);
   }
 
   @Test
@@ -76,11 +77,11 @@
     final Scheduler s = Robolectric.getForegroundThreadScheduler();
     final long startTime = s.getCurrentTime();
     TestDelayedPostActivity activity = Robolectric.setupActivity(TestDelayedPostActivity.class);
-    assertThat(activity.r2.wasRun).named("before flush").isFalse();
-    assertThat(s.getCurrentTime()).named("currentTime before flush").isEqualTo(startTime);
+    assertWithMessage("before flush").that(activity.r2.wasRun).isFalse();
+    assertWithMessage("currentTime before flush").that(s.getCurrentTime()).isEqualTo(startTime);
     s.advanceToLastPostedRunnable();
-    assertThat(activity.r2.wasRun).named("after flush").isTrue();
-    assertThat(s.getCurrentTime()).named("currentTime after flush").isEqualTo(startTime + 60000);
+    assertWithMessage("after flush").that(activity.r2.wasRun).isTrue();
+    assertWithMessage("currentTime after flush").that(s.getCurrentTime()).isEqualTo(startTime + 60000);
   }
 
   @Test
@@ -108,7 +109,7 @@
     ShadowLooper.unPauseMainLooper();
     controller.create();
     assertThat(shadowOf(Looper.getMainLooper()).isPaused()).isFalse();
-    assertThat(transcript).containsAllOf("finishedOnCreate", "onCreate");
+    assertThat(transcript).containsAtLeast("finishedOnCreate", "onCreate");
   }
 
   @Test
@@ -133,73 +134,73 @@
   @Test
   public void start_callsPerformStartWhilePaused() {
     controller.create().start();
-    assertThat(transcript).containsAllOf("finishedOnStart", "onStart");
+    assertThat(transcript).containsAtLeast("finishedOnStart", "onStart");
   }
 
   @Test
   public void stop_callsPerformStopWhilePaused() {
     controller.create().start().stop();
-    assertThat(transcript).containsAllOf("finishedOnStop", "onStop");
+    assertThat(transcript).containsAtLeast("finishedOnStop", "onStop");
   }
 
   @Test
   public void restart_callsPerformRestartWhilePaused() {
     controller.create().start().stop().restart();
-    assertThat(transcript).containsAllOf("finishedOnRestart", "onRestart");
+    assertThat(transcript).containsAtLeast("finishedOnRestart", "onRestart");
   }
 
   @Test
   public void pause_callsPerformPauseWhilePaused() {
     controller.create().pause();
-    assertThat(transcript).containsAllOf("finishedOnPause", "onPause");
+    assertThat(transcript).containsAtLeast("finishedOnPause", "onPause");
   }
 
   @Test
   public void resume_callsPerformResumeWhilePaused() {
     controller.create().start().resume();
-    assertThat(transcript).containsAllOf("finishedOnResume", "onResume");
+    assertThat(transcript).containsAtLeast("finishedOnResume", "onResume");
   }
 
   @Test
   public void destroy_callsPerformDestroyWhilePaused() {
     controller.create().destroy();
-    assertThat(transcript).containsAllOf("finishedOnDestroy", "onDestroy");
+    assertThat(transcript).containsAtLeast("finishedOnDestroy", "onDestroy");
   }
 
   @Test
   public void postCreate_callsOnPostCreateWhilePaused() {
     controller.create().postCreate(new Bundle());
-    assertThat(transcript).containsAllOf("finishedOnPostCreate", "onPostCreate");
+    assertThat(transcript).containsAtLeast("finishedOnPostCreate", "onPostCreate");
   }
 
   @Test
   public void postResume_callsOnPostResumeWhilePaused() {
     controller.create().postResume();
-    assertThat(transcript).containsAllOf("finishedOnPostResume", "onPostResume");
+    assertThat(transcript).containsAtLeast("finishedOnPostResume", "onPostResume");
   }
 
   @Test
   public void restoreInstanceState_callsPerformRestoreInstanceStateWhilePaused() {
     controller.create().restoreInstanceState(new Bundle());
-    assertThat(transcript).containsAllOf("finishedOnRestoreInstanceState", "onRestoreInstanceState");
+    assertThat(transcript).containsAtLeast("finishedOnRestoreInstanceState", "onRestoreInstanceState");
   }
 
   @Test
   public void newIntent_callsOnNewIntentWhilePaused() {
     controller.create().newIntent(new Intent(Intent.ACTION_VIEW));
-    assertThat(transcript).containsAllOf("finishedOnNewIntent", "onNewIntent");
+    assertThat(transcript).containsAtLeast("finishedOnNewIntent", "onNewIntent");
   }
 
   @Test
   public void userLeaving_callsPerformUserLeavingWhilePaused() {
     controller.create().userLeaving();
-    assertThat(transcript).containsAllOf("finishedOnUserLeaveHint", "onUserLeaveHint");
+    assertThat(transcript).containsAtLeast("finishedOnUserLeaveHint", "onUserLeaveHint");
   }
 
   @Test
   public void setup_callsLifecycleMethodsAndMakesVisible() {
     controller.setup();
-    assertThat(transcript).containsAllOf("onCreate", "onStart", "onPostCreate", "onResume", "onPostResume");
+    assertThat(transcript).containsAtLeast("onCreate", "onStart", "onPostCreate", "onResume", "onPostResume");
     assertThat(controller.get().getWindow().getDecorView().getParent().getClass()).isEqualTo(
         ViewRootImpl.class);
   }
@@ -207,7 +208,7 @@
   @Test
   public void setupWithBundle_callsLifecycleMethodsAndMakesVisible() {
     controller.setup(new Bundle());
-    assertThat(transcript).containsAllOf("onCreate", "onStart", "onRestoreInstanceState", "onPostCreate", "onResume", "onPostResume");
+    assertThat(transcript).containsAtLeast("onCreate", "onStart", "onRestoreInstanceState", "onPostCreate", "onResume", "onPostResume");
     assertThat(controller.get().getWindow().getDecorView().getParent().getClass()).isEqualTo(
         ViewRootImpl.class);
   }
@@ -229,7 +230,7 @@
     controller.setup();
     transcript.clear();
     controller.configurationChange(config);
-    assertThat(transcript).containsAllOf("onPause", "onStop", "onDestroy", "onCreate", "onStart", "onRestoreInstanceState", "onPostCreate", "onResume", "onPostResume");
+    assertThat(transcript).containsAtLeast("onPause", "onStop", "onDestroy", "onCreate", "onStart", "onRestoreInstanceState", "onPostCreate", "onResume", "onPostResume");
     assertThat(controller.get().getResources().getConfiguration().fontScale).isEqualTo(newFontScale);
   }
 
@@ -260,7 +261,7 @@
         Robolectric.buildActivity(ConfigAwareActivity.class).setup();
     transcript.clear();
     configController.configurationChange(config);
-    assertThat(transcript).containsAllOf("onPause", "onStop", "onDestroy", "onCreate", "onStart", "onResume");
+    assertThat(transcript).containsAtLeast("onPause", "onStop", "onDestroy", "onCreate", "onStart", "onResume");
     assertThat(configController.get().getResources().getConfiguration().fontScale).isEqualTo(newFontScale);
     assertThat(configController.get().getResources().getConfiguration().orientation).isEqualTo(newOrientation);
   }
@@ -309,9 +310,9 @@
     activity = configController.get();
 
     assertThat(activity.retainedFragment).isNotNull();
-    assertThat(activity.retainedFragment).isSameAs(retainedFragment);
+    assertThat(activity.retainedFragment).isSameInstanceAs(retainedFragment);
     assertThat(activity.nonRetainedFragment).isNotNull();
-    assertThat(activity.nonRetainedFragment).isNotSameAs(otherFragment);
+    assertThat(activity.nonRetainedFragment).isNotSameInstanceAs(otherFragment);
   }
 
   @Test
diff --git a/robolectric/src/test/java/org/robolectric/android/controller/ContentProviderControllerTest.java b/robolectric/src/test/java/org/robolectric/android/controller/ContentProviderControllerTest.java
index 190e887..2ed48b1 100644
--- a/robolectric/src/test/java/org/robolectric/android/controller/ContentProviderControllerTest.java
+++ b/robolectric/src/test/java/org/robolectric/android/controller/ContentProviderControllerTest.java
@@ -94,7 +94,7 @@
     XContentProvider xContentProvider = Robolectric.setupContentProvider(XContentProvider.class, "x-authority");
     assertThat(xContentProvider.transcript).containsExactly("x-authority not registered yet");
     ContentProviderClient contentProviderClient = contentResolver.acquireContentProviderClient("x-authority");
-    assertThat(contentProviderClient.getLocalContentProvider()).isSameAs(xContentProvider);
+    assertThat(contentProviderClient.getLocalContentProvider()).isSameInstanceAs(xContentProvider);
   }
 
   ////////////////////
diff --git a/robolectric/src/test/java/org/robolectric/android/controller/IntentServiceControllerTest.java b/robolectric/src/test/java/org/robolectric/android/controller/IntentServiceControllerTest.java
index 67115f8..e3c7be4 100644
--- a/robolectric/src/test/java/org/robolectric/android/controller/IntentServiceControllerTest.java
+++ b/robolectric/src/test/java/org/robolectric/android/controller/IntentServiceControllerTest.java
@@ -79,31 +79,31 @@
   @Test
   public void unbind_callsUnbindWhilePaused() {
     controller.create().bind().unbind();
-    assertThat(transcript).containsAllOf("finishedOnUnbind", "onUnbind");
+    assertThat(transcript).containsAtLeast("finishedOnUnbind", "onUnbind");
   }
 
   @Test
   public void rebind_callsRebindWhilePaused() {
     controller.create().bind().unbind().bind().rebind();
-    assertThat(transcript).containsAllOf("finishedOnRebind", "onRebind");
+    assertThat(transcript).containsAtLeast("finishedOnRebind", "onRebind");
   }
 
   @Test
   public void destroy_callsOnDestroyWhilePaused() {
     controller.create().destroy();
-    assertThat(transcript).containsAllOf("finishedOnDestroy", "onDestroy");
+    assertThat(transcript).containsAtLeast("finishedOnDestroy", "onDestroy");
   }
 
   @Test
   public void bind_callsOnBindWhilePaused() {
     controller.create().bind();
-    assertThat(transcript).containsAllOf("finishedOnBind", "onBind");
+    assertThat(transcript).containsAtLeast("finishedOnBind", "onBind");
   }
 
   @Test
   public void startCommand_callsOnHandleIntentWhilePaused() {
     controller.create().startCommand(1, 2);
-    assertThat(transcript).containsAllOf("finishedOnHandleIntent", "onHandleIntent");
+    assertThat(transcript).containsAtLeast("finishedOnHandleIntent", "onHandleIntent");
   }
 
   public static class MyService extends IntentService {
diff --git a/robolectric/src/test/java/org/robolectric/android/controller/ServiceControllerTest.java b/robolectric/src/test/java/org/robolectric/android/controller/ServiceControllerTest.java
index 47eba92..e01f0d7 100644
--- a/robolectric/src/test/java/org/robolectric/android/controller/ServiceControllerTest.java
+++ b/robolectric/src/test/java/org/robolectric/android/controller/ServiceControllerTest.java
@@ -80,31 +80,31 @@
   @Test
   public void unbind_callsUnbindWhilePaused() {
     controller.create().bind().unbind();
-    assertThat(transcript).containsAllOf("finishedOnUnbind", "onUnbind");
+    assertThat(transcript).containsAtLeast("finishedOnUnbind", "onUnbind");
   }
 
   @Test
   public void rebind_callsRebindWhilePaused() {
     controller.create().bind().unbind().bind().rebind();
-    assertThat(transcript).containsAllOf("finishedOnRebind", "onRebind");
+    assertThat(transcript).containsAtLeast("finishedOnRebind", "onRebind");
   }
 
   @Test
   public void destroy_callsOnDestroyWhilePaused() {
     controller.create().destroy();
-    assertThat(transcript).containsAllOf("finishedOnDestroy", "onDestroy");
+    assertThat(transcript).containsAtLeast("finishedOnDestroy", "onDestroy");
   }
 
   @Test
   public void bind_callsOnBindWhilePaused() {
     controller.create().bind();
-    assertThat(transcript).containsAllOf("finishedOnBind", "onBind");
+    assertThat(transcript).containsAtLeast("finishedOnBind", "onBind");
   }
 
   @Test
   public void startCommand_callsOnStartCommandWhilePaused() {
     controller.create().startCommand(1, 2);
-    assertThat(transcript).containsAllOf("finishedOnStartCommand", "onStartCommand");
+    assertThat(transcript).containsAtLeast("finishedOnStartCommand", "onStartCommand");
   }
 
   public static class MyService extends Service {
diff --git a/robolectric/src/test/java/org/robolectric/android/internal/ParallelUniverseTest.java b/robolectric/src/test/java/org/robolectric/android/internal/ParallelUniverseTest.java
index fc9e4d3..f129e72 100644
--- a/robolectric/src/test/java/org/robolectric/android/internal/ParallelUniverseTest.java
+++ b/robolectric/src/test/java/org/robolectric/android/internal/ParallelUniverseTest.java
@@ -54,9 +54,9 @@
     bootstrapWrapper.callSetUpApplicationState();
 
     assertThat(RuntimeEnvironment.getMasterScheduler())
-        .isSameAs(ShadowLooper.getShadowMainLooper().getScheduler());
+        .isSameInstanceAs(ShadowLooper.getShadowMainLooper().getScheduler());
     assertThat(RuntimeEnvironment.getMasterScheduler())
-        .isSameAs(ShadowApplication.getInstance().getForegroundThreadScheduler());
+        .isSameInstanceAs(ShadowApplication.getInstance().getForegroundThreadScheduler());
   }
 
   @Test
@@ -67,9 +67,9 @@
       final ShadowApplication shadowApplication =
           Shadow.extract(ApplicationProvider.getApplicationContext());
       assertThat(shadowApplication.getBackgroundThreadScheduler())
-          .isSameAs(shadowApplication.getForegroundThreadScheduler());
+          .isSameInstanceAs(shadowApplication.getForegroundThreadScheduler());
       assertThat(RuntimeEnvironment.getMasterScheduler())
-          .isSameAs(RuntimeEnvironment.getMasterScheduler());
+          .isSameInstanceAs(RuntimeEnvironment.getMasterScheduler());
     } finally {
       RoboSettings.setUseGlobalScheduler(false);
     }
@@ -81,7 +81,7 @@
     final ShadowApplication shadowApplication =
         Shadow.extract(ApplicationProvider.getApplicationContext());
     assertThat(shadowApplication.getBackgroundThreadScheduler())
-        .isNotSameAs(shadowApplication.getForegroundThreadScheduler());
+        .isNotSameInstanceAs(shadowApplication.getForegroundThreadScheduler());
   }
 
   @Test
diff --git a/robolectric/src/test/java/org/robolectric/fakes/RoboMenuItemTest.java b/robolectric/src/test/java/org/robolectric/fakes/RoboMenuItemTest.java
index b9ae311..1f733e5 100644
--- a/robolectric/src/test/java/org/robolectric/fakes/RoboMenuItemTest.java
+++ b/robolectric/src/test/java/org/robolectric/fakes/RoboMenuItemTest.java
@@ -146,7 +146,7 @@
     assertThat(testDrawable).isNotNull();
     assertThat(item.getIcon()).isNull();
     item.setIcon(testDrawable);
-    assertThat(item.getIcon()).isSameAs(testDrawable);
+    assertThat(item.getIcon()).isSameInstanceAs(testDrawable);
   }
 
   @Test
@@ -158,7 +158,7 @@
 
   @Test
   public void setOnActionExpandListener_shouldReturnMenuItem() throws Exception {
-    assertThat(item.setOnActionExpandListener(listener)).isSameAs(item);
+    assertThat(item.setOnActionExpandListener(listener)).isSameInstanceAs(item);
   }
 
   static class TestOnActionExpandListener implements MenuItem.OnActionExpandListener {
diff --git a/robolectric/src/test/java/org/robolectric/internal/bytecode/AndroidSandboxClassLoaderTest.java b/robolectric/src/test/java/org/robolectric/internal/bytecode/AndroidSandboxClassLoaderTest.java
index d15b3d0..cc3121b 100644
--- a/robolectric/src/test/java/org/robolectric/internal/bytecode/AndroidSandboxClassLoaderTest.java
+++ b/robolectric/src/test/java/org/robolectric/internal/bytecode/AndroidSandboxClassLoaderTest.java
@@ -1,6 +1,7 @@
 package org.robolectric.internal.bytecode;
 
 import static com.google.common.truth.Truth.assertThat;
+import static com.google.common.truth.Truth.assertWithMessage;
 
 import android.os.Build;
 import java.lang.reflect.Modifier;
@@ -27,7 +28,7 @@
   public void shouldMakeBuildVersionIntsNonFinal() throws Exception {
     Class<?> versionClass = loadClass(Build.VERSION.class);
     int modifiers = versionClass.getDeclaredField("SDK_INT").getModifiers();
-    assertThat(Modifier.isFinal(modifiers)).named("SDK_INT should be non-final").isFalse();
+    assertWithMessage("SDK_INT should be non-final").that(Modifier.isFinal(modifiers)).isFalse();
   }
 
   ////////////////////////
diff --git a/robolectric/src/test/java/org/robolectric/internal/bytecode/ShadowWranglerUnitTest.java b/robolectric/src/test/java/org/robolectric/internal/bytecode/ShadowWranglerUnitTest.java
index a083e48..ea0adf3 100644
--- a/robolectric/src/test/java/org/robolectric/internal/bytecode/ShadowWranglerUnitTest.java
+++ b/robolectric/src/test/java/org/robolectric/internal/bytecode/ShadowWranglerUnitTest.java
@@ -38,7 +38,7 @@
     MethodSignature methodSignature = MethodSignature.parse("java/util/LinkedHashMap/eldest()Ljava/lang/Object;");
     Function<Object,Object> handler = interceptors.getInterceptionHandler(methodSignature);
 
-    assertThat(handler).isNotSameAs(ShadowWrangler.DO_NOTHING_HANDLER);
+    assertThat(handler).isNotSameInstanceAs(ShadowWrangler.DO_NOTHING_HANDLER);
   }
 
   @Test
@@ -122,7 +122,7 @@
   public void whenChildShadowHasNarrowerSdk_createShadowFor_shouldReturnSuperShadowSometimes() throws Exception {
     ShadowMap shadowMap = new ShadowMap.Builder().addShadowClasses(ShadowDummyClass.class, ShadowChildOfDummyClass.class).build();
     assertThat(new ShadowWrangler(shadowMap, 18, interceptors).createShadowFor(new ChildOfDummyClass()))
-        .isSameAs(ShadowWrangler.NO_SHADOW);
+        .isSameInstanceAs(ShadowWrangler.NO_SHADOW);
     assertThat(new ShadowWrangler(shadowMap, 19, interceptors).createShadowFor(new ChildOfDummyClass()))
         .isInstanceOf(ShadowDummyClass.class);
     assertThat(new ShadowWrangler(shadowMap, 20, interceptors).createShadowFor(new ChildOfDummyClass()))
@@ -130,7 +130,7 @@
     assertThat(new ShadowWrangler(shadowMap, 21, interceptors).createShadowFor(new ChildOfDummyClass()))
         .isInstanceOf(ShadowChildOfDummyClass.class);
     assertThat(new ShadowWrangler(shadowMap, 22, interceptors).createShadowFor(new ChildOfDummyClass()))
-        .isSameAs(ShadowWrangler.NO_SHADOW);
+        .isSameInstanceAs(ShadowWrangler.NO_SHADOW);
   }
 
   @Test
diff --git a/robolectric/src/test/java/org/robolectric/shadows/SQLiteDatabaseTest.java b/robolectric/src/test/java/org/robolectric/shadows/SQLiteDatabaseTest.java
index d8d6449..5026fdb 100644
--- a/robolectric/src/test/java/org/robolectric/shadows/SQLiteDatabaseTest.java
+++ b/robolectric/src/test/java/org/robolectric/shadows/SQLiteDatabaseTest.java
@@ -618,7 +618,7 @@
         assertThat(db.isOpen()).isFalse();
 
         SQLiteDatabase reopened = SQLiteDatabase.openDatabase(databasePath.getAbsolutePath(), null, OPEN_READWRITE);
-        assertThat(reopened).isNotSameAs(db);
+        assertThat(reopened).isNotSameInstanceAs(db);
         assertThat(reopened.isOpen()).isTrue();
     }
 
diff --git a/robolectric/src/test/java/org/robolectric/shadows/SQLiteOpenHelperTest.java b/robolectric/src/test/java/org/robolectric/shadows/SQLiteOpenHelperTest.java
index ad4488b..0153979 100644
--- a/robolectric/src/test/java/org/robolectric/shadows/SQLiteOpenHelperTest.java
+++ b/robolectric/src/test/java/org/robolectric/shadows/SQLiteOpenHelperTest.java
@@ -57,7 +57,7 @@
     SQLiteDatabase db1 = helper.getReadableDatabase();
     SQLiteDatabase db2 = helper.getReadableDatabase();
 
-    assertThat(db1).isSameAs(db2);
+    assertThat(db1).isSameInstanceAs(db2);
   }
 
   @Test
@@ -79,7 +79,7 @@
     SQLiteDatabase db1 = helper.getWritableDatabase();
     SQLiteDatabase db2 = helper.getWritableDatabase();
 
-    assertThat(db1).isSameAs(db2);
+    assertThat(db1).isSameInstanceAs(db2);
   }
 
   @Test
diff --git a/robolectric/src/test/java/org/robolectric/shadows/ShadowAccountManagerTest.java b/robolectric/src/test/java/org/robolectric/shadows/ShadowAccountManagerTest.java
index 4ad950d..1be4762 100644
--- a/robolectric/src/test/java/org/robolectric/shadows/ShadowAccountManagerTest.java
+++ b/robolectric/src/test/java/org/robolectric/shadows/ShadowAccountManagerTest.java
@@ -46,11 +46,11 @@
   @Test
   public void testGet() {
     assertThat(am).isNotNull();
-    assertThat(am).isSameAs(AccountManager.get(ApplicationProvider.getApplicationContext()));
+    assertThat(am).isSameInstanceAs(AccountManager.get(ApplicationProvider.getApplicationContext()));
 
     AccountManager activityAM = AccountManager.get(ApplicationProvider.getApplicationContext());
     assertThat(activityAM).isNotNull();
-    assertThat(activityAM).isSameAs(am);
+    assertThat(activityAM).isSameInstanceAs(am);
   }
 
   @Test
@@ -62,13 +62,13 @@
     shadowOf(am).addAccount(a1);
     assertThat(am.getAccounts()).isNotNull();
     assertThat(am.getAccounts().length).isEqualTo(1);
-    assertThat(am.getAccounts()[0]).isSameAs(a1);
+    assertThat(am.getAccounts()[0]).isSameInstanceAs(a1);
 
     Account a2 = new Account("name_b", "type_b");
     shadowOf(am).addAccount(a2);
     assertThat(am.getAccounts()).isNotNull();
     assertThat(am.getAccounts().length).isEqualTo(2);
-    assertThat(am.getAccounts()[1]).isSameAs(a2);
+    assertThat(am.getAccounts()[1]).isSameInstanceAs(a2);
   }
 
   @Test
@@ -77,7 +77,7 @@
     shadowOf(am).addAccount(new Account("name_2", "type_2"));
     shadowOf(am).addAccount(new Account("name_3", "type_3"));
 
-    assertThat(am.getAccountsByType(null)).asList().containsAllIn(am.getAccounts());
+    assertThat(am.getAccountsByType(null)).asList().containsAtLeastElementsIn(am.getAccounts());
   }
 
   @Test
@@ -90,22 +90,22 @@
     Account[] accounts = am.getAccountsByType("type_a");
     assertThat(accounts).isNotNull();
     assertThat(accounts.length).isEqualTo(1);
-    assertThat(accounts[0]).isSameAs(a1);
+    assertThat(accounts[0]).isSameInstanceAs(a1);
 
     Account a2 = new Account("name_b", "type_b");
     shadowOf(am).addAccount(a2);
     accounts = am.getAccountsByType("type_a");
     assertThat(accounts).isNotNull();
     assertThat(accounts.length).isEqualTo(1);
-    assertThat(accounts[0]).isSameAs(a1);
+    assertThat(accounts[0]).isSameInstanceAs(a1);
 
     Account a3 = new Account("name_c", "type_a");
     shadowOf(am).addAccount(a3);
     accounts = am.getAccountsByType("type_a");
     assertThat(accounts).isNotNull();
     assertThat(accounts.length).isEqualTo(2);
-    assertThat(accounts[0]).isSameAs(a1);
-    assertThat(accounts[1]).isSameAs(a3);
+    assertThat(accounts[0]).isSameInstanceAs(a1);
+    assertThat(accounts[1]).isSameInstanceAs(a3);
   }
 
   @Test
diff --git a/robolectric/src/test/java/org/robolectric/shadows/ShadowActivityGroupTest.java b/robolectric/src/test/java/org/robolectric/shadows/ShadowActivityGroupTest.java
index 5a649e9..d1757df 100644
--- a/robolectric/src/test/java/org/robolectric/shadows/ShadowActivityGroupTest.java
+++ b/robolectric/src/test/java/org/robolectric/shadows/ShadowActivityGroupTest.java
@@ -18,6 +18,6 @@
   Activity activity = new Activity();
   shadowOf(activityGroup).setCurrentActivity(activity);
 
-    assertThat(activityGroup.getCurrentActivity()).isSameAs(activity);
+    assertThat(activityGroup.getCurrentActivity()).isSameInstanceAs(activity);
   }
 }
diff --git a/robolectric/src/test/java/org/robolectric/shadows/ShadowActivityTest.java b/robolectric/src/test/java/org/robolectric/shadows/ShadowActivityTest.java
index 0ce9c30..00726ad 100644
--- a/robolectric/src/test/java/org/robolectric/shadows/ShadowActivityTest.java
+++ b/robolectric/src/test/java/org/robolectric/shadows/ShadowActivityTest.java
@@ -5,6 +5,7 @@
 import static android.os.Build.VERSION_CODES.LOLLIPOP;
 import static android.os.Build.VERSION_CODES.M;
 import static com.google.common.truth.Truth.assertThat;
+import static com.google.common.truth.Truth.assertWithMessage;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertNotNull;
@@ -250,7 +251,7 @@
 
     Intent startedIntent = shadowActivity.getNextStartedActivity();
     assertThat(startedIntent).isNotNull();
-    assertThat(startedIntent).isSameAs(intent);
+    assertThat(startedIntent).isSameInstanceAs(intent);
   }
 
   @Test
@@ -265,7 +266,7 @@
     assertThat(intentForResult).isNotNull();
     assertThat(shadowActivity.getNextStartedActivityForResult()).isNull();
     assertThat(intentForResult.intent).isNotNull();
-    assertThat(intentForResult.intent).isSameAs(intent);
+    assertThat(intentForResult.intent).isSameInstanceAs(intent);
     assertThat(intentForResult.requestCode).isEqualTo(142);
   }
 
@@ -279,9 +280,9 @@
 
     ShadowActivity.IntentForResult intentForResult = shadowActivity.peekNextStartedActivityForResult();
     assertThat(intentForResult).isNotNull();
-    assertThat(shadowActivity.peekNextStartedActivityForResult()).isSameAs(intentForResult);
+    assertThat(shadowActivity.peekNextStartedActivityForResult()).isSameInstanceAs(intentForResult);
     assertThat(intentForResult.intent).isNotNull();
-    assertThat(intentForResult.intent).isSameAs(intent);
+    assertThat(intentForResult.intent).isSameInstanceAs(intent);
     assertThat(intentForResult.requestCode).isEqualTo(142);
   }
 
@@ -500,7 +501,7 @@
 
     for (int mode : modes) {
       activity.setDefaultKeyMode(mode);
-      assertThat(shadow.getDefaultKeymode()).named("Unexpected key mode").isEqualTo(mode);
+      assertWithMessage("Unexpected key mode").that(shadow.getDefaultKeymode()).isEqualTo(mode);
     }
   }
 
@@ -558,7 +559,7 @@
     activity.setContentView(contentView);
 
     FrameLayout contentViewContainer = (FrameLayout) activity.findViewById(android.R.id.content);
-    assertThat(contentViewContainer.getChildAt(0)).isSameAs(contentView);
+    assertThat(contentViewContainer.getChildAt(0)).isSameInstanceAs(contentView);
   }
 
   @Test
@@ -604,7 +605,7 @@
 
     assertThat(shadow.getManagedCursors()).isNotNull();
     assertThat(shadow.getManagedCursors().size()).isEqualTo(1);
-    assertThat(shadow.getManagedCursors().get(0)).isSameAs(c);
+    assertThat(shadow.getManagedCursors().get(0)).isSameInstanceAs(c);
 
     activity.stopManagingCursor(c);
 
@@ -813,7 +814,7 @@
     activity.startActivityFromFragment(new Fragment(), intent, 4);
 
     ShadowActivity.IntentForResult intentForResult = shadowOf(activity).getNextStartedActivityForResult();
-    assertThat(intentForResult.intent).isSameAs(intent);
+    assertThat(intentForResult.intent).isSameInstanceAs(intent);
     assertThat(intentForResult.requestCode).isEqualTo(4);
   }
 
@@ -826,8 +827,8 @@
     activity.startActivityFromFragment(new Fragment(), intent, 5, options);
 
     ShadowActivity.IntentForResult intentForResult = shadowOf(activity).getNextStartedActivityForResult();
-    assertThat(intentForResult.intent).isSameAs(intent);
-    assertThat(intentForResult.options).isSameAs(options);
+    assertThat(intentForResult.intent).isSameInstanceAs(intent);
+    assertThat(intentForResult.options).isSameInstanceAs(options);
     assertThat(intentForResult.requestCode).isEqualTo(5);
   }
 
@@ -838,7 +839,7 @@
 
     Bundle animationBundle = ActivityOptions.makeCustomAnimation(activity, R.anim.test_anim_1, R.anim.test_anim_1).toBundle();
     activity.startActivity(intent, animationBundle);
-    assertThat(shadowOf(activity).getNextStartedActivityForResult().options).isSameAs(animationBundle);
+    assertThat(shadowOf(activity).getNextStartedActivityForResult().options).isSameInstanceAs(animationBundle);
   }
 
   @Test
diff --git a/robolectric/src/test/java/org/robolectric/shadows/ShadowAlarmManagerTest.java b/robolectric/src/test/java/org/robolectric/shadows/ShadowAlarmManagerTest.java
index 9bd8eae..0d4b402 100644
--- a/robolectric/src/test/java/org/robolectric/shadows/ShadowAlarmManagerTest.java
+++ b/robolectric/src/test/java/org/robolectric/shadows/ShadowAlarmManagerTest.java
@@ -346,8 +346,8 @@
     AlarmClockInfo next = alarmManager.getNextAlarmClock();
     assertThat(next).isNotNull();
     assertThat(next.getTriggerTime()).isEqualTo(1000);
-    assertThat(next.getShowIntent()).isSameAs(show);
-    assertThat(shadowAlarmManager.peekNextScheduledAlarm().operation).isSameAs(operation);
+    assertThat(next.getShowIntent()).isSameInstanceAs(show);
+    assertThat(shadowAlarmManager.peekNextScheduledAlarm().operation).isSameInstanceAs(operation);
 
     // Schedule another alarm sooner.
     PendingIntent show2 = PendingIntent.getBroadcast(context, 0, new Intent("showAction2"), 0);
@@ -358,8 +358,8 @@
     next = alarmManager.getNextAlarmClock();
     assertThat(next).isNotNull();
     assertThat(next.getTriggerTime()).isEqualTo(500);
-    assertThat(next.getShowIntent()).isSameAs(show2);
-    assertThat(shadowAlarmManager.peekNextScheduledAlarm().operation).isSameAs(operation2);
+    assertThat(next.getShowIntent()).isSameInstanceAs(show2);
+    assertThat(shadowAlarmManager.peekNextScheduledAlarm().operation).isSameInstanceAs(operation2);
 
     // Remove the soonest alarm.
     alarmManager.cancel(operation2);
@@ -367,8 +367,8 @@
     next = alarmManager.getNextAlarmClock();
     assertThat(next).isNotNull();
     assertThat(next.getTriggerTime()).isEqualTo(1000);
-    assertThat(next.getShowIntent()).isSameAs(show);
-    assertThat(shadowAlarmManager.peekNextScheduledAlarm().operation).isSameAs(operation);
+    assertThat(next.getShowIntent()).isSameInstanceAs(show);
+    assertThat(shadowAlarmManager.peekNextScheduledAlarm().operation).isSameInstanceAs(operation);
 
     // Remove the sole alarm.
     alarmManager.cancel(operation);
@@ -386,7 +386,7 @@
       ShadowAlarmManager.ScheduledAlarm scheduledAlarm) {
     assertThat(scheduledAlarm).isNotNull();
     assertThat(scheduledAlarm.operation).isNotNull();
-    assertThat(scheduledAlarm.operation).isSameAs(pendingIntent);
+    assertThat(scheduledAlarm.operation).isSameInstanceAs(pendingIntent);
     assertThat(scheduledAlarm.type).isEqualTo(AlarmManager.ELAPSED_REALTIME);
     assertThat(scheduledAlarm.triggerAtTime).isEqualTo(now);
     assertThat(scheduledAlarm.interval).isEqualTo(interval);
diff --git a/robolectric/src/test/java/org/robolectric/shadows/ShadowAlertDialogTest.java b/robolectric/src/test/java/org/robolectric/shadows/ShadowAlertDialogTest.java
index 854e856..e15ecba 100644
--- a/robolectric/src/test/java/org/robolectric/shadows/ShadowAlertDialogTest.java
+++ b/robolectric/src/test/java/org/robolectric/shadows/ShadowAlertDialogTest.java
@@ -55,8 +55,8 @@
     assertEquals("title", shadowAlertDialog.getTitle());
     assertThat(shadowAlertDialog.getMessage()).isEqualTo("message");
     assertThat(shadowAlertDialog.isCancelable()).isTrue();
-    assertThat(shadowOf(ShadowAlertDialog.getLatestAlertDialog())).isSameAs(shadowAlertDialog);
-    assertThat(ShadowAlertDialog.getLatestAlertDialog()).isSameAs(alert);
+    assertThat(shadowOf(ShadowAlertDialog.getLatestAlertDialog())).isSameInstanceAs(shadowAlertDialog);
+    assertThat(ShadowAlertDialog.getLatestAlertDialog()).isSameInstanceAs(alert);
   }
 
   @Test
@@ -74,7 +74,7 @@
     assertThat(ShadowAlertDialog.getLatestAlertDialog()).isNull();
 
     AlertDialog dialog = new AlertDialog.Builder(application).show();
-    assertThat(ShadowAlertDialog.getLatestAlertDialog()).isSameAs(dialog);
+    assertThat(ShadowAlertDialog.getLatestAlertDialog()).isSameInstanceAs(dialog);
   }
 
   @Test
@@ -148,7 +148,7 @@
   public void shouldSetCustomTitleView() throws Exception {
     AlertDialog.Builder builder = new AlertDialog.Builder(application);
     View view = new View(application);
-    assertThat(builder.setCustomTitle(view)).isSameAs(builder);
+    assertThat(builder.setCustomTitle(view)).isSameInstanceAs(builder);
 
     AlertDialog alert = builder.create();
     assertThat(shadowOf(alert).getCustomTitleView()).isEqualTo(view);
@@ -210,8 +210,8 @@
     assertThat(shadowAlertDialog.getTitle().toString()).isEqualTo("title");
     assertThat(shadowAlertDialog.getItems().length).isEqualTo(2);
     assertThat(shadowAlertDialog.getItems()[0]).isEqualTo("Aloha");
-    assertThat(shadowOf(ShadowAlertDialog.getLatestAlertDialog())).isSameAs(shadowAlertDialog);
-    assertThat(ShadowAlertDialog.getLatestAlertDialog()).isSameAs(alert);
+    assertThat(shadowOf(ShadowAlertDialog.getLatestAlertDialog())).isSameInstanceAs(shadowAlertDialog);
+    assertThat(ShadowAlertDialog.getLatestAlertDialog()).isSameInstanceAs(alert);
   }
 
   @Test
diff --git a/robolectric/src/test/java/org/robolectric/shadows/ShadowAppOpsManagerTest.java b/robolectric/src/test/java/org/robolectric/shadows/ShadowAppOpsManagerTest.java
index 81a2506..0d1f4f6 100644
--- a/robolectric/src/test/java/org/robolectric/shadows/ShadowAppOpsManagerTest.java
+++ b/robolectric/src/test/java/org/robolectric/shadows/ShadowAppOpsManagerTest.java
@@ -284,6 +284,6 @@
       }
     }
 
-    assertThat(actualOps).containsAllIn(expectedOps);
+    assertThat(actualOps).containsAtLeastElementsIn(expectedOps);
   }
 }
diff --git a/robolectric/src/test/java/org/robolectric/shadows/ShadowAppTaskTest.java b/robolectric/src/test/java/org/robolectric/shadows/ShadowAppTaskTest.java
index e8fcd4e..db17e6e 100644
--- a/robolectric/src/test/java/org/robolectric/shadows/ShadowAppTaskTest.java
+++ b/robolectric/src/test/java/org/robolectric/shadows/ShadowAppTaskTest.java
@@ -45,7 +45,7 @@
 
     shadowOf(appTask).setTaskInfo(recentTaskInfo);
 
-    assertThat(appTask.getTaskInfo()).isSameAs(recentTaskInfo);
+    assertThat(appTask.getTaskInfo()).isSameInstanceAs(recentTaskInfo);
   }
 
   @Test
diff --git a/robolectric/src/test/java/org/robolectric/shadows/ShadowAppWidgetHostTest.java b/robolectric/src/test/java/org/robolectric/shadows/ShadowAppWidgetHostTest.java
index d7bca7e..0bf5355 100644
--- a/robolectric/src/test/java/org/robolectric/shadows/ShadowAppWidgetHostTest.java
+++ b/robolectric/src/test/java/org/robolectric/shadows/ShadowAppWidgetHostTest.java
@@ -29,7 +29,7 @@
 
   @Test
   public void shouldKnowItsContext() throws Exception {
-    assertThat(shadowAppWidgetHost.getContext()).isSameAs(context);
+    assertThat(shadowAppWidgetHost.getContext()).isSameInstanceAs(context);
   }
 
   @Test
@@ -46,7 +46,7 @@
   @Test
   public void createView_shouldSetViewsContext() throws Exception {
     AppWidgetHostView hostView = appWidgetHost.createView(context, 0, null);
-    assertThat(hostView.getContext()).isSameAs(context);
+    assertThat(hostView.getContext()).isSameInstanceAs(context);
   }
 
   @Test
@@ -59,12 +59,12 @@
   public void createView_shouldSetViewsAppWidgetInfo() throws Exception {
     AppWidgetProviderInfo info = new AppWidgetProviderInfo();
     AppWidgetHostView hostView = appWidgetHost.createView(context, 0, info);
-    assertThat(hostView.getAppWidgetInfo()).isSameAs(info);
+    assertThat(hostView.getAppWidgetInfo()).isSameInstanceAs(info);
   }
 
   @Test
   public void createView_shouldSetHostViewsHost() throws Exception {
     AppWidgetHostView hostView = appWidgetHost.createView(context, 0, null);
-    assertThat(shadowOf(hostView).getHost()).isSameAs(appWidgetHost);
+    assertThat(shadowOf(hostView).getHost()).isSameInstanceAs(appWidgetHost);
   }
 }
diff --git a/robolectric/src/test/java/org/robolectric/shadows/ShadowAppWidgetHostViewTest.java b/robolectric/src/test/java/org/robolectric/shadows/ShadowAppWidgetHostViewTest.java
index 834ae37..cf17b45 100644
--- a/robolectric/src/test/java/org/robolectric/shadows/ShadowAppWidgetHostViewTest.java
+++ b/robolectric/src/test/java/org/robolectric/shadows/ShadowAppWidgetHostViewTest.java
@@ -33,7 +33,7 @@
   public void shouldKnowItsAppWidgetProviderInfo() throws Exception {
     AppWidgetProviderInfo providerInfo = new AppWidgetProviderInfo();
     appWidgetHostView.setAppWidget(0, providerInfo);
-    assertThat(appWidgetHostView.getAppWidgetInfo()).isSameAs(providerInfo);
+    assertThat(appWidgetHostView.getAppWidgetInfo()).isSameInstanceAs(providerInfo);
   }
 
   @Test
@@ -45,6 +45,6 @@
   public void shouldBeAbleToHaveHostSet() throws Exception {
     AppWidgetHost host = new AppWidgetHost(ApplicationProvider.getApplicationContext(), 0);
     shadowAppWidgetHostView.setHost(host);
-    assertThat(shadowAppWidgetHostView.getHost()).isSameAs(host);
+    assertThat(shadowAppWidgetHostView.getHost()).isSameInstanceAs(host);
   }
 }
diff --git a/robolectric/src/test/java/org/robolectric/shadows/ShadowApplicationTest.java b/robolectric/src/test/java/org/robolectric/shadows/ShadowApplicationTest.java
index e7ddc3b..65c7526 100644
--- a/robolectric/src/test/java/org/robolectric/shadows/ShadowApplicationTest.java
+++ b/robolectric/src/test/java/org/robolectric/shadows/ShadowApplicationTest.java
@@ -68,9 +68,9 @@
   @Test
   public void shouldBeAContext() throws Exception {
     assertThat(Robolectric.setupActivity(Activity.class).getApplication())
-        .isSameAs(ApplicationProvider.getApplicationContext());
+        .isSameInstanceAs(ApplicationProvider.getApplicationContext());
     assertThat(Robolectric.setupActivity(Activity.class).getApplication().getApplicationContext())
-        .isSameAs(ApplicationProvider.getApplicationContext());
+        .isSameInstanceAs(ApplicationProvider.getApplicationContext());
   }
 
   @Test
@@ -266,7 +266,7 @@
     context.bindService(expectedIntent, service, Context.BIND_AUTO_CREATE);
     context.unbindService(service);
     assertThat(shadowApplication.getUnboundServiceConnections()).hasSize(1);
-    assertThat(shadowApplication.getUnboundServiceConnections().get(0)).isSameAs(service);
+    assertThat(shadowApplication.getUnboundServiceConnections().get(0)).isSameInstanceAs(service);
   }
 
   @Test
@@ -526,7 +526,7 @@
     assertThat(context.bindService(new Intent("connect"), expectedServiceConnection, 0)).isTrue();
     assertThat(shadowApplication.getBoundServiceConnections()).hasSize(1);
     assertThat(shadowApplication.getBoundServiceConnections().get(0))
-        .isSameAs(expectedServiceConnection);
+        .isSameInstanceAs(expectedServiceConnection);
   }
 
   @Test
@@ -539,7 +539,7 @@
     assertThat(shadowApplication.getBoundServiceConnections()).hasSize(0);
     assertThat(context.bindService(serviceIntent, expectedServiceConnection, 0)).isFalse();
     assertThat(shadowApplication.getBoundServiceConnections()).hasSize(1);
-    assertThat(shadowApplication.getBoundServiceConnections().get(0)).isSameAs(expectedServiceConnection);
+    assertThat(shadowApplication.getBoundServiceConnections().get(0)).isSameInstanceAs(expectedServiceConnection);
   }
 
   @Test
@@ -554,14 +554,14 @@
     assertThat(shadowApplication.getBoundServiceConnections()).hasSize(0);
     assertThat(shadowApplication.getUnboundServiceConnections()).hasSize(1);
     assertThat(shadowApplication.getUnboundServiceConnections().get(0))
-        .isSameAs(expectedServiceConnection);
+        .isSameInstanceAs(expectedServiceConnection);
   }
 
   @Test
   public void getThreadScheduler_shouldMatchRobolectricValue() {
     final ShadowApplication shadowApplication = Shadows.shadowOf(context);
-    assertThat(shadowApplication.getForegroundThreadScheduler()).isSameAs(Robolectric.getForegroundThreadScheduler());
-    assertThat(shadowApplication.getBackgroundThreadScheduler()).isSameAs(Robolectric.getBackgroundThreadScheduler());
+    assertThat(shadowApplication.getForegroundThreadScheduler()).isSameInstanceAs(Robolectric.getForegroundThreadScheduler());
+    assertThat(shadowApplication.getBackgroundThreadScheduler()).isSameInstanceAs(Robolectric.getBackgroundThreadScheduler());
   }
 
   @Test
@@ -569,7 +569,7 @@
     Scheduler s = new Scheduler();
     RuntimeEnvironment.setMasterScheduler(s);
     final ShadowApplication shadowApplication = Shadows.shadowOf(context);
-    assertThat(shadowApplication.getForegroundThreadScheduler()).isSameAs(s);
+    assertThat(shadowApplication.getForegroundThreadScheduler()).isSameInstanceAs(s);
   }
 
   @Test
@@ -577,7 +577,7 @@
     Scheduler s = new Scheduler();
     RuntimeEnvironment.setMasterScheduler(s);
     final ShadowApplication shadowApplication = Shadows.shadowOf(context);
-    assertThat(shadowApplication.getBackgroundThreadScheduler()).isNotSameAs(RuntimeEnvironment.getMasterScheduler());
+    assertThat(shadowApplication.getBackgroundThreadScheduler()).isNotSameInstanceAs(RuntimeEnvironment.getMasterScheduler());
   }
 
   @Test
@@ -585,7 +585,7 @@
     Scheduler s = new Scheduler();
     RuntimeEnvironment.setMasterScheduler(s);
     final ShadowApplication shadowApplication = Shadows.shadowOf(context);
-    assertThat(shadowApplication.getBackgroundThreadScheduler()).isNotSameAs(s);
+    assertThat(shadowApplication.getBackgroundThreadScheduler()).isNotSameInstanceAs(s);
   }
 
   @Test
@@ -595,7 +595,7 @@
     pw.showAtLocation(new LinearLayout(context), Gravity.CENTER, 0, 0);
 
     PopupWindow latestPopupWindow = ShadowApplication.getInstance().getLatestPopupWindow();
-    assertThat(latestPopupWindow).isSameAs(pw);
+    assertThat(latestPopupWindow).isSameInstanceAs(pw);
   }
 
   /////////////////////////////
diff --git a/robolectric/src/test/java/org/robolectric/shadows/ShadowArrayAdapterTest.java b/robolectric/src/test/java/org/robolectric/shadows/ShadowArrayAdapterTest.java
index b50fbac..b90bc04 100644
--- a/robolectric/src/test/java/org/robolectric/shadows/ShadowArrayAdapterTest.java
+++ b/robolectric/src/test/java/org/robolectric/shadows/ShadowArrayAdapterTest.java
@@ -36,7 +36,7 @@
 
   @Test
   public void verifyContext() {
-    assertThat(arrayAdapter.getContext()).isSameAs(context);
+    assertThat(arrayAdapter.getContext()).isSameInstanceAs(context);
   }
 
   @Test
diff --git a/robolectric/src/test/java/org/robolectric/shadows/ShadowAudioManagerTest.java b/robolectric/src/test/java/org/robolectric/shadows/ShadowAudioManagerTest.java
index a369424..aa7086d 100644
--- a/robolectric/src/test/java/org/robolectric/shadows/ShadowAudioManagerTest.java
+++ b/robolectric/src/test/java/org/robolectric/shadows/ShadowAudioManagerTest.java
@@ -30,7 +30,7 @@
   public void requestAudioFocus_shouldRecordArgumentsOfMostRecentCall() {
     assertThat(shadowOf(audioManager).getLastAudioFocusRequest()).isNull();
     audioManager.requestAudioFocus(listener, 999, 888);
-    assertThat(shadowOf(audioManager).getLastAudioFocusRequest().listener).isSameAs(listener);
+    assertThat(shadowOf(audioManager).getLastAudioFocusRequest().listener).isSameInstanceAs(listener);
     assertThat(shadowOf(audioManager).getLastAudioFocusRequest().streamType).isEqualTo(999);
     assertThat(shadowOf(audioManager).getLastAudioFocusRequest().durationHint).isEqualTo(888);
     assertThat(shadowOf(audioManager).getLastAudioFocusRequest().audioFocusRequest).isNull();
@@ -88,7 +88,7 @@
     assertThat(shadowOf(audioManager).getLastAbandonedAudioFocusListener()).isNull();
 
     audioManager.abandonAudioFocus(listener);
-    assertThat(shadowOf(audioManager).getLastAbandonedAudioFocusListener()).isSameAs(listener);
+    assertThat(shadowOf(audioManager).getLastAbandonedAudioFocusListener()).isSameInstanceAs(listener);
   }
 
   @Test
@@ -97,7 +97,7 @@
     android.media.AudioFocusRequest request =
         new android.media.AudioFocusRequest.Builder(AudioManager.AUDIOFOCUS_GAIN).build();
     audioManager.abandonAudioFocusRequest(request);
-    assertThat(shadowOf(audioManager).getLastAbandonedAudioFocusRequest()).isSameAs(request);
+    assertThat(shadowOf(audioManager).getLastAbandonedAudioFocusRequest()).isSameInstanceAs(request);
   }
 
   @Test
diff --git a/robolectric/src/test/java/org/robolectric/shadows/ShadowBackupManagerTest.java b/robolectric/src/test/java/org/robolectric/shadows/ShadowBackupManagerTest.java
index ec3f289..9057c42 100644
--- a/robolectric/src/test/java/org/robolectric/shadows/ShadowBackupManagerTest.java
+++ b/robolectric/src/test/java/org/robolectric/shadows/ShadowBackupManagerTest.java
@@ -163,17 +163,9 @@
   }
 
   private static <T, F> Correspondence<T, F> fieldCorrespondence(String fieldName) {
-    return new Correspondence<T, F>() {
-      @Override
-      public boolean compare(T actual, F expected) {
-        return Objects.equals(ReflectionHelpers.getField(actual, fieldName), expected);
-      }
-
-      @Override
-      public String toString() {
-        return "field \"" + fieldName + "\" matches";
-      }
-    };
+    return Correspondence.from((T actual, F expected) -> {
+      return Objects.equals(ReflectionHelpers.getField(actual, fieldName), expected);
+    }, "field \"" + fieldName + "\" matches");
   }
 
   private static class TestRestoreObserver extends RestoreObserver {}
diff --git a/robolectric/src/test/java/org/robolectric/shadows/ShadowBinderTest.java b/robolectric/src/test/java/org/robolectric/shadows/ShadowBinderTest.java
index 009a495..e1ae406 100644
--- a/robolectric/src/test/java/org/robolectric/shadows/ShadowBinderTest.java
+++ b/robolectric/src/test/java/org/robolectric/shadows/ShadowBinderTest.java
@@ -21,8 +21,8 @@
     data.writeString("Hello Robolectric");
     assertTrue(testBinder.transact(2, data, reply, 3));
     assertThat(testBinder.code).isEqualTo(2);
-    assertThat(testBinder.data).isSameAs(data);
-    assertThat(testBinder.reply).isSameAs(reply);
+    assertThat(testBinder.data).isSameInstanceAs(data);
+    assertThat(testBinder.reply).isSameInstanceAs(reply);
     assertThat(testBinder.flags).isEqualTo(3);
     reply.readException();
     assertThat(reply.readString()).isEqualTo("Hello Robolectric");
diff --git a/robolectric/src/test/java/org/robolectric/shadows/ShadowBitmapDrawableTest.java b/robolectric/src/test/java/org/robolectric/shadows/ShadowBitmapDrawableTest.java
index 35aeb17..61cfd6c 100644
--- a/robolectric/src/test/java/org/robolectric/shadows/ShadowBitmapDrawableTest.java
+++ b/robolectric/src/test/java/org/robolectric/shadows/ShadowBitmapDrawableTest.java
@@ -48,7 +48,7 @@
   public void mutate_createsDeepCopy() throws Exception {
     BitmapDrawable original = (BitmapDrawable) resources.getDrawable(R.drawable.an_image);
     Drawable mutated = original.mutate();
-    assertThat(original).isNotSameAs(mutated);
+    assertThat(original).isNotSameInstanceAs(mutated);
     assertThat(mutated instanceof BitmapDrawable).isTrue();
     assertThat(mutated.getIntrinsicHeight()).isEqualTo(original.getIntrinsicHeight());
     assertThat(mutated.getIntrinsicWidth()).isEqualTo(original.getIntrinsicWidth());
diff --git a/robolectric/src/test/java/org/robolectric/shadows/ShadowBitmapTest.java b/robolectric/src/test/java/org/robolectric/shadows/ShadowBitmapTest.java
index eb23b46..00175d9 100644
--- a/robolectric/src/test/java/org/robolectric/shadows/ShadowBitmapTest.java
+++ b/robolectric/src/test/java/org/robolectric/shadows/ShadowBitmapTest.java
@@ -284,20 +284,20 @@
   public void bitmapsAreReused() {
     Bitmap b = Bitmap.createBitmap(10, 10, Bitmap.Config.ARGB_8888);
     Bitmap b1 = Bitmap.createBitmap(b, 0, 0, 10, 10);
-    assertThat(b1).isSameAs(b);
+    assertThat(b1).isSameInstanceAs(b);
     Bitmap b2 = Bitmap.createBitmap(b, 0, 0, 10, 10, null, false);
-    assertThat(b2).isSameAs(b);
+    assertThat(b2).isSameInstanceAs(b);
     Bitmap b3 = Bitmap.createScaledBitmap(b, 10, 10, false);
-    assertThat(b3).isSameAs(b);
+    assertThat(b3).isSameInstanceAs(b);
   }
 
   @Test
   public void equalsSizeTransformReturnsOriginal() {
     Bitmap b1 = Bitmap.createBitmap(10, 10, Bitmap.Config.ARGB_8888);
     Bitmap b2 = Bitmap.createBitmap(b1, 0, 0, 10, 10, null, false);
-    assertThat(b1).isSameAs(b2);
+    assertThat(b1).isSameInstanceAs(b2);
     Bitmap b3 = Bitmap.createBitmap(b1, 0, 0, 10, 10, null, true);
-    assertThat(b1).isSameAs(b3);
+    assertThat(b1).isSameInstanceAs(b3);
   }
 
   @Test(expected = IllegalArgumentException.class)
diff --git a/robolectric/src/test/java/org/robolectric/shadows/ShadowBluetoothManagerTest.java b/robolectric/src/test/java/org/robolectric/shadows/ShadowBluetoothManagerTest.java
index ec4d368..33164f1 100644
--- a/robolectric/src/test/java/org/robolectric/shadows/ShadowBluetoothManagerTest.java
+++ b/robolectric/src/test/java/org/robolectric/shadows/ShadowBluetoothManagerTest.java
@@ -21,6 +21,6 @@
 
   @Test
   public void getAdapter_shouldReturnBluetoothAdapter() {
-        assertThat(manager.getAdapter()).isSameAs(BluetoothAdapter.getDefaultAdapter());
+        assertThat(manager.getAdapter()).isSameInstanceAs(BluetoothAdapter.getDefaultAdapter());
     }
 }
diff --git a/robolectric/src/test/java/org/robolectric/shadows/ShadowCameraManagerTest.java b/robolectric/src/test/java/org/robolectric/shadows/ShadowCameraManagerTest.java
index d5213da..4c800d4 100644
--- a/robolectric/src/test/java/org/robolectric/shadows/ShadowCameraManagerTest.java
+++ b/robolectric/src/test/java/org/robolectric/shadows/ShadowCameraManagerTest.java
@@ -107,6 +107,6 @@
   public void testGetCameraCharacteristicsRecognizedCameraId() throws CameraAccessException {
     shadowOf(cameraManager).addCamera(CAMERA_ID_0, characteristics);
 
-    assertThat(cameraManager.getCameraCharacteristics(CAMERA_ID_0)).isSameAs(characteristics);
+    assertThat(cameraManager.getCameraCharacteristics(CAMERA_ID_0)).isSameInstanceAs(characteristics);
   }
 }
diff --git a/robolectric/src/test/java/org/robolectric/shadows/ShadowCameraTest.java b/robolectric/src/test/java/org/robolectric/shadows/ShadowCameraTest.java
index a7687e4..e919399 100644
--- a/robolectric/src/test/java/org/robolectric/shadows/ShadowCameraTest.java
+++ b/robolectric/src/test/java/org/robolectric/shadows/ShadowCameraTest.java
@@ -83,7 +83,7 @@
   public void testSetPreviewDisplay() throws Exception {
     SurfaceHolder previewSurfaceHolder = new TestSurfaceHolder();
     camera.setPreviewDisplay(previewSurfaceHolder);
-    assertThat(shadowCamera.getPreviewDisplay()).isSameAs(previewSurfaceHolder);
+    assertThat(shadowCamera.getPreviewDisplay()).isSameInstanceAs(previewSurfaceHolder);
   }
 
   @Test
@@ -117,7 +117,7 @@
     camera.setPreviewCallback(callback);
     shadowCamera.invokePreviewCallback("foobar".getBytes(UTF_8));
 
-    assertThat(callback.camera).isSameAs(camera);
+    assertThat(callback.camera).isSameInstanceAs(camera);
     assertThat(callback.data).isEqualTo("foobar".getBytes(UTF_8));
   }
 
@@ -130,7 +130,7 @@
     camera.setOneShotPreviewCallback(callback);
     shadowCamera.invokePreviewCallback("foobar".getBytes(UTF_8));
 
-    assertThat(callback.camera).isSameAs(camera);
+    assertThat(callback.camera).isSameInstanceAs(camera);
     assertThat(callback.data).isEqualTo("foobar".getBytes(UTF_8));
   }
 
@@ -143,7 +143,7 @@
     camera.setPreviewCallbackWithBuffer(callback);
     shadowCamera.invokePreviewCallback("foobar".getBytes(UTF_8));
 
-    assertThat(callback.camera).isSameAs(camera);
+    assertThat(callback.camera).isSameInstanceAs(camera);
     assertThat(callback.data).isEqualTo("foobar".getBytes(UTF_8));
   }
 
diff --git a/robolectric/src/test/java/org/robolectric/shadows/ShadowCanvasTest.java b/robolectric/src/test/java/org/robolectric/shadows/ShadowCanvasTest.java
index 6aae0dd..c6ee368 100644
--- a/robolectric/src/test/java/org/robolectric/shadows/ShadowCanvasTest.java
+++ b/robolectric/src/test/java/org/robolectric/shadows/ShadowCanvasTest.java
@@ -274,12 +274,12 @@
     assertThat(shadowCanvas.getDrawnCircle(0).centerX).isEqualTo(1.0f);
     assertThat(shadowCanvas.getDrawnCircle(0).centerY).isEqualTo(2.0f);
     assertThat(shadowCanvas.getDrawnCircle(0).radius).isEqualTo(3.0f);
-    assertThat(shadowCanvas.getDrawnCircle(0).paint).isSameAs(paint0);
+    assertThat(shadowCanvas.getDrawnCircle(0).paint).isSameInstanceAs(paint0);
 
     assertThat(shadowCanvas.getDrawnCircle(1).centerX).isEqualTo(4.0f);
     assertThat(shadowCanvas.getDrawnCircle(1).centerY).isEqualTo(5.0f);
     assertThat(shadowCanvas.getDrawnCircle(1).radius).isEqualTo(6.0f);
-    assertThat(shadowCanvas.getDrawnCircle(1).paint).isSameAs(paint1);
+    assertThat(shadowCanvas.getDrawnCircle(1).paint).isSameInstanceAs(paint1);
   }
 
   @Test
@@ -297,13 +297,13 @@
     assertThat(shadowCanvas.getDrawnArc(0).startAngle).isEqualTo(1f);
     assertThat(shadowCanvas.getDrawnArc(0).sweepAngle).isEqualTo(2f);
     assertThat(shadowCanvas.getDrawnArc(0).useCenter).isTrue();
-    assertThat(shadowCanvas.getDrawnArc(0).paint).isSameAs(paint0);
+    assertThat(shadowCanvas.getDrawnArc(0).paint).isSameInstanceAs(paint0);
 
     assertThat(shadowCanvas.getDrawnArc(1).oval).isEqualTo(oval1);
     assertThat(shadowCanvas.getDrawnArc(1).startAngle).isEqualTo(3f);
     assertThat(shadowCanvas.getDrawnArc(1).sweepAngle).isEqualTo(4f);
     assertThat(shadowCanvas.getDrawnArc(1).useCenter).isFalse();
-    assertThat(shadowCanvas.getDrawnArc(1).paint).isSameAs(paint1);
+    assertThat(shadowCanvas.getDrawnArc(1).paint).isSameInstanceAs(paint1);
   }
 
   @Test
diff --git a/robolectric/src/test/java/org/robolectric/shadows/ShadowConnectivityManagerTest.java b/robolectric/src/test/java/org/robolectric/shadows/ShadowConnectivityManagerTest.java
index 40d3af2..7192b3c 100644
--- a/robolectric/src/test/java/org/robolectric/shadows/ShadowConnectivityManagerTest.java
+++ b/robolectric/src/test/java/org/robolectric/shadows/ShadowConnectivityManagerTest.java
@@ -93,7 +93,7 @@
     shadowOf(connectivityManager).addNetwork(vpnNetwork, vpnNetworkInfo);
 
     NetworkInfo returnedNetworkInfo = connectivityManager.getNetworkInfo(vpnNetwork);
-    assertThat(returnedNetworkInfo).isSameAs(vpnNetworkInfo);
+    assertThat(returnedNetworkInfo).isSameInstanceAs(vpnNetworkInfo);
   }
 
   @Test @Config(minSdk = LOLLIPOP)
@@ -251,10 +251,10 @@
     assertThat(networks).asList().hasSize(1);
 
     Network returnedNetwork = networks[0];
-    assertThat(returnedNetwork).isSameAs(vpnNetwork);
+    assertThat(returnedNetwork).isSameInstanceAs(vpnNetwork);
 
     NetworkInfo returnedNetworkInfo = connectivityManager.getNetworkInfo(returnedNetwork);
-    assertThat(returnedNetworkInfo).isSameAs(vpnNetworkInfo);
+    assertThat(returnedNetworkInfo).isSameInstanceAs(vpnNetworkInfo);
   }
 
   @Test @Config(minSdk = LOLLIPOP)
@@ -390,7 +390,7 @@
   public void bindProcessToNetwork_shouldGetBoundNetworkForProcess() {
     Network network = ShadowNetwork.newInstance(789);
     connectivityManager.bindProcessToNetwork(network);
-    assertThat(connectivityManager.getBoundNetworkForProcess()).isSameAs(network);
+    assertThat(connectivityManager.getBoundNetworkForProcess()).isSameInstanceAs(network);
   }
 
   @Test
diff --git a/robolectric/src/test/java/org/robolectric/shadows/ShadowContentObserverTest.java b/robolectric/src/test/java/org/robolectric/shadows/ShadowContentObserverTest.java
index f51c7c8..8eaa292 100644
--- a/robolectric/src/test/java/org/robolectric/shadows/ShadowContentObserverTest.java
+++ b/robolectric/src/test/java/org/robolectric/shadows/ShadowContentObserverTest.java
@@ -31,7 +31,7 @@
 
     assertThat(observer.changed).isTrue();
     assertThat(observer.selfChange).isTrue();
-    assertThat(observer.uri).isSameAs(uri);
+    assertThat(observer.uri).isSameInstanceAs(uri);
   }
 
   @Test
diff --git a/robolectric/src/test/java/org/robolectric/shadows/ShadowContentResolverTest.java b/robolectric/src/test/java/org/robolectric/shadows/ShadowContentResolverTest.java
index 1cb403c..9b693ac 100644
--- a/robolectric/src/test/java/org/robolectric/shadows/ShadowContentResolverTest.java
+++ b/robolectric/src/test/java/org/robolectric/shadows/ShadowContentResolverTest.java
@@ -202,7 +202,7 @@
     assertThat(shadowContentResolver.query(null, null, null, null, null)).isNull();
     BaseCursor cursor = new BaseCursor();
     shadowContentResolver.setCursor(cursor);
-    assertThat((BaseCursor) shadowContentResolver.query(null, null, null, null, null)).isSameAs(cursor);
+    assertThat((BaseCursor) shadowContentResolver.query(null, null, null, null, null)).isSameInstanceAs(cursor);
   }
 
   @Test
@@ -210,7 +210,7 @@
     assertThat(shadowContentResolver.query(null, null, null, null, null, new CancellationSignal())).isNull();
     BaseCursor cursor = new BaseCursor();
     shadowContentResolver.setCursor(cursor);
-    assertThat((BaseCursor) shadowContentResolver.query(null, null, null, null, null, new CancellationSignal())).isSameAs(cursor);
+    assertThat((BaseCursor) shadowContentResolver.query(null, null, null, null, null, new CancellationSignal())).isSameInstanceAs(cursor);
   }
 
   @Test
@@ -223,8 +223,8 @@
     shadowContentResolver.setCursor(uri21, cursor21);
     shadowContentResolver.setCursor(uri22, cursor22);
 
-    assertThat((BaseCursor) shadowContentResolver.query(uri21, null, null, null, null)).isSameAs(cursor21);
-    assertThat((BaseCursor) shadowContentResolver.query(uri22, null, null, null, null)).isSameAs(cursor22);
+    assertThat((BaseCursor) shadowContentResolver.query(uri21, null, null, null, null)).isSameInstanceAs(cursor21);
+    assertThat((BaseCursor) shadowContentResolver.query(uri22, null, null, null, null)).isSameInstanceAs(cursor22);
   }
 
   @Test
@@ -256,14 +256,14 @@
     ContentProvider cp = mock(ContentProvider.class);
     ShadowContentResolver.registerProviderInternal(AUTHORITY, cp);
     final Uri uri = Uri.parse("content://" + AUTHORITY);
-    assertThat(contentResolver.acquireUnstableProvider(uri)).isSameAs(cp.getIContentProvider());
+    assertThat(contentResolver.acquireUnstableProvider(uri)).isSameInstanceAs(cp.getIContentProvider());
   }
 
   @Test
   public void acquireUnstableProvider_shouldReturnWithString() {
     ContentProvider cp = mock(ContentProvider.class);
     ShadowContentResolver.registerProviderInternal(AUTHORITY, cp);
-    assertThat(contentResolver.acquireUnstableProvider(AUTHORITY)).isSameAs(cp.getIContentProvider());
+    assertThat(contentResolver.acquireUnstableProvider(AUTHORITY)).isSameInstanceAs(cp.getIContentProvider());
   }
 
   @Test
@@ -767,21 +767,21 @@
     Uri uri = Uri.parse("content://" + AUTHORITY + "/whatever");
     contentResolver.takePersistableUriPermission(uri, Intent.FLAG_GRANT_READ_URI_PERMISSION);
     assertThat(permissions).hasSize(1);
-    assertThat(permissions.get(0).getUri()).isSameAs(uri);
+    assertThat(permissions.get(0).getUri()).isSameInstanceAs(uri);
     assertThat(permissions.get(0).isReadPermission()).isTrue();
     assertThat(permissions.get(0).isWritePermission()).isFalse();
 
     // Take the write permission for the uri.
     contentResolver.takePersistableUriPermission(uri, Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
     assertThat(permissions).hasSize(1);
-    assertThat(permissions.get(0).getUri()).isSameAs(uri);
+    assertThat(permissions.get(0).getUri()).isSameInstanceAs(uri);
     assertThat(permissions.get(0).isReadPermission()).isTrue();
     assertThat(permissions.get(0).isWritePermission()).isTrue();
 
     // Release the read permission for the uri.
     contentResolver.releasePersistableUriPermission(uri, Intent.FLAG_GRANT_READ_URI_PERMISSION);
     assertThat(permissions).hasSize(1);
-    assertThat(permissions.get(0).getUri()).isSameAs(uri);
+    assertThat(permissions.get(0).getUri()).isSameInstanceAs(uri);
     assertThat(permissions.get(0).isReadPermission()).isFalse();
     assertThat(permissions.get(0).isWritePermission()).isTrue();
 
diff --git a/robolectric/src/test/java/org/robolectric/shadows/ShadowContextWrapperTest.java b/robolectric/src/test/java/org/robolectric/shadows/ShadowContextWrapperTest.java
index 3ccd80c..26c6cf5 100644
--- a/robolectric/src/test/java/org/robolectric/shadows/ShadowContextWrapperTest.java
+++ b/robolectric/src/test/java/org/robolectric/shadows/ShadowContextWrapperTest.java
@@ -423,17 +423,17 @@
   @Test
   public void shouldReturnSameApplicationEveryTime() throws Exception {
     Activity activity = new Activity();
-    assertThat(activity.getApplication()).isSameAs(activity.getApplication());
+    assertThat(activity.getApplication()).isSameInstanceAs(activity.getApplication());
 
-    assertThat(activity.getApplication()).isSameAs(new Activity().getApplication());
+    assertThat(activity.getApplication()).isSameInstanceAs(new Activity().getApplication());
   }
 
   @Test
   public void shouldReturnSameApplicationContextEveryTime() throws Exception {
     Activity activity = Robolectric.setupActivity(Activity.class);
-    assertThat(activity.getApplicationContext()).isSameAs(activity.getApplicationContext());
+    assertThat(activity.getApplicationContext()).isSameInstanceAs(activity.getApplicationContext());
 
-    assertThat(activity.getApplicationContext()).isSameAs(Robolectric.setupActivity(Activity.class).getApplicationContext());
+    assertThat(activity.getApplicationContext()).isSameInstanceAs(Robolectric.setupActivity(Activity.class).getApplicationContext());
   }
 
   @Test
@@ -449,9 +449,9 @@
   @Test
   public void shouldReturnSameContentResolverEveryTime() throws Exception {
     Activity activity = Robolectric.setupActivity(Activity.class);
-    assertThat(activity.getContentResolver()).isSameAs(activity.getContentResolver());
+    assertThat(activity.getContentResolver()).isSameInstanceAs(activity.getContentResolver());
 
-    assertThat(activity.getContentResolver()).isSameAs(Robolectric.setupActivity(Activity.class).getContentResolver());
+    assertThat(activity.getContentResolver()).isSameInstanceAs(Robolectric.setupActivity(Activity.class).getContentResolver());
   }
 
   @Test
@@ -539,8 +539,8 @@
   private void assertSameInstanceEveryTime(String serviceName) {
     Activity activity1 = buildActivity(Activity.class).create().get();
     Activity activity2 = buildActivity(Activity.class).create().get();
-    assertThat(activity1.getSystemService(serviceName)).isSameAs(activity1.getSystemService(serviceName));
-    assertThat(activity1.getSystemService(serviceName)).isSameAs(activity2.getSystemService(serviceName));
+    assertThat(activity1.getSystemService(serviceName)).isSameInstanceAs(activity1.getSystemService(serviceName));
+    assertThat(activity1.getSystemService(serviceName)).isSameInstanceAs(activity2.getSystemService(serviceName));
   }
 
   @Test
@@ -635,7 +635,7 @@
     final SharedPreferences pref1 = contextWrapper.getSharedPreferences("pref", Context.MODE_PRIVATE);
     final SharedPreferences pref2 = contextWrapper.getSharedPreferences("pref", Context.MODE_PRIVATE);
 
-    assertThat(pref1).isSameAs(pref2);
+    assertThat(pref1).isSameInstanceAs(pref2);
   }
 
   @Test
@@ -643,7 +643,7 @@
     final SharedPreferences pref1 = contextWrapper.getSharedPreferences("pref1", Context.MODE_PRIVATE);
     final SharedPreferences pref2 = contextWrapper.getSharedPreferences("pref2", Context.MODE_PRIVATE);
 
-    assertThat(pref1).isNotSameAs(pref2);
+    assertThat(pref1).isNotSameInstanceAs(pref2);
   }
 
   @Test
diff --git a/robolectric/src/test/java/org/robolectric/shadows/ShadowCookieManagerTest.java b/robolectric/src/test/java/org/robolectric/shadows/ShadowCookieManagerTest.java
index 79fb9b4..f1363b9 100644
--- a/robolectric/src/test/java/org/robolectric/shadows/ShadowCookieManagerTest.java
+++ b/robolectric/src/test/java/org/robolectric/shadows/ShadowCookieManagerTest.java
@@ -17,7 +17,7 @@
   @Test
   public void shouldGetASingletonInstance() {
     assertThat(CookieManager.getInstance()).isNotNull();
-    assertThat(CookieManager.getInstance()).isSameAs(CookieManager.getInstance());
+    assertThat(CookieManager.getInstance()).isSameInstanceAs(CookieManager.getInstance());
   }
 
   @Test
diff --git a/robolectric/src/test/java/org/robolectric/shadows/ShadowCrossProfileAppsTest.java b/robolectric/src/test/java/org/robolectric/shadows/ShadowCrossProfileAppsTest.java
index cae9151..cd83bd1 100644
--- a/robolectric/src/test/java/org/robolectric/shadows/ShadowCrossProfileAppsTest.java
+++ b/robolectric/src/test/java/org/robolectric/shadows/ShadowCrossProfileAppsTest.java
@@ -296,7 +296,7 @@
     StartedActivity startedActivity = shadowOf(crossProfileApps).peekNextStartedActivity();
 
     assertThat(startedActivity).isEqualTo(new StartedActivity(component, userHandle1));
-    assertThat(shadowOf(crossProfileApps).peekNextStartedActivity()).isSameAs(startedActivity);
+    assertThat(shadowOf(crossProfileApps).peekNextStartedActivity()).isSameInstanceAs(startedActivity);
   }
 
   @Test
diff --git a/robolectric/src/test/java/org/robolectric/shadows/ShadowCursorAdapterTest.java b/robolectric/src/test/java/org/robolectric/shadows/ShadowCursorAdapterTest.java
index 2f3f4f8..d31912f 100644
--- a/robolectric/src/test/java/org/robolectric/shadows/ShadowCursorAdapterTest.java
+++ b/robolectric/src/test/java/org/robolectric/shadows/ShadowCursorAdapterTest.java
@@ -46,7 +46,7 @@
   @Test
   public void testChangeCursor() {
     assertThat(adapter.getCursor()).isNotNull();
-    assertThat(adapter.getCursor()).isSameAs(curs);
+    assertThat(adapter.getCursor()).isSameInstanceAs(curs);
 
     adapter.changeCursor(null);
 
@@ -57,11 +57,11 @@
   @Test
   public void testSwapCursor() {
     assertThat(adapter.getCursor()).isNotNull();
-    assertThat(adapter.getCursor()).isSameAs(curs);
+    assertThat(adapter.getCursor()).isSameInstanceAs(curs);
 
     Cursor oldCursor = adapter.swapCursor(null);
 
-    assertThat(oldCursor).isSameAs(curs);
+    assertThat(oldCursor).isSameInstanceAs(curs);
     assertThat(curs.isClosed()).isFalse();
     assertThat(adapter.getCursor()).isNull();
   }
@@ -83,7 +83,7 @@
   @Test public void shouldNotErrorOnCursorChangeWhenNoFlagsAreSet() throws Exception {
     adapter = new TestAdapterWithFlags(curs, 0);
     adapter.changeCursor(database.rawQuery("SELECT * FROM table_name;", null));
-    assertThat(adapter.getCursor()).isNotSameAs(curs);
+    assertThat(adapter.getCursor()).isNotSameInstanceAs(curs);
   }
 
   private static class TestAdapter extends CursorAdapter {
diff --git a/robolectric/src/test/java/org/robolectric/shadows/ShadowCursorWrapperTest.java b/robolectric/src/test/java/org/robolectric/shadows/ShadowCursorWrapperTest.java
index 786b35d..78bbe8f 100644
--- a/robolectric/src/test/java/org/robolectric/shadows/ShadowCursorWrapperTest.java
+++ b/robolectric/src/test/java/org/robolectric/shadows/ShadowCursorWrapperTest.java
@@ -104,7 +104,7 @@
     CursorWrapper cursorWrapper = new CursorWrapper(mockCursor);
     ShadowCursorWrapper shadow = Shadows.shadowOf(cursorWrapper);
 
-    assertThat(shadow.getWrappedCursor()).isSameAs(mockCursor);
+    assertThat(shadow.getWrappedCursor()).isSameInstanceAs(mockCursor);
   }
 
 }
diff --git a/robolectric/src/test/java/org/robolectric/shadows/ShadowDialogTest.java b/robolectric/src/test/java/org/robolectric/shadows/ShadowDialogTest.java
index 9c8805c..0c68e19 100644
--- a/robolectric/src/test/java/org/robolectric/shadows/ShadowDialogTest.java
+++ b/robolectric/src/test/java/org/robolectric/shadows/ShadowDialogTest.java
@@ -44,7 +44,7 @@
     dialog.show();
     dialog.setOnDismissListener(
         dialogInListener -> {
-          assertThat(dialogInListener).isSameAs(dialog);
+          assertThat(dialogInListener).isSameInstanceAs(dialog);
           transcript.add("onDismiss called!");
         });
 
@@ -141,7 +141,7 @@
 
     Dialog dialog = new Dialog(context);
     dialog.show();
-    assertThat(ShadowDialog.getLatestDialog()).isSameAs(dialog);
+    assertThat(ShadowDialog.getLatestDialog()).isSameInstanceAs(dialog);
   }
 
   @Test
@@ -195,7 +195,7 @@
     Dialog dialog = new Dialog(context);
     DialogInterface.OnCancelListener onCancelListener = dialog1 -> {};
     dialog.setOnCancelListener(onCancelListener);
-    assertThat(onCancelListener).isSameAs(shadowOf(dialog).getOnCancelListener());
+    assertThat(onCancelListener).isSameInstanceAs(shadowOf(dialog).getOnCancelListener());
   }
 
   private static class TestDialog extends Dialog {
diff --git a/robolectric/src/test/java/org/robolectric/shadows/ShadowHandlerTest.java b/robolectric/src/test/java/org/robolectric/shadows/ShadowHandlerTest.java
index ac8d3a2..c8f6f05 100644
--- a/robolectric/src/test/java/org/robolectric/shadows/ShadowHandlerTest.java
+++ b/robolectric/src/test/java/org/robolectric/shadows/ShadowHandlerTest.java
@@ -1,6 +1,7 @@
 package org.robolectric.shadows;
 
 import static com.google.common.truth.Truth.assertThat;
+import static com.google.common.truth.Truth.assertWithMessage;
 import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertTrue;
 import static org.robolectric.Shadows.shadowOf;
@@ -376,12 +377,12 @@
     handler.sendMessageDelayed(msg, 200);
     handler.removeMessages(123);
     Message newMsg = handler.obtainMessage(123);
-    assertThat(newMsg).named("new message").isSameAs(msg);
+    assertWithMessage("new message").that(newMsg).isSameInstanceAs(msg);
     handler.sendMessageDelayed(newMsg, 400);
     ShadowLooper.runUiThreadTasksIncludingDelayedTasks();
     // Original implementation had a bug which caused reused messages to still
     // be invoked at their original post time.
-    assertThat(runAt).named("handledAt").containsExactly(startTime + 400L);
+    assertWithMessage("handledAt").that(runAt).containsExactly(startTime + 400L);
   }
 
   @Test
@@ -400,8 +401,8 @@
     handler.removeCallbacksAndMessages(null);
     ShadowLooper.runUiThreadTasksIncludingDelayedTasks();
 
-    assertThat(wasRun[0]).named("Message").isFalse();
-    assertThat(scratchRunnable.wasRun).named("Callback").isFalse();
+    assertWithMessage("Message").that(wasRun[0]).isFalse();
+    assertWithMessage("Callback").that(scratchRunnable.wasRun).isFalse();
   }
 
   @Test
@@ -449,10 +450,10 @@
     handler.removeCallbacks(r, tag2);
     ShadowLooper.unPauseMainLooper();
 
-    assertThat(count[0]).named("run count").isEqualTo(1);
+    assertWithMessage("run count").that(count[0]).isEqualTo(1);
     // This assertion proves that it was the first runnable that ran,
     // which proves that the correctly tagged runnable was removed.
-    assertThat(shadowOf(handler.getLooper()).getScheduler().getCurrentTime()).named("currentTime").isEqualTo(100);
+    assertWithMessage("currentTime").that(shadowOf(handler.getLooper()).getScheduler().getCurrentTime()).isEqualTo(100);
   }
 
   @Test
@@ -500,7 +501,7 @@
     h.sendEmptyMessageDelayed(0, 12000L);
     Robolectric.getForegroundThreadScheduler().advanceToLastPostedRunnable();
 
-    assertThat(whens).named("whens").containsExactly(startTime, startTime + 4000, startTime + 16000);
+    assertWithMessage("whens").that(whens).containsExactly(startTime, startTime + 4000, startTime + 16000);
   }
 
   @Test
diff --git a/robolectric/src/test/java/org/robolectric/shadows/ShadowHttpResponseCacheTest.java b/robolectric/src/test/java/org/robolectric/shadows/ShadowHttpResponseCacheTest.java
index 48ee231..26e88fb 100644
--- a/robolectric/src/test/java/org/robolectric/shadows/ShadowHttpResponseCacheTest.java
+++ b/robolectric/src/test/java/org/robolectric/shadows/ShadowHttpResponseCacheTest.java
@@ -29,7 +29,7 @@
     assertThat(HttpResponseCache.getInstalled()).isNull();
     HttpResponseCache cache = HttpResponseCache.install(File.createTempFile("foo", "bar"), 42);
     HttpResponseCache installed = HttpResponseCache.getInstalled();
-    assertThat(installed).isSameAs(cache);
+    assertThat(installed).isSameInstanceAs(cache);
     assertThat(installed.maxSize()).isEqualTo(42);
   }
 
diff --git a/robolectric/src/test/java/org/robolectric/shadows/ShadowIntentTest.java b/robolectric/src/test/java/org/robolectric/shadows/ShadowIntentTest.java
index d54b48b..6fd6db6 100644
--- a/robolectric/src/test/java/org/robolectric/shadows/ShadowIntentTest.java
+++ b/robolectric/src/test/java/org/robolectric/shadows/ShadowIntentTest.java
@@ -348,7 +348,7 @@
     assertThat(chooserIntent.getAction()).isEqualTo(Intent.ACTION_CHOOSER);
     assertThat(chooserIntent.getStringExtra(Intent.EXTRA_TITLE)).isEqualTo("The title");
     assertThat((Intent) chooserIntent.getParcelableExtra(Intent.EXTRA_INTENT))
-        .isSameAs(originalIntent);
+        .isSameInstanceAs(originalIntent);
   }
 
   @Test
diff --git a/robolectric/src/test/java/org/robolectric/shadows/ShadowLayoutInflaterTest.java b/robolectric/src/test/java/org/robolectric/shadows/ShadowLayoutInflaterTest.java
index b132e43..33b9735 100644
--- a/robolectric/src/test/java/org/robolectric/shadows/ShadowLayoutInflaterTest.java
+++ b/robolectric/src/test/java/org/robolectric/shadows/ShadowLayoutInflaterTest.java
@@ -1,6 +1,7 @@
 package org.robolectric.shadows;
 
 import static com.google.common.truth.Truth.assertThat;
+import static com.google.common.truth.Truth.assertWithMessage;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertNotNull;
@@ -406,9 +407,8 @@
       exception = e;
     }
     assertNotNull(exception);
-    assertThat(exception.getMessage())
-        .named("The error message should contain the id name of the faulty button")
-        .contains("invalid_onclick_button");
+    assertWithMessage("The error message should contain the id name of the faulty button")
+        .that(exception.getMessage()).contains("invalid_onclick_button");
   }
 
   @Test
diff --git a/robolectric/src/test/java/org/robolectric/shadows/ShadowListPopupWindowTest.java b/robolectric/src/test/java/org/robolectric/shadows/ShadowListPopupWindowTest.java
index 55362f2..5f1a68b 100644
--- a/robolectric/src/test/java/org/robolectric/shadows/ShadowListPopupWindowTest.java
+++ b/robolectric/src/test/java/org/robolectric/shadows/ShadowListPopupWindowTest.java
@@ -19,6 +19,6 @@
     assertThat(ShadowListPopupWindow.getLatestListPopupWindow()).isNull();
     popupWindow.setAnchorView(new View(context));
     popupWindow.show();
-    assertThat(ShadowListPopupWindow.getLatestListPopupWindow()).isSameAs(popupWindow);
+    assertThat(ShadowListPopupWindow.getLatestListPopupWindow()).isSameInstanceAs(popupWindow);
   }
 }
diff --git a/robolectric/src/test/java/org/robolectric/shadows/ShadowListPreferenceTest.java b/robolectric/src/test/java/org/robolectric/shadows/ShadowListPreferenceTest.java
index 36a6f2f..93e6b45 100644
--- a/robolectric/src/test/java/org/robolectric/shadows/ShadowListPreferenceTest.java
+++ b/robolectric/src/test/java/org/robolectric/shadows/ShadowListPreferenceTest.java
@@ -27,7 +27,7 @@
 
     assertThat(listPreference.getEntries()).isNull();
     listPreference.setEntries(entries);
-    assertThat(listPreference.getEntries()).isSameAs(entries);
+    assertThat(listPreference.getEntries()).isSameInstanceAs(entries);
   }
 
   @Test
@@ -43,7 +43,7 @@
 
     assertThat(listPreference.getEntryValues()).isNull();
     listPreference.setEntryValues(entryValues);
-    assertThat(listPreference.getEntryValues()).isSameAs(entryValues);
+    assertThat(listPreference.getEntryValues()).isSameInstanceAs(entryValues);
   }
 
   @Test
diff --git a/robolectric/src/test/java/org/robolectric/shadows/ShadowListViewTest.java b/robolectric/src/test/java/org/robolectric/shadows/ShadowListViewTest.java
index e1745db..d3ac383 100644
--- a/robolectric/src/test/java/org/robolectric/shadows/ShadowListViewTest.java
+++ b/robolectric/src/test/java/org/robolectric/shadows/ShadowListViewTest.java
@@ -60,10 +60,10 @@
     listView.addHeaderView(view3, null, false);
     listView.setAdapter(new ShadowCountingAdapter(2));
     assertThat(listView.getHeaderViewsCount()).isEqualTo(4);
-    assertThat(shadowOf(listView).getHeaderViews().get(0)).isSameAs(view0);
-    assertThat(shadowOf(listView).getHeaderViews().get(1)).isSameAs(view1);
-    assertThat(shadowOf(listView).getHeaderViews().get(2)).isSameAs(view2);
-    assertThat(shadowOf(listView).getHeaderViews().get(3)).isSameAs(view3);
+    assertThat(shadowOf(listView).getHeaderViews().get(0)).isSameInstanceAs(view0);
+    assertThat(shadowOf(listView).getHeaderViews().get(1)).isSameInstanceAs(view1);
+    assertThat(shadowOf(listView).getHeaderViews().get(2)).isSameInstanceAs(view2);
+    assertThat(shadowOf(listView).getHeaderViews().get(3)).isSameInstanceAs(view3);
 
     assertThat((View) listView.findViewById(0)).isNotNull();
     assertThat((View) listView.findViewById(1)).isNotNull();
@@ -78,7 +78,7 @@
 
     listView.addHeaderView(view);
 
-    assertThat((View) listView.findViewById(42)).isSameAs(view);
+    assertThat((View) listView.findViewById(42)).isSameInstanceAs(view);
   }
 
   @Test
@@ -88,8 +88,8 @@
     listView.addFooterView(view0);
     listView.addFooterView(view1);
     listView.setAdapter(new ShadowCountingAdapter(3));
-    assertThat(shadowOf(listView).getFooterViews().get(0)).isSameAs(view0);
-    assertThat(shadowOf(listView).getFooterViews().get(1)).isSameAs(view1);
+    assertThat(shadowOf(listView).getFooterViews().get(0)).isSameInstanceAs(view0);
+    assertThat(shadowOf(listView).getFooterViews().get(1)).isSameInstanceAs(view1);
   }
 
   @Test
@@ -99,7 +99,7 @@
 
     listView.addFooterView(view);
 
-    assertThat((View) listView.findViewById(42)).isSameAs(view);
+    assertThat((View) listView.findViewById(42)).isSameInstanceAs(view);
   }
 
   @Test
@@ -112,8 +112,8 @@
     prepareListWithThreeItems();
 
     assertThat(listView.getChildCount()).isEqualTo(5);
-    assertThat(listView.getChildAt(0)).isSameAs(header);
-    assertThat(listView.getChildAt(4)).isSameAs(footer);
+    assertThat(listView.getChildAt(0)).isSameInstanceAs(header);
+    assertThat(listView.getChildAt(4)).isSameInstanceAs(footer);
   }
 
   @Test
@@ -156,7 +156,7 @@
   public void findItemContainingText_shouldFindChildByString() throws Exception {
     ShadowListView shadowListView = prepareListWithThreeItems();
     View item1 = shadowListView.findItemContainingText("Item 1");
-    assertThat(item1).isSameAs(listView.getChildAt(1));
+    assertThat(item1).isSameInstanceAs(listView.getChildAt(1));
   }
 
   @Test
diff --git a/robolectric/src/test/java/org/robolectric/shadows/ShadowLocaleDataTest.java b/robolectric/src/test/java/org/robolectric/shadows/ShadowLocaleDataTest.java
index 7df2e90..0ae09f9 100644
--- a/robolectric/src/test/java/org/robolectric/shadows/ShadowLocaleDataTest.java
+++ b/robolectric/src/test/java/org/robolectric/shadows/ShadowLocaleDataTest.java
@@ -61,9 +61,6 @@
     assertThat(localeData.infinity).isEqualTo("∞");
     assertThat(localeData.NaN).isEqualTo("NaN");
 
-    assertThat(localeData.currencySymbol).isEqualTo("$");
-    assertThat(localeData.internationalCurrencySymbol).isEqualTo("USD");
-
     assertThat(localeData.numberPattern).isEqualTo("#,##0.###");
     assertThat(localeData.integerPattern).isEqualTo("#,##0");
     assertThat(localeData.currencyPattern).isEqualTo("¤#,##0.00;(¤#,##0.00)");
@@ -71,6 +68,30 @@
   }
 
   @Test
+  @Config(maxSdk = Build.VERSION_CODES.Q)
+  public void shouldSupportLocaleEn_US_yesterday() throws Exception {
+    LocaleData localeData = LocaleData.get(Locale.US);
+      String currencySymbolValue = ReflectionHelpers.getField(localeData, "yesterday");
+      assertThat(currencySymbolValue).isEqualTo("Yesterday");
+  }
+
+  @Test
+  @Config(maxSdk = Build.VERSION_CODES.Q)
+  public void shouldSupportLocaleEn_US_currencySymbol() throws Exception {
+    LocaleData localeData = LocaleData.get(Locale.US);
+    String currencySymbolValue = ReflectionHelpers.getField(localeData, "currencySymbol");
+    assertThat(currencySymbolValue).isEqualTo("$");
+  }
+
+  @Test
+  @Config(maxSdk = Build.VERSION_CODES.Q)
+  public void shouldSupportLocaleEn_US_internationalCurrencySymbol() throws Exception {
+      LocaleData localeData = LocaleData.get(Locale.US);
+      String internationalCurrencySymbolValue = ReflectionHelpers.getField(localeData, "internationalCurrencySymbol");
+      assertThat(internationalCurrencySymbolValue).isEqualTo("USD");
+  }
+
+  @Test
   @Config(maxSdk = Build.VERSION_CODES.O)
   public void shouldSupportLocaleEn_US_perMill() throws Exception {
     LocaleData localeData = LocaleData.get(Locale.US);
@@ -102,7 +123,6 @@
     assertThat(localeData.tinyWeekdayNames).isEqualTo(new String[]{"", "S", "M", "T", "W", "T", "F", "S"});
     assertThat(localeData.tinyStandAloneWeekdayNames).isEqualTo(localeData.tinyWeekdayNames);
 
-    assertThat(localeData.yesterday).isEqualTo("Yesterday");
     assertThat(localeData.today).isEqualTo("Today");
     assertThat(localeData.tomorrow).isEqualTo("Tomorrow");
   }
diff --git a/robolectric/src/test/java/org/robolectric/shadows/ShadowLogTest.java b/robolectric/src/test/java/org/robolectric/shadows/ShadowLogTest.java
index ace2023..be87d0c 100644
--- a/robolectric/src/test/java/org/robolectric/shadows/ShadowLogTest.java
+++ b/robolectric/src/test/java/org/robolectric/shadows/ShadowLogTest.java
@@ -276,7 +276,7 @@
 
   @Test
   public void getLogs_shouldReturnCopy() {
-    assertThat(ShadowLog.getLogs()).isNotSameAs(ShadowLog.getLogs());
+    assertThat(ShadowLog.getLogs()).isNotSameInstanceAs(ShadowLog.getLogs());
     assertThat(ShadowLog.getLogs()).isEqualTo(ShadowLog.getLogs());
   }
 
diff --git a/robolectric/src/test/java/org/robolectric/shadows/ShadowLooperTest.java b/robolectric/src/test/java/org/robolectric/shadows/ShadowLooperTest.java
index 17dbe9f..1302072 100644
--- a/robolectric/src/test/java/org/robolectric/shadows/ShadowLooperTest.java
+++ b/robolectric/src/test/java/org/robolectric/shadows/ShadowLooperTest.java
@@ -1,6 +1,7 @@
 package org.robolectric.shadows;
 
 import static com.google.common.truth.Truth.assertThat;
+import static com.google.common.truth.Truth.assertWithMessage;
 import static org.robolectric.Shadows.shadowOf;
 
 import android.app.Application;
@@ -70,34 +71,34 @@
   
   @Test
   public void mainLooper_andMyLooper_shouldBeSame_onMainThread() {
-    assertThat(Looper.myLooper()).isSameAs(Looper.getMainLooper());
+    assertThat(Looper.myLooper()).isSameInstanceAs(Looper.getMainLooper());
   }
 
   @Test
   public void differentThreads_getDifferentLoopers() {
     HandlerThread ht = getHandlerThread();
-    assertThat(ht.getLooper()).isNotSameAs(Looper.getMainLooper());
+    assertThat(ht.getLooper()).isNotSameInstanceAs(Looper.getMainLooper());
   }
 
   @Test
   public void mainLooperThread_shouldBeTestThread() {
-    assertThat(Looper.getMainLooper().getThread()).isSameAs(Thread.currentThread());
+    assertThat(Looper.getMainLooper().getThread()).isSameInstanceAs(Thread.currentThread());
   }
 
   @Test
   public void shadowMainLooper_shouldBeShadowOfMainLooper() {
-    assertThat(ShadowLooper.getShadowMainLooper()).isSameAs(shadowOf(Looper.getMainLooper()));
+    assertThat(ShadowLooper.getShadowMainLooper()).isSameInstanceAs(shadowOf(Looper.getMainLooper()));
   }
   
   @Test
   public void getLooperForThread_returnsLooperForAThreadThatHasOne() throws InterruptedException {
     QuitThread qt = getQuitThread();
-    assertThat(ShadowLooper.getLooperForThread(qt)).isSameAs(qt.looper);
+    assertThat(ShadowLooper.getLooperForThread(qt)).isSameInstanceAs(qt.looper);
   }
   
   @Test
   public void getLooperForThread_returnsLooperForMainThread() {
-    assertThat(ShadowLooper.getLooperForThread(Thread.currentThread())).isSameAs(Looper.getMainLooper());
+    assertThat(ShadowLooper.getLooperForThread(Thread.currentThread())).isSameInstanceAs(Looper.getMainLooper());
   }
   
   @Test
@@ -110,11 +111,11 @@
       }
     }, 2000);
 
-    assertThat(wasRun[0]).named("first").isFalse();
+    assertWithMessage("first").that(wasRun[0]).isFalse();
     ShadowLooper.idleMainLooper(1999);
-    assertThat(wasRun[0]).named("second").isFalse();
+    assertWithMessage("second").that(wasRun[0]).isFalse();
     ShadowLooper.idleMainLooper(1);
-    assertThat(wasRun[0]).named("last").isTrue();
+    assertWithMessage("last").that(wasRun[0]).isTrue();
   }
 
   @Test
@@ -141,19 +142,19 @@
     HandlerThread ht = getHandlerThread();
     Looper looper = ht.getLooper();
     looper.quit();
-    assertThat(shadowOf(looper).hasQuit()).named("hasQuit").isTrue();
-    assertThat(shadowOf(looper).post(new Runnable() {
+    assertWithMessage("hasQuit").that(shadowOf(looper).hasQuit()).isTrue();
+    assertWithMessage("postAtFrontOfQueue").that(shadowOf(looper).post(new Runnable() {
       @Override
       public void run() {
       }
-    }, 0)).named("post").isFalse();
+    }, 0)).isFalse();
 
     assertThat(shadowOf(looper).postAtFrontOfQueue(new Runnable() {
       @Override
       public void run() {
       }
-    })).named("postAtFrontOfQueue").isFalse();
-    assertThat(shadowOf(looper).getScheduler().areAnyRunnable()).named("areAnyRunnable").isFalse();
+    })).isFalse();
+    assertWithMessage("areAnyRunnable").that(shadowOf(looper).getScheduler().areAnyRunnable()).isFalse();
   }
 
   @Test
@@ -167,18 +168,18 @@
       }
     }, 0);
     looper.quit();
-    assertThat(shadowOf(looper).hasQuit()).named("hasQuit").isTrue();
-    assertThat(shadowOf(looper).getScheduler().areAnyRunnable()).named("areAnyRunnable").isFalse();
-    assertThat(shadowOf(looper.getQueue()).getHead()).named("queue").isNull();
+    assertWithMessage("hasQuit").that(shadowOf(looper).hasQuit()).isTrue();
+    assertWithMessage("areAnyRunnable").that(shadowOf(looper).getScheduler().areAnyRunnable()).isFalse();
+    assertWithMessage("queue").that(shadowOf(looper.getQueue()).getHead()).isNull();
   }
 
   @Test
   public void threadShouldContinue_whenLooperQuits() throws InterruptedException {
     QuitThread test = getQuitThread();
-    assertThat(test.hasContinued).named("beforeJoin").isFalse();
+    assertWithMessage("beforeJoin").that(test.hasContinued).isFalse();
     test.looper.quit();
     test.join(5000);
-    assertThat(test.hasContinued).named("afterJoin").isTrue();
+    assertWithMessage("afterJoin").that(test.hasContinued).isTrue();
   }
 
   @Test
@@ -193,10 +194,10 @@
       public void run() {
       }
     });
-    assertThat(shadowOf(looper.getQueue()).getHead()).named("queue").isNotNull();
+    assertWithMessage("queue").that(shadowOf(looper.getQueue()).getHead()).isNotNull();
     sLooper.reset();
-    assertThat(sLooper.getScheduler().areAnyRunnable()).named("areAnyRunnable").isFalse();
-    assertThat(shadowOf(looper.getQueue()).getHead()).named("queue").isNull();
+    assertWithMessage("areAnyRunnable").that(sLooper.getScheduler().areAnyRunnable()).isFalse();
+    assertWithMessage("queue").that(shadowOf(looper.getQueue()).getHead()).isNull();
   }
 
   @Test
@@ -206,21 +207,21 @@
     ShadowLooper sLooper = shadowOf(looper);
     Scheduler old = sLooper.getScheduler();
     sLooper.reset();
-    assertThat(old).isNotSameAs(sLooper.getScheduler());
+    assertThat(old).isNotSameInstanceAs(sLooper.getScheduler());
   }
 
   @Test
   public void resetThreadLoopers_shouldQuitAllNonMainLoopers() throws InterruptedException {
     QuitThread test = getQuitThread();
-    assertThat(test.hasContinued).named("hasContinued:before").isFalse();
+    assertWithMessage("hasContinued:before").that(test.hasContinued).isFalse();
     ShadowLooper.resetThreadLoopers();
     test.join(5000);
-    assertThat(test.hasContinued).named("hasContinued:after").isTrue();
+    assertWithMessage("hasContinued:after").that(test.hasContinued).isTrue();
   }
  
   @Test(timeout = 1000)
   public void whenTestHarnessUsesDifferentThread_shouldStillHaveMainLooper() {
-    assertThat(Looper.myLooper()).isSameAs(Looper.getMainLooper());
+    assertThat(Looper.myLooper()).isSameInstanceAs(Looper.getMainLooper());
   }
   
   @Test
@@ -246,7 +247,7 @@
     Looper mainLooper = Looper.getMainLooper();
     Scheduler scheduler = shadowOf(mainLooper).getScheduler();
     shadowOf(mainLooper).quit = true;
-    assertThat(ApplicationProvider.getApplicationContext().getMainLooper()).isSameAs(mainLooper);
+    assertThat(ApplicationProvider.getApplicationContext().getMainLooper()).isSameInstanceAs(mainLooper);
     Scheduler s = new Scheduler();
     RuntimeEnvironment.setMasterScheduler(s);
     ShadowLooper.resetThreadLoopers();
@@ -258,11 +259,11 @@
             Context.class,
             ((Application) ApplicationProvider.getApplicationContext()).getBaseContext()));
 
-    assertThat(Looper.getMainLooper()).named("Looper.getMainLooper()").isSameAs(mainLooper);
-    assertThat(application.getMainLooper()).named("app.getMainLooper()").isSameAs(mainLooper);
-    assertThat(shadowOf(mainLooper).getScheduler()).named("scheduler").isNotSameAs(scheduler);
-    assertThat(shadowOf(mainLooper).getScheduler()).named("scheduler").isSameAs(s);
-    assertThat(shadowOf(mainLooper).hasQuit()).named("quit").isFalse();
+    assertWithMessage("Looper.getMainLooper()").that(Looper.getMainLooper()).isSameInstanceAs(mainLooper);
+    assertWithMessage("app.getMainLooper()").that(application.getMainLooper()).isSameInstanceAs(mainLooper);
+    assertWithMessage("scheduler").that(shadowOf(mainLooper).getScheduler()).isNotSameInstanceAs(scheduler);
+    assertWithMessage("scheduler").that(shadowOf(mainLooper).getScheduler()).isSameInstanceAs(s);
+    assertWithMessage("quit").that(shadowOf(mainLooper).hasQuit()).isFalse();
   }
 
   @Test
@@ -281,7 +282,7 @@
     Scheduler s = new Scheduler();
     RuntimeEnvironment.setMasterScheduler(s);
     sMainLooper.reset();
-    assertThat(sMainLooper.getScheduler()).isSameAs(s);
+    assertThat(sMainLooper.getScheduler()).isSameInstanceAs(s);
   }
 
   @Test
@@ -291,7 +292,7 @@
     Scheduler s = new Scheduler();
     RuntimeEnvironment.setMasterScheduler(s);
     sMainLooper.reset();
-    assertThat(sMainLooper.getScheduler()).isSameAs(s);
+    assertThat(sMainLooper.getScheduler()).isSameInstanceAs(s);
   }
 
   @Test
@@ -300,8 +301,8 @@
     ShadowLooper sLooper = shadowOf(ht.getLooper());
     Scheduler old = sLooper.getScheduler();
     sLooper.reset();
-    assertThat(sLooper.getScheduler()).isNotSameAs(old);
-    assertThat(sLooper.getScheduler()).isNotSameAs(RuntimeEnvironment.getMasterScheduler());
+    assertThat(sLooper.getScheduler()).isNotSameInstanceAs(old);
+    assertThat(sLooper.getScheduler()).isNotSameInstanceAs(RuntimeEnvironment.getMasterScheduler());
   }
 
   @Test
@@ -312,7 +313,7 @@
     RuntimeEnvironment.setMasterScheduler(s);
     setAdvancedScheduling();
     sLooper.reset();
-    assertThat(sLooper.getScheduler()).isSameAs(s);
+    assertThat(sLooper.getScheduler()).isSameInstanceAs(s);
   }
 
   @Test
@@ -352,7 +353,7 @@
     t.start();
     try {
       t.join(1000);
-      assertThat(myLooper.get()).isSameAs(Looper.getMainLooper());
+      assertThat(myLooper.get()).isSameInstanceAs(Looper.getMainLooper());
     } finally {
       RuntimeEnvironment.setMainThread(Thread.currentThread());
     }
@@ -373,20 +374,20 @@
     backgroundThread.start();
     backgroundThread.join();
 
-    assertThat(mainLooperAtomicReference.get()).named("mainLooper").isSameAs(Looper.getMainLooper());
+    assertWithMessage("mainLooper").that(mainLooperAtomicReference.get()).isSameInstanceAs(Looper.getMainLooper());
   }
 
   @Test
   public void schedulerOnAnotherLooper_shouldNotBeMaster_byDefault() {
     HandlerThread ht = getHandlerThread();
-    assertThat(shadowOf(ht.getLooper()).getScheduler()).isNotSameAs(RuntimeEnvironment.getMasterScheduler());
+    assertThat(shadowOf(ht.getLooper()).getScheduler()).isNotSameInstanceAs(RuntimeEnvironment.getMasterScheduler());
   }
 
   @Test
   public void schedulerOnAnotherLooper_shouldBeMaster_ifAdvancedSchedulingEnabled() {
     setAdvancedScheduling();
     HandlerThread ht = getHandlerThread();
-    assertThat(shadowOf(ht.getLooper()).getScheduler()).isSameAs(RuntimeEnvironment.getMasterScheduler());
+    assertThat(shadowOf(ht.getLooper()).getScheduler()).isSameInstanceAs(RuntimeEnvironment.getMasterScheduler());
   }
 
   @Test
@@ -409,17 +410,17 @@
         events.add("handler2");
       }
     }, 200);
-    assertThat(events).named("start").isEmpty();
+    assertWithMessage("start").that(events).isEmpty();
     Scheduler s = ShadowLooper.getShadowMainLooper().getScheduler();
-    assertThat(s).isSameAs(RuntimeEnvironment.getMasterScheduler());
-    assertThat(s).isSameAs(shadowOf(ht.getLooper()).getScheduler());
+    assertThat(s).isSameInstanceAs(RuntimeEnvironment.getMasterScheduler());
+    assertThat(s).isSameInstanceAs(shadowOf(ht.getLooper()).getScheduler());
     final long startTime = s.getCurrentTime();
     s.runOneTask();
-    assertThat(events).named("firstEvent").containsExactly("handler1");
-    assertThat(s.getCurrentTime()).named("firstEvent:time").isEqualTo(100 + startTime);
+    assertWithMessage("firstEvent").that(events).containsExactly("handler1");
+    assertWithMessage("firstEvent:time").that(s.getCurrentTime()).isEqualTo(100 + startTime);
     s.runOneTask();
-    assertThat(events).named("secondEvent").containsExactly("handler1", "handler2");
-    assertThat(s.getCurrentTime()).named("secondEvent:time").isEqualTo(200 + startTime);
+    assertWithMessage("secondEvent").that(events).containsExactly("handler1", "handler2");
+    assertWithMessage("secondEvent:time").that(s.getCurrentTime()).isEqualTo(200 + startTime);
   }
 
   @Test
diff --git a/robolectric/src/test/java/org/robolectric/shadows/ShadowMediaMetadataRetrieverTest.java b/robolectric/src/test/java/org/robolectric/shadows/ShadowMediaMetadataRetrieverTest.java
index 40d771f..ce6227e 100644
--- a/robolectric/src/test/java/org/robolectric/shadows/ShadowMediaMetadataRetrieverTest.java
+++ b/robolectric/src/test/java/org/robolectric/shadows/ShadowMediaMetadataRetrieverTest.java
@@ -4,6 +4,7 @@
 import static android.media.MediaMetadataRetriever.METADATA_KEY_ARTIST;
 import static android.media.MediaMetadataRetriever.METADATA_KEY_TITLE;
 import static com.google.common.truth.Truth.assertThat;
+import static com.google.common.truth.Truth.assertWithMessage;
 import static org.junit.Assert.fail;
 import static org.robolectric.shadows.ShadowMediaMetadataRetriever.addException;
 import static org.robolectric.shadows.ShadowMediaMetadataRetriever.addFrame;
@@ -112,7 +113,7 @@
     addException(toDataSource(path2), new IllegalArgumentException());
     retriever.setDataSource(path);
     assertThat(retriever.extractMetadata(METADATA_KEY_ARTIST)).isEqualTo("The Rolling Stones");
-    assertThat(retriever.getFrameAtTime(1)).isSameAs(bitmap);
+    assertThat(retriever.getFrameAtTime(1)).isSameInstanceAs(bitmap);
     try {
       retriever2.setDataSource(path2);
       fail("Expected exception");
@@ -135,9 +136,9 @@
       retriever.setDataSource(path);
       fail("Expected exception");
     } catch (Exception caught) {
-      assertThat(caught).isSameAs(e);
-      assertThat(e.getStackTrace()[0].getClassName())
-         .named("Stack trace should originate in Shadow")
+      assertThat(caught).isSameInstanceAs(e);
+      assertWithMessage("Stack trace should originate in Shadow")
+         .that(e.getStackTrace()[0].getClassName())
          .isEqualTo(ShadowMediaMetadataRetriever.class.getName());
     }
   }
diff --git a/robolectric/src/test/java/org/robolectric/shadows/ShadowMediaPlayerTest.java b/robolectric/src/test/java/org/robolectric/shadows/ShadowMediaPlayerTest.java
index 0ea7811..f9a5674 100644
--- a/robolectric/src/test/java/org/robolectric/shadows/ShadowMediaPlayerTest.java
+++ b/robolectric/src/test/java/org/robolectric/shadows/ShadowMediaPlayerTest.java
@@ -2,6 +2,7 @@
 
 import static android.os.Build.VERSION_CODES.O;
 import static com.google.common.truth.Truth.assertThat;
+import static com.google.common.truth.Truth.assertWithMessage;
 import static org.junit.Assert.fail;
 import static org.robolectric.Shadows.shadowOf;
 import static org.robolectric.shadows.ShadowMediaPlayer.State.END;
@@ -157,7 +158,7 @@
     DataSource ds = toDataSource("dummy");
     ShadowMediaPlayer.addMediaInfo(ds, info);
     mediaPlayer.setDataSource("dummy");
-    assertThat(shadowMediaPlayer.getDataSource()).named("dataSource").isEqualTo(ds);
+    assertWithMessage("dataSource").that(shadowMediaPlayer.getDataSource()).isEqualTo(ds);
   }
 
   @Test
@@ -169,8 +170,8 @@
 
     mediaPlayer.setDataSource(ApplicationProvider.getApplicationContext(), uri, headers);
 
-    assertThat(shadowMediaPlayer.getSourceUri()).named("sourceUri").isSameAs(uri);
-    assertThat(shadowMediaPlayer.getDataSource()).named("dataSource").isEqualTo(ds);
+    assertWithMessage("sourceUri").that(shadowMediaPlayer.getSourceUri()).isSameInstanceAs(uri);
+    assertWithMessage("dataSource").that(shadowMediaPlayer.getDataSource()).isEqualTo(ds);
   }
 
   @Test
@@ -184,8 +185,8 @@
         DataSource ds = toDataSource(fd, 23, 524);
         ShadowMediaPlayer.addMediaInfo(ds, info);
         mediaPlayer.setDataSource(fd, 23, 524);
-        assertThat(shadowMediaPlayer.getSourceUri()).named("sourceUri").isNull();
-        assertThat(shadowMediaPlayer.getDataSource()).named("dataSource")
+        assertWithMessage("sourceUri").that(shadowMediaPlayer.getSourceUri()).isNull();
+        assertWithMessage("dataSource").that(shadowMediaPlayer.getDataSource())
             .isEqualTo(ds);
       } finally {
         is.close();
@@ -209,7 +210,7 @@
       assertThat(shadowMediaPlayer.getState()).isEqualTo(PREPARING);
       Mockito.verifyZeroInteractions(preparedListener);
       scheduler.advanceToLastPostedRunnable();
-      assertThat(scheduler.getCurrentTime()).named("currentTime").isEqualTo(
+      assertWithMessage("currentTime").that(scheduler.getCurrentTime()).isEqualTo(
           startTime + delay);
       assertThat(shadowMediaPlayer.getState()).isEqualTo(PREPARED);
       Mockito.verify(preparedListener).onPrepared(mediaPlayer);
@@ -227,20 +228,20 @@
     final long startTime = scheduler.getCurrentTime();
     mediaPlayer.prepareAsync();
 
-    assertThat(scheduler.getCurrentTime()).named("currentTime").isEqualTo(
+    assertWithMessage("currentTime").that(scheduler.getCurrentTime()).isEqualTo(
         startTime);
-    assertThat(shadowMediaPlayer.getState()).isSameAs(PREPARING);
+    assertThat(shadowMediaPlayer.getState()).isSameInstanceAs(PREPARING);
     Mockito.verifyZeroInteractions(preparedListener);
     shadowMediaPlayer.invokePreparedListener();
-    assertThat(shadowMediaPlayer.getState()).isSameAs(PREPARED);
+    assertThat(shadowMediaPlayer.getState()).isSameInstanceAs(PREPARED);
     Mockito.verify(preparedListener).onPrepared(mediaPlayer);
     Mockito.verifyNoMoreInteractions(preparedListener);
   }
 
   @Test
   public void testDefaultPreparationDelay() {
-    assertThat(info.getPreparationDelay())
-        .named("preparationDelay").isEqualTo(0);
+    assertWithMessage("preparationDelay").that(info.getPreparationDelay())
+        .isEqualTo(0);
   }
 
   @Test
@@ -587,7 +588,7 @@
 
   @Test
   public void testInitialAudioSessionIdIsNotZero() {
-    assertThat(mediaPlayer.getAudioSessionId()).named("initial audioSessionId")
+    assertWithMessage("initial audioSessionId").that(mediaPlayer.getAudioSessionId())
         .isNotEqualTo(0);
   }
 
@@ -750,7 +751,7 @@
       }
       Mockito.verifyZeroInteractions(errorListener);
       final State finalState = shadowMediaPlayer.getState();
-      assertThat(finalState).isSameAs(ERROR);
+      assertThat(finalState).isSameInstanceAs(ERROR);
       scheduler.unPause();
       Mockito.verify(errorListener).onError(mediaPlayer, what, extra);
       Mockito.reset(errorListener);
@@ -779,7 +780,7 @@
         Throwable cause = e.getTargetException();
         assertThat(cause).isInstanceOf(eClass);
         final State finalState = shadowMediaPlayer.getState();
-        assertThat(finalState).isSameAs(state);
+        assertThat(finalState).isSameInstanceAs(state);
       }
       assertThat(success).isFalse();
     }
@@ -834,9 +835,9 @@
       mediaPlayer.seekTo(-1);
       shadowMediaPlayer.invokeSeekCompleteListener();
 
-      assertThat(mediaPlayer.getCurrentPosition()).named(
-          "Current postion while " + state).isEqualTo(0);
-      assertThat(shadowMediaPlayer.getState()).named("Final state " + state)
+      assertWithMessage("Current postion while " + state).that(mediaPlayer.getCurrentPosition())
+          .isEqualTo(0);
+      assertWithMessage("Final state " + state).that(shadowMediaPlayer.getState())
           .isEqualTo(state);
     }
   }
@@ -852,9 +853,9 @@
       mediaPlayer.seekTo(1001);
       shadowMediaPlayer.invokeSeekCompleteListener();
 
-      assertThat(mediaPlayer.getCurrentPosition()).named(
-          "Current postion while " + state).isEqualTo(1000);
-      assertThat(shadowMediaPlayer.getState()).named("Final state " + state)
+      assertWithMessage("Current postion while " + state).that(mediaPlayer.getCurrentPosition())
+          .isEqualTo(1000);
+      assertWithMessage("Final state " + state).that(shadowMediaPlayer.getState())
           .isEqualTo(state);
     }
   }
@@ -1054,16 +1055,16 @@
     // invoked automatically by the shadow player itself.
     shadowMediaPlayer.setSeekDelay(-1);
 
-    assertThat(shadowMediaPlayer.getPendingSeek()).named("pendingSeek before")
+    assertWithMessage("pendingSeek before").that(shadowMediaPlayer.getPendingSeek())
         .isEqualTo(-1);
     int[] positions = { 0, 5, 2, 999 };
     int prevPos = 0;
     for (int position : positions) {
       mediaPlayer.seekTo(position);
 
-      assertThat(shadowMediaPlayer.getPendingSeek()).named("pendingSeek")
+      assertWithMessage("pendingSeek").that(shadowMediaPlayer.getPendingSeek())
           .isEqualTo(position);
-      assertThat(mediaPlayer.getCurrentPosition()).named("pendingSeekCurrentPos")
+      assertWithMessage("pendingSeekCurrentPos").that(mediaPlayer.getCurrentPosition())
           .isEqualTo(prevPos);
 
       shadowMediaPlayer.invokeSeekCompleteListener();
@@ -1156,7 +1157,7 @@
     shadowMediaPlayer.doStart();
     assertThat(shadowMediaPlayer.isReallyPlaying()).isTrue();
     assertThat(shadowMediaPlayer.getCurrentPositionRaw()).isEqualTo(0);
-    assertThat(shadowMediaPlayer.getState()).isSameAs(IDLE);
+    assertThat(shadowMediaPlayer.getState()).isSameInstanceAs(IDLE);
 
     scheduler.advanceBy(100);
     assertThat(shadowMediaPlayer.getCurrentPositionRaw()).isEqualTo(100);
@@ -1164,7 +1165,7 @@
     shadowMediaPlayer.doStop();
     assertThat(shadowMediaPlayer.isReallyPlaying()).isFalse();
     assertThat(shadowMediaPlayer.getCurrentPositionRaw()).isEqualTo(100);
-    assertThat(shadowMediaPlayer.getState()).isSameAs(IDLE);
+    assertThat(shadowMediaPlayer.getState()).isSameInstanceAs(IDLE);
 
     scheduler.advanceBy(50);
     assertThat(shadowMediaPlayer.getCurrentPositionRaw()).isEqualTo(100);
@@ -1182,7 +1183,7 @@
 
     scheduler.advanceBy(1);
     Mockito.verify(errorListener).onError(mediaPlayer, 1, 3);
-    assertThat(shadowMediaPlayer.getState()).isSameAs(ERROR);
+    assertThat(shadowMediaPlayer.getState()).isSameInstanceAs(ERROR);
     assertThat(scheduler.advanceToLastPostedRunnable()).isFalse();
     assertThat(shadowMediaPlayer.getCurrentPositionRaw()).isEqualTo(500);
   }
@@ -1304,7 +1305,7 @@
     Mockito.verify(errorListener).onError(mediaPlayer, 32, 22);
     assertThat(scheduler.size()).isEqualTo(0);
     assertThat(shadowMediaPlayer.getCurrentPositionRaw()).isEqualTo(675);
-    assertThat(shadowMediaPlayer.getState()).isSameAs(ERROR);
+    assertThat(shadowMediaPlayer.getState()).isSameInstanceAs(ERROR);
     Mockito.verifyZeroInteractions(e2);
   }
 
@@ -1387,8 +1388,7 @@
 
       scheduler.advanceBy(700);
       Mockito.verifyZeroInteractions(completionListener);
-      assertThat(mediaPlayer.getCurrentPosition()).named(state.toString())
-          .isEqualTo(200);
+      assertWithMessage(state.toString()).that(mediaPlayer.getCurrentPosition()).isEqualTo(200);
     }
   }
 
@@ -1410,9 +1410,8 @@
     ShadowMediaPlayer.CreateListener createListener = Mockito
         .mock(ShadowMediaPlayer.CreateListener.class);
     ShadowMediaPlayer.setCreateListener(createListener);
-    assertThat(ShadowMediaPlayer.createListener)
-      .named("createListener")
-      .isSameAs(createListener);
+    assertWithMessage("createListener").that(ShadowMediaPlayer.createListener)
+      .isSameInstanceAs(createListener);
     DataSource dummy = toDataSource("stuff");
     IOException e = new IOException();
     addException(dummy, e);
@@ -1422,18 +1421,16 @@
       shadowMediaPlayer.setDataSource(dummy);
       fail("Expected exception thrown");
     } catch (IOException e2) {
-      assertThat(e2).named("thrown exception").isSameAs(e);
+      assertWithMessage("thrown exception").that(e2).isSameInstanceAs(e);
     }
     // Check that the mediaInfo was cleared
     shadowMediaPlayer.doSetDataSource(defaultSource);
-    assertThat(shadowMediaPlayer.getMediaInfo()).named("mediaInfo:before").isNotNull();
+    assertWithMessage("mediaInfo:before").that(shadowMediaPlayer.getMediaInfo()).isNotNull();
     
     ShadowMediaPlayer.resetStaticState();
 
     // Check that the listener was cleared.
-    assertThat(ShadowMediaPlayer.createListener)
-      .named("createListener")
-      .isNull();
+    assertWithMessage("createListener").that(ShadowMediaPlayer.createListener).isNull();
 
     // Check that the mediaInfo was cleared.
     try {
@@ -1461,9 +1458,9 @@
       mediaPlayer.setDataSource("dummy");
       fail("Expected exception thrown");
     } catch (Exception caught) {
-      assertThat(caught).isSameAs(e);
-      assertThat(e.getStackTrace()[0].getClassName())
-         .named("Stack trace should originate in Shadow")
+      assertThat(caught).isSameInstanceAs(e);
+      assertWithMessage("Stack trace should originate in Shadow")
+         .that(e.getStackTrace()[0].getClassName())
          .isEqualTo(ShadowMediaPlayer.class.getName());
     }
   }
@@ -1477,12 +1474,12 @@
       mediaPlayer.setDataSource("dummy");
       fail("Expected exception thrown");
     } catch (Exception caught) {
-      assertThat(caught).isSameAs(e);
-      assertThat(e.getStackTrace()[0].getClassName())
-         .named("Stack trace should originate in Shadow")
+      assertThat(caught).isSameInstanceAs(e);
+      assertWithMessage("Stack trace should originate in Shadow")
+         .that(e.getStackTrace()[0].getClassName())
          .isEqualTo(ShadowMediaPlayer.class.getName());
-      assertThat(shadowMediaPlayer.getState()).named(
-          "State after " + e + " thrown should be unchanged").isSameAs(IDLE);
+      assertWithMessage("State after " + e + " thrown should be unchanged")
+          .that(shadowMediaPlayer.getState()).isSameInstanceAs(IDLE);
     }
   }
   
@@ -1492,9 +1489,9 @@
       mediaPlayer.setDataSource("some unspecified data source");
       fail("Expected exception thrown");
     } catch (IllegalArgumentException a) {
-      assertThat(a.getMessage()).named("assertionMessage")
+      assertWithMessage("assertionMessage").that(a.getMessage())
           .contains("addException");
-      assertThat(a.getMessage()).named("assertionMessage")
+      assertWithMessage("assertionMessage").that(a.getMessage())
           .contains("addMediaInfo");
     } catch (Exception e) {
       throw new RuntimeException("Unexpected exception", e);
@@ -1517,7 +1514,7 @@
         new MediaEvent() {
           @Override
           public void run(MediaPlayer mp, ShadowMediaPlayer smp) {
-            assertThat(Looper.myLooper()).isSameAs(Looper.getMainLooper());
+            assertThat(Looper.myLooper()).isSameInstanceAs(Looper.getMainLooper());
             ran.set(true);
           }
         });
diff --git a/robolectric/src/test/java/org/robolectric/shadows/ShadowMediaRecorderTest.java b/robolectric/src/test/java/org/robolectric/shadows/ShadowMediaRecorderTest.java
index 85b02fa..c11fff4 100644
--- a/robolectric/src/test/java/org/robolectric/shadows/ShadowMediaRecorderTest.java
+++ b/robolectric/src/test/java/org/robolectric/shadows/ShadowMediaRecorderTest.java
@@ -69,7 +69,7 @@
     Camera c = Shadow.newInstanceOf(Camera.class);
     mediaRecorder.setCamera(c);
     assertThat(shadowMediaRecorder.getCamera()).isNotNull();
-    assertThat(shadowMediaRecorder.getCamera()).isSameAs(c);
+    assertThat(shadowMediaRecorder.getCamera()).isSameInstanceAs(c);
   }
 
   @Test
@@ -92,7 +92,7 @@
     TestErrorListener listener = new TestErrorListener();
     mediaRecorder.setOnErrorListener(listener);
     assertThat(shadowMediaRecorder.getErrorListener()).isNotNull();
-    assertThat(shadowMediaRecorder.getErrorListener()).isSameAs((MediaRecorder.OnErrorListener) listener);
+    assertThat(shadowMediaRecorder.getErrorListener()).isSameInstanceAs((MediaRecorder.OnErrorListener) listener);
   }
 
   @Test
@@ -101,7 +101,7 @@
     TestInfoListener listener = new TestInfoListener();
     mediaRecorder.setOnInfoListener(listener);
     assertThat(shadowMediaRecorder.getInfoListener()).isNotNull();
-    assertThat(shadowMediaRecorder.getInfoListener()).isSameAs((MediaRecorder.OnInfoListener) listener);
+    assertThat(shadowMediaRecorder.getInfoListener()).isSameInstanceAs((MediaRecorder.OnInfoListener) listener);
   }
 
   @Test
@@ -129,7 +129,7 @@
     Surface surface = Shadow.newInstanceOf(Surface.class);
     mediaRecorder.setPreviewDisplay(surface);
     assertThat(shadowMediaRecorder.getPreviewDisplay()).isNotNull();
-    assertThat(shadowMediaRecorder.getPreviewDisplay()).isSameAs(surface);
+    assertThat(shadowMediaRecorder.getPreviewDisplay()).isSameInstanceAs(surface);
     assertThat(shadowMediaRecorder.getState()).isEqualTo(ShadowMediaRecorder.STATE_DATA_SOURCE_CONFIGURED);
   }
 
diff --git a/robolectric/src/test/java/org/robolectric/shadows/ShadowMessageQueueTest.java b/robolectric/src/test/java/org/robolectric/shadows/ShadowMessageQueueTest.java
index 9fa24e8..66794c4 100644
--- a/robolectric/src/test/java/org/robolectric/shadows/ShadowMessageQueueTest.java
+++ b/robolectric/src/test/java/org/robolectric/shadows/ShadowMessageQueueTest.java
@@ -2,6 +2,7 @@
 
 import static android.os.Build.VERSION_CODES.M;
 import static com.google.common.truth.Truth.assertThat;
+import static com.google.common.truth.Truth.assertWithMessage;
 import static org.junit.Assert.fail;
 import static org.robolectric.Shadows.shadowOf;
 import static org.robolectric.util.ReflectionHelpers.ClassParameter.from;
@@ -74,7 +75,7 @@
   @Test
   public void test_setGetHead() {
     shadowQueue.setHead(testMessage);
-    assertThat(shadowQueue.getHead()).named("getHead()").isSameAs(testMessage);
+    assertWithMessage("getHead()").that(shadowQueue.getHead()).isSameInstanceAs(testMessage);
   }
 
   private boolean enqueueMessage(Message msg, long when) {
@@ -95,50 +96,50 @@
   @Test
   public void enqueueMessage_setsHead() {
     enqueueMessage(testMessage, 100);
-    assertThat(shadowQueue.getHead()).named("head").isSameAs(testMessage);
+    assertWithMessage("head").that(shadowQueue.getHead()).isSameInstanceAs(testMessage);
   }
 
   @Test
   public void enqueueMessage_returnsTrue() {
-    assertThat(enqueueMessage(testMessage, 100)).named("retval").isTrue();
+    assertWithMessage("retval").that(enqueueMessage(testMessage, 100)).isTrue();
   }
 
   @Test
   public void enqueueMessage_setsWhen() {
     enqueueMessage(testMessage, 123);
-    assertThat(testMessage.getWhen()).named("when").isEqualTo(123);
+    assertWithMessage("when").that(testMessage.getWhen()).isEqualTo(123);
   }
   
   @Test
   public void enqueueMessage_returnsFalse_whenQuitting() {
     setField(queue, quitField, true);
-    assertThat(enqueueMessage(testMessage, 1)).named("enqueueMessage()").isFalse();
+    assertWithMessage("enqueueMessage()").that(enqueueMessage(testMessage, 1)).isFalse();
   }
 
   @Test
   public void enqueueMessage_doesntSchedule_whenQuitting() {
     setField(queue, quitField, true);
     enqueueMessage(testMessage, 1);
-    assertThat(scheduler.size()).named("scheduler_size").isEqualTo(0);
+    assertWithMessage("scheduler_size").that(scheduler.size()).isEqualTo(0);
   }
   
   @Test
   public void enqueuedMessage_isSentToHandler() {
     enqueueMessage(testMessage, 200);
     scheduler.advanceTo(199);
-    assertThat(handler.handled).named("handled:before").isEmpty();
+    assertWithMessage("handled:before").that(handler.handled).isEmpty();
     scheduler.advanceTo(200);
-    assertThat(handler.handled).named("handled:after").containsExactly(testMessage);
+    assertWithMessage("handled:after").that(handler.handled).containsExactly(testMessage);
   }
   
   @Test
   public void removedMessage_isNotSentToHandler() {
     enqueueMessage(testMessage, 200);
-    assertThat(scheduler.size()).named("scheduler size:before").isEqualTo(1);
+    assertWithMessage("scheduler size:before").that(scheduler.size()).isEqualTo(1);
     removeMessages(handler, testMessage.what, null);
     scheduler.advanceToLastPostedRunnable();
-    assertThat(scheduler.size()).named("scheduler size:after").isEqualTo(0);
-    assertThat(handler.handled).named("handled").isEmpty();
+    assertWithMessage("scheduler size:after").that(scheduler.size()).isEqualTo(0);
+    assertWithMessage("handled").that(handler.handled).isEmpty();
   }
 
   @Test
@@ -147,7 +148,7 @@
     Message m2 = handler.obtainMessage(2);
     enqueueMessage(m2, 0);
     scheduler.advanceToLastPostedRunnable();
-    assertThat(handler.handled).named("handled").containsExactly(m2, testMessage);
+    assertWithMessage("handled").that(handler.handled).containsExactly(m2, testMessage);
   }
   
   @Test
@@ -156,9 +157,9 @@
       @Override
       public void handleMessage(Message msg) {
         boolean inUse = callInstanceMethod(msg, "isInUse");
-        assertThat(inUse).named(msg.what + ":inUse").isTrue();
+        assertWithMessage(msg.what + ":inUse").that(inUse).isTrue();
         Message next = getField(msg, "next");
-        assertThat(next).named(msg.what + ":next").isNull();
+        assertWithMessage(msg.what + ":next").that(next).isNull();
       }
     };
     Message msg = handler.obtainMessage(1);
@@ -168,11 +169,11 @@
     scheduler.advanceToNextPostedRunnable();
     
     // Check that it's been properly recycled.
-    assertThat(msg.what).named("msg.what").isEqualTo(0);
+    assertWithMessage("msg.what").that(msg.what).isEqualTo(0);
     
     scheduler.advanceToNextPostedRunnable();
 
-    assertThat(msg2.what).named("msg2.what").isEqualTo(0);
+    assertWithMessage("msg2.what").that(msg2.what).isEqualTo(0);
   }
   
   @Test 
@@ -181,11 +182,11 @@
     Message msg2 = handler.obtainMessage(5678);
     handler.sendMessage(msg);
     handler.sendMessage(msg2);
-    assertThat(handler.hasMessages(1234)).named("before-1234").isTrue();
-    assertThat(handler.hasMessages(5678)).named("before-5678").isTrue();
+    assertWithMessage("before-1234").that(handler.hasMessages(1234)).isTrue();
+    assertWithMessage("before-5678").that(handler.hasMessages(5678)).isTrue();
     shadowQueue.reset();
-    assertThat(handler.hasMessages(1234)).named("after-1234").isFalse();
-    assertThat(handler.hasMessages(5678)).named("after-5678").isFalse();
+    assertWithMessage("after-1234").that(handler.hasMessages(1234)).isFalse();
+    assertWithMessage("after-5678").that(handler.hasMessages(5678)).isFalse();
   }
 
   @Test
@@ -221,7 +222,7 @@
     scheduler.advanceToLastPostedRunnable();
     removeSyncBarrier(queue, token);
     assertThat(shadowQueue.getHead()).isNull();
-    assertThat(handler.handled).named("handled:after").containsExactly(testMessage);
+    assertWithMessage("handled:after").that(handler.handled).containsExactly(testMessage);
   }
 
   @Test
@@ -233,7 +234,7 @@
     assertThat(shadowQueue.getHead()).isEqualTo(testMessage);
     scheduler.advanceToLastPostedRunnable();
     assertThat(shadowQueue.getHead()).isNull();
-    assertThat(handler.handled).named("handled:after").containsExactly(testMessage);
+    assertWithMessage("handled:after").that(handler.handled).containsExactly(testMessage);
   }
 
   @Test
@@ -243,7 +244,7 @@
     scheduler.advanceToLastPostedRunnable();
     removeSyncBarrier(queue, token);
     assertThat(shadowQueue.getHead()).isNull();
-    assertThat(handler.handled).named("handled:after").containsExactly(testMessage);
+    assertWithMessage("handled:after").that(handler.handled).containsExactly(testMessage);
   }
 
   private static void removeSyncBarrier(MessageQueue queue, int token) {
diff --git a/robolectric/src/test/java/org/robolectric/shadows/ShadowMessageTest.java b/robolectric/src/test/java/org/robolectric/shadows/ShadowMessageTest.java
index 8699bd5..ad05cd0 100644
--- a/robolectric/src/test/java/org/robolectric/shadows/ShadowMessageTest.java
+++ b/robolectric/src/test/java/org/robolectric/shadows/ShadowMessageTest.java
@@ -3,6 +3,7 @@
 import static android.os.Build.VERSION_CODES.KITKAT_WATCH;
 import static android.os.Build.VERSION_CODES.LOLLIPOP;
 import static com.google.common.truth.Truth.assertThat;
+import static com.google.common.truth.Truth.assertWithMessage;
 import static org.robolectric.Shadows.shadowOf;
 
 import android.os.Bundle;
@@ -175,7 +176,7 @@
     Message msg2 = Message.obtain();
     ShadowMessage sMsg = shadowOf(msg);
     sMsg.setNext(msg2);
-    assertThat(sMsg.getNext()).isSameAs(msg2);
+    assertThat(sMsg.getNext()).isSameInstanceAs(msg2);
   }
   
   @Test
@@ -227,9 +228,9 @@
     Message msg = Message.obtain(h, 234);
     msg.sendToTarget();
     Scheduler scheduler = Robolectric.getForegroundThreadScheduler();
-    assertThat(scheduler.size()).named("before recycle").isEqualTo(1);
+    assertWithMessage("before recycle").that(scheduler.size()).isEqualTo(1);
     shadowOf(msg).recycleUnchecked();
-    assertThat(scheduler.size()).named("after recycle").isEqualTo(0);
+    assertWithMessage("after recycle").that(scheduler.size()).isEqualTo(0);
   }
   
   @Test
@@ -237,11 +238,11 @@
     Message dummy1 = Message.obtain();
     shadowOf(dummy1).recycleUnchecked();
     Message dummy2 = Message.obtain();
-    assertThat(dummy2).named("before resetting").isSameAs(dummy1);
+    assertWithMessage("before resetting").that(dummy2).isSameInstanceAs(dummy1);
 
     shadowOf(dummy2).recycleUnchecked();
     ShadowMessage.reset();
     dummy1 = Message.obtain();
-    assertThat(dummy1).named("after resetting").isNotSameAs(dummy2);
+    assertWithMessage("after resetting").that(dummy1).isNotSameInstanceAs(dummy2);
   }
 }
diff --git a/robolectric/src/test/java/org/robolectric/shadows/ShadowNfcAdapterTest.java b/robolectric/src/test/java/org/robolectric/shadows/ShadowNfcAdapterTest.java
index 3dbbb9a..88be8dc 100644
--- a/robolectric/src/test/java/org/robolectric/shadows/ShadowNfcAdapterTest.java
+++ b/robolectric/src/test/java/org/robolectric/shadows/ShadowNfcAdapterTest.java
@@ -36,7 +36,7 @@
     final NfcAdapter adapter = NfcAdapter.getDefaultAdapter(activity);
 
     adapter.setNdefPushMessageCallback(callback, activity);
-    assertThat(shadowOf(adapter).getNdefPushMessageCallback()).isSameAs(callback);
+    assertThat(shadowOf(adapter).getNdefPushMessageCallback()).isSameInstanceAs(callback);
   }
 
   @Test
@@ -47,7 +47,7 @@
     final NfcAdapter adapter = NfcAdapter.getDefaultAdapter(activity);
 
     adapter.setOnNdefPushCompleteCallback(callback, activity);
-    assertThat(shadowOf(adapter).getOnNdefPushCompleteCallback()).isSameAs(callback);
+    assertThat(shadowOf(adapter).getOnNdefPushCompleteCallback()).isSameInstanceAs(callback);
   }
 
   @Test
@@ -128,7 +128,7 @@
 
     adapter.setNdefPushMessage(message, activity);
 
-    assertThat(shadowOf(adapter).getNdefPushMessage()).isSameAs(message);
+    assertThat(shadowOf(adapter).getNdefPushMessage()).isSameInstanceAs(message);
   }
 
   @Test
diff --git a/robolectric/src/test/java/org/robolectric/shadows/ShadowNotificationTest.java b/robolectric/src/test/java/org/robolectric/shadows/ShadowNotificationTest.java
index e7e5116..5c326c8 100644
--- a/robolectric/src/test/java/org/robolectric/shadows/ShadowNotificationTest.java
+++ b/robolectric/src/test/java/org/robolectric/shadows/ShadowNotificationTest.java
@@ -18,6 +18,6 @@
     PendingIntent pendingIntent = PendingIntent.getActivity(application, 0, new Intent(), 0);
     Notification notification = new Notification();
     notification.setLatestEventInfo(application, "title", "content", pendingIntent);
-    assertThat(notification.contentIntent).isSameAs(pendingIntent);
+    assertThat(notification.contentIntent).isSameInstanceAs(pendingIntent);
   }
 }
diff --git a/robolectric/src/test/java/org/robolectric/shadows/ShadowOpenGLMatrixTest.java b/robolectric/src/test/java/org/robolectric/shadows/ShadowOpenGLMatrixTest.java
index c4429fb..65e1258 100644
--- a/robolectric/src/test/java/org/robolectric/shadows/ShadowOpenGLMatrixTest.java
+++ b/robolectric/src/test/java/org/robolectric/shadows/ShadowOpenGLMatrixTest.java
@@ -69,10 +69,10 @@
             13, 14, 15, 16
     };
     Matrix.multiplyMM(res, 0, m1, 0, i, 0);
-    assertThat(res).usingExactEquality().containsAllOf(m1);
+    assertThat(res).usingExactEquality().containsAtLeast(m1);
 
     Matrix.multiplyMM(res, 0, i, 0, m1, 0);
-    assertThat(res).usingExactEquality().containsAllOf(m1);
+    assertThat(res).usingExactEquality().containsAtLeast(m1);
   }
 
   @Test
@@ -92,10 +92,10 @@
             13, 14, 15, 16
     };
     Matrix.multiplyMM(res, 16, m1, 16, i, 16);
-    assertThat(res).usingExactEquality().containsAllOf(m1);
+    assertThat(res).usingExactEquality().containsAtLeast(m1);
 
     Matrix.multiplyMM(res, 16, i, 16, m1, 16);
-    assertThat(res).usingExactEquality().containsAllOf(m1);
+    assertThat(res).usingExactEquality().containsAtLeast(m1);
   }
 
   @Test
@@ -123,7 +123,7 @@
 
 
     Matrix.multiplyMM(res, 0, m1, 0, m2, 0);
-    assertThat(res).usingExactEquality().containsAllOf(expected);
+    assertThat(res).usingExactEquality().containsAtLeast(expected);
   }
 
   @Test
@@ -162,7 +162,7 @@
     };
 
     Matrix.multiplyMM(res, 16, m1, 16, m2, 16);
-    assertThat(res).usingExactEquality().containsAllOf(expected);
+    assertThat(res).usingExactEquality().containsAtLeast(expected);
   }
 
   @Test
@@ -244,7 +244,7 @@
     Matrix.setIdentityM(i, 0);
     float[] v1 = new float[]{1, 2, 3, 4};
     Matrix.multiplyMV(res, 0, i, 0, v1, 0);
-    assertThat(res).usingExactEquality().containsAllOf(v1);
+    assertThat(res).usingExactEquality().containsAtLeast(v1);
   }
 
   @Test
@@ -260,7 +260,7 @@
     float[] v1 = new float[]{42, 239, 128, 1024};
     float[] expected = new float[]{14268, 15701, 17134, 18567};
     Matrix.multiplyMV(res, 0, m1, 0, v1, 0);
-    assertThat(res).usingExactEquality().containsAllOf(expected);
+    assertThat(res).usingExactEquality().containsAtLeast(expected);
   }
 
   @Test
@@ -283,7 +283,7 @@
             14268, 15701, 17134, 18567
     };
     Matrix.multiplyMV(res, 1, m1, 4, v1, 2);
-    assertThat(res).usingExactEquality().containsAllOf(expected);
+    assertThat(res).usingExactEquality().containsAtLeast(expected);
   }
 
   @Test
@@ -354,7 +354,7 @@
 
     float[] output = new float[16];
     Matrix.multiplyMM(output, 0, matrix1, 0, matrix2, 0);
-    assertThat(output).usingExactEquality().containsAllOf(expected);
+    assertThat(output).usingExactEquality().containsAtLeast(expected);
   }
 
   @Test
@@ -372,7 +372,7 @@
     };
     float[] output = new float[16];
     Matrix.frustumM(output, 0, 100, 500, 200, 300, 1, 100);
-    assertThat(output).usingExactEquality().containsAllOf(expected);
+    assertThat(output).usingExactEquality().containsAtLeast(expected);
   }
 
   @Test
@@ -386,7 +386,7 @@
     };
     float[] output = new float[16];
     Matrix.frustumM(output, 0, 100, 500, 200, 300, 1, 100);
-    assertThat(output).usingExactEquality().containsAllOf(expected);
+    assertThat(output).usingExactEquality().containsAtLeast(expected);
   }
 
   @Test
@@ -399,7 +399,7 @@
     };
     float[] output = new float[16];
     Matrix.perspectiveM(output, 0, 0.2f, 0.5f, 1, 100);
-    assertThat(output).usingExactEquality().containsAllOf(expected);
+    assertThat(output).usingExactEquality().containsAtLeast(expected);
   }
 
   @Test
@@ -415,7 +415,7 @@
     float[] expected = new float[]{11, 30, 57, 1};
     float[] output = new float[4];
     Matrix.multiplyMV(output, 0, matrix, 0, vector, 0);
-    assertThat(output).usingExactEquality().containsAllOf(expected);
+    assertThat(output).usingExactEquality().containsAtLeast(expected);
   }
 
   @Test
@@ -433,7 +433,7 @@
             0, 0, 0, 1
     };
     Matrix.setIdentityM(matrix, 0);
-    assertThat(matrix).usingExactEquality().containsAllOf(expected);
+    assertThat(matrix).usingExactEquality().containsAtLeast(expected);
   }
 
   @Test
@@ -452,7 +452,7 @@
     };
     float[] output = new float[16];
     Matrix.scaleM(output, 0, matrix, 0, 2, 4, 6);
-    assertThat(output).usingExactEquality().containsAllOf(expected);
+    assertThat(output).usingExactEquality().containsAtLeast(expected);
   }
 
   @Test
@@ -470,7 +470,7 @@
             13, 14, 15, 16
     };
     Matrix.scaleM(matrix, 0, 2, 4, 6);
-    assertThat(matrix).usingExactEquality().containsAllOf(expected);
+    assertThat(matrix).usingExactEquality().containsAtLeast(expected);
   }
 
   @Test
@@ -489,7 +489,7 @@
     };
     float[] output = new float[16];
     Matrix.translateM(output, 0, matrix, 0, 2, 4, 6);
-    assertThat(output).usingExactEquality().containsAllOf(expected);
+    assertThat(output).usingExactEquality().containsAtLeast(expected);
   }
 
   @Test
@@ -507,7 +507,7 @@
             89, 102, 115, 128
     };
     Matrix.translateM(matrix, 0, 2, 4, 6);
-    assertThat(matrix).usingExactEquality().containsAllOf(expected);
+    assertThat(matrix).usingExactEquality().containsAtLeast(expected);
   }
 
   @Test
@@ -526,7 +526,7 @@
     };
     float[] output = new float[16];
     Matrix.rotateM(output, 0, matrix, 0, 2, 4, 6, 8);
-    assertThat(output).usingExactEquality().containsAllOf(expected);
+    assertThat(output).usingExactEquality().containsAtLeast(expected);
   }
 
   @Test
@@ -544,7 +544,7 @@
             13, 14, 15, 16
     };
     Matrix.rotateM(matrix, 0, 2, 4, 6, 8);
-    assertThat(matrix).usingExactEquality().containsAllOf(expected);
+    assertThat(matrix).usingExactEquality().containsAtLeast(expected);
   }
 
   @Test
@@ -562,7 +562,7 @@
             0, 0, 0, 1
     };
     Matrix.setRotateM(matrix, 0, 1, 2, 3, 4);
-    assertThat(matrix).usingExactEquality().containsAllOf(expected);
+    assertThat(matrix).usingExactEquality().containsAtLeast(expected);
   }
 
   private static void assertMatrixWithPrecision(float[] actual, float[] expected, float precision) {
diff --git a/robolectric/src/test/java/org/robolectric/shadows/ShadowPackageManagerTest.java b/robolectric/src/test/java/org/robolectric/shadows/ShadowPackageManagerTest.java
index 46a8688..e5bf914 100644
--- a/robolectric/src/test/java/org/robolectric/shadows/ShadowPackageManagerTest.java
+++ b/robolectric/src/test/java/org/robolectric/shadows/ShadowPackageManagerTest.java
@@ -1302,8 +1302,8 @@
 
     shadowPackageManager.addActivityIcon(i, d);
 
-    assertThat(packageManager.getActivityIcon(i)).isSameAs(d);
-    assertThat(packageManager.getActivityIcon(i.getComponent())).isSameAs(d);
+    assertThat(packageManager.getActivityIcon(i)).isSameInstanceAs(d);
+    assertThat(packageManager.getActivityIcon(i.getComponent())).isSameInstanceAs(d);
   }
 
   @Test
@@ -1593,7 +1593,7 @@
     Drawable drawable = ShadowDrawable.createFromStream(new ByteArrayInputStream(new byte[0]), "my_source");
     shadowPackageManager.addDrawableResolution("com.example.foo", 4334, drawable);
     Drawable actual = packageManager.getDrawable("com.example.foo", 4334, null);
-    assertThat(actual).isSameAs(drawable);
+    assertThat(actual).isSameInstanceAs(drawable);
   }
 
   @Test
@@ -2473,7 +2473,7 @@
             packageManager
                 .getApplicationInfo(packageName, PackageManager.GET_SHARED_LIBRARY_FILES)
                 .loadUnbadgedIcon(packageManager))
-        .isSameAs(d);
+        .isSameInstanceAs(d);
   }
 
   @Test
diff --git a/robolectric/src/test/java/org/robolectric/shadows/ShadowPaintTest.java b/robolectric/src/test/java/org/robolectric/shadows/ShadowPaintTest.java
index 7921b6f..a6303ea 100644
--- a/robolectric/src/test/java/org/robolectric/shadows/ShadowPaintTest.java
+++ b/robolectric/src/test/java/org/robolectric/shadows/ShadowPaintTest.java
@@ -73,6 +73,6 @@
   @Test
   public void createPaintFromPaint() throws Exception {
     Paint origPaint = new Paint();
-    assertThat(new Paint(origPaint).getTextLocale()).isSameAs(origPaint.getTextLocale());
+    assertThat(new Paint(origPaint).getTextLocale()).isSameInstanceAs(origPaint.getTextLocale());
   }
 }
diff --git a/robolectric/src/test/java/org/robolectric/shadows/ShadowPendingIntentTest.java b/robolectric/src/test/java/org/robolectric/shadows/ShadowPendingIntentTest.java
index 4d666ab..ae191c0 100644
--- a/robolectric/src/test/java/org/robolectric/shadows/ShadowPendingIntentTest.java
+++ b/robolectric/src/test/java/org/robolectric/shadows/ShadowPendingIntentTest.java
@@ -209,7 +209,7 @@
 
     Intent first = shadowActivity.getNextStartedActivity();
     assertThat(first).isNotNull();
-    assertThat(first).isSameAs(intents[0]);
+    assertThat(first).isSameInstanceAs(intents[0]);
     assertThat(first.hasExtra("TEST")).isFalse();
   }
 
@@ -251,7 +251,7 @@
 
     Intent i = shadowOf(otherContext).getNextStartedActivity();
     assertThat(i).isNotNull();
-    assertThat(i).isSameAs(intent);
+    assertThat(i).isSameInstanceAs(intent);
     assertThat(i.hasExtra("TEST")).isFalse();
   }
 
@@ -292,7 +292,7 @@
     Intent identical = new Intent();
     PendingIntent saved = PendingIntent.getActivity(context, 99, identical, FLAG_NO_CREATE);
     assertThat(saved).isNotNull();
-    assertThat(intent).isSameAs(shadowOf(saved).getSavedIntent());
+    assertThat(intent).isSameInstanceAs(shadowOf(saved).getSavedIntent());
   }
 
   @Test
@@ -303,7 +303,7 @@
     Intent updated = new Intent();
     PendingIntent saved = PendingIntent.getActivity(context, 99, updated, 0);
     assertThat(saved).isNotNull();
-    assertThat(intent).isSameAs(shadowOf(saved).getSavedIntent());
+    assertThat(intent).isSameInstanceAs(shadowOf(saved).getSavedIntent());
   }
 
   @Test
@@ -329,7 +329,7 @@
     PendingIntent saved =
         PendingIntent.getActivities(context, 99, identicalIntents, FLAG_NO_CREATE);
     assertThat(saved).isNotNull();
-    assertThat(intents).isSameAs(shadowOf(saved).getSavedIntents());
+    assertThat(intents).isSameInstanceAs(shadowOf(saved).getSavedIntents());
   }
 
   @Test
@@ -340,7 +340,7 @@
     Intent[] identicalIntents = {new Intent(Intent.ACTION_VIEW), new Intent(Intent.ACTION_PICK)};
     PendingIntent saved = PendingIntent.getActivities(context, 99, identicalIntents, 0);
     assertThat(saved).isNotNull();
-    assertThat(intents).isSameAs(shadowOf(saved).getSavedIntents());
+    assertThat(intents).isSameInstanceAs(shadowOf(saved).getSavedIntents());
   }
 
   @Test
@@ -365,7 +365,7 @@
     Intent identical = new Intent();
     PendingIntent saved = PendingIntent.getBroadcast(context, 99, identical, FLAG_NO_CREATE);
     assertThat(saved).isNotNull();
-    assertThat(intent).isSameAs(shadowOf(saved).getSavedIntent());
+    assertThat(intent).isSameInstanceAs(shadowOf(saved).getSavedIntent());
   }
 
   @Test
@@ -376,7 +376,7 @@
     Intent identical = new Intent();
     PendingIntent saved = PendingIntent.getBroadcast(context, 99, identical, 0);
     assertThat(saved).isNotNull();
-    assertThat(intent).isSameAs(shadowOf(saved).getSavedIntent());
+    assertThat(intent).isSameInstanceAs(shadowOf(saved).getSavedIntent());
   }
 
   @Test
@@ -401,7 +401,7 @@
     Intent identical = new Intent();
     PendingIntent saved = PendingIntent.getService(context, 99, identical, FLAG_NO_CREATE);
     assertThat(saved).isNotNull();
-    assertThat(intent).isSameAs(shadowOf(saved).getSavedIntent());
+    assertThat(intent).isSameInstanceAs(shadowOf(saved).getSavedIntent());
   }
 
   @Test
@@ -412,7 +412,7 @@
     Intent identical = new Intent();
     PendingIntent saved = PendingIntent.getService(context, 99, identical, 0);
     assertThat(saved).isNotNull();
-    assertThat(intent).isSameAs(shadowOf(saved).getSavedIntent());
+    assertThat(intent).isSameInstanceAs(shadowOf(saved).getSavedIntent());
   }
 
   @Test
@@ -442,7 +442,7 @@
     PendingIntent saved =
         PendingIntent.getForegroundService(context, 99, identical, FLAG_NO_CREATE);
     assertThat(saved).isNotNull();
-    assertThat(intent).isSameAs(shadowOf(saved).getSavedIntent());
+    assertThat(intent).isSameInstanceAs(shadowOf(saved).getSavedIntent());
   }
 
   @Test
@@ -454,7 +454,7 @@
     Intent identical = new Intent();
     PendingIntent saved = PendingIntent.getForegroundService(context, 99, identical, 0);
     assertThat(saved).isNotNull();
-    assertThat(intent).isSameAs(shadowOf(saved).getSavedIntent());
+    assertThat(intent).isSameInstanceAs(shadowOf(saved).getSavedIntent());
   }
 
   @Test
@@ -550,7 +550,7 @@
     Intent intent = new Intent();
     PendingIntent oneShot = PendingIntent.getService(context, 0, intent, FLAG_ONE_SHOT);
     PendingIntent notOneShot = PendingIntent.getService(context, 0, intent, FLAG_UPDATE_CURRENT);
-    assertThat(oneShot).isNotSameAs(notOneShot);
+    assertThat(oneShot).isNotSameInstanceAs(notOneShot);
   }
 
   @Test
@@ -558,7 +558,7 @@
     Intent intent = new Intent();
     PendingIntent immutable = PendingIntent.getService(context, 0, intent, FLAG_IMMUTABLE);
     PendingIntent notImmutable = PendingIntent.getService(context, 0, intent, FLAG_UPDATE_CURRENT);
-    assertThat(immutable).isNotSameAs(notImmutable);
+    assertThat(immutable).isNotSameInstanceAs(notImmutable);
   }
 
   @Test
@@ -568,7 +568,7 @@
 
     // Same type, requestCode and Intent action implies equality.
     assertThat(PendingIntent.getActivity(context, 99, new Intent("activity"), FLAG_NO_CREATE))
-        .isSameAs(pendingIntent);
+        .isSameInstanceAs(pendingIntent);
 
     // Mismatched Intent action implies inequality.
     assertThat(PendingIntent.getActivity(context, 99, new Intent("activity2"), FLAG_NO_CREATE))
@@ -592,15 +592,15 @@
 
     Intent[] forward = {new Intent("activity"), new Intent("activity2")};
     assertThat(PendingIntent.getActivities(context, 99, forward, FLAG_NO_CREATE))
-        .isSameAs(pendingIntent);
+        .isSameInstanceAs(pendingIntent);
 
     Intent[] irrelevant = {new Intent("irrelevant"), new Intent("activity2")};
     assertThat(PendingIntent.getActivities(context, 99, irrelevant, FLAG_NO_CREATE))
-        .isSameAs(pendingIntent);
+        .isSameInstanceAs(pendingIntent);
 
     Intent single = new Intent("activity2");
     assertThat(PendingIntent.getActivity(context, 99, single, FLAG_NO_CREATE))
-        .isSameAs(pendingIntent);
+        .isSameInstanceAs(pendingIntent);
 
     Intent[] backward = {new Intent("activity2"), new Intent("activity")};
     assertThat(PendingIntent.getActivities(context, 99, backward, FLAG_NO_CREATE)).isNull();
diff --git a/robolectric/src/test/java/org/robolectric/shadows/ShadowPhoneWindowTest.java b/robolectric/src/test/java/org/robolectric/shadows/ShadowPhoneWindowTest.java
index b534341..47be7c4 100644
--- a/robolectric/src/test/java/org/robolectric/shadows/ShadowPhoneWindowTest.java
+++ b/robolectric/src/test/java/org/robolectric/shadows/ShadowPhoneWindowTest.java
@@ -34,6 +34,6 @@
   public void getBackgroundDrawable() throws Exception {
     Drawable drawable = activity.getResources().getDrawable(android.R.drawable.bottom_bar);
     window.setBackgroundDrawable(drawable);
-    assertThat(shadowOf(window).getBackgroundDrawable()).isSameAs(drawable);
+    assertThat(shadowOf(window).getBackgroundDrawable()).isSameInstanceAs(drawable);
   }
 }
\ No newline at end of file
diff --git a/robolectric/src/test/java/org/robolectric/shadows/ShadowPowerManagerTest.java b/robolectric/src/test/java/org/robolectric/shadows/ShadowPowerManagerTest.java
index 04fac09..c93e586 100644
--- a/robolectric/src/test/java/org/robolectric/shadows/ShadowPowerManagerTest.java
+++ b/robolectric/src/test/java/org/robolectric/shadows/ShadowPowerManagerTest.java
@@ -72,13 +72,13 @@
     lock.acquire();
 
     assertThat(ShadowPowerManager.getLatestWakeLock()).isNotNull();
-    assertThat(ShadowPowerManager.getLatestWakeLock()).isSameAs(lock);
+    assertThat(ShadowPowerManager.getLatestWakeLock()).isSameInstanceAs(lock);
     assertThat(lock.isHeld()).isTrue();
 
     lock.release();
 
     assertThat(ShadowPowerManager.getLatestWakeLock()).isNotNull();
-    assertThat(ShadowPowerManager.getLatestWakeLock()).isSameAs(lock);
+    assertThat(ShadowPowerManager.getLatestWakeLock()).isSameInstanceAs(lock);
     assertThat(lock.isHeld()).isFalse();
 
     ShadowPowerManager.reset();
diff --git a/robolectric/src/test/java/org/robolectric/shadows/ShadowPreferenceGroupTest.java b/robolectric/src/test/java/org/robolectric/shadows/ShadowPreferenceGroupTest.java
index 5decabd..f21c21f 100644
--- a/robolectric/src/test/java/org/robolectric/shadows/ShadowPreferenceGroupTest.java
+++ b/robolectric/src/test/java/org/robolectric/shadows/ShadowPreferenceGroupTest.java
@@ -85,8 +85,8 @@
     group.addPreference(pref1);
     group.addPreference(pref2);
 
-    assertThat(group.getPreference(0)).isSameAs(pref1);
-    assertThat(group.getPreference(1)).isSameAs(pref2);
+    assertThat(group.getPreference(0)).isSameInstanceAs(pref1);
+    assertThat(group.getPreference(1)).isSameInstanceAs(pref2);
   }
 
   @Test
@@ -132,8 +132,8 @@
     group.addPreference(pref1);
     group.addPreference(pref2);
 
-    assertThat(group.findPreference(pref1.getKey())).isSameAs(pref1);
-    assertThat(group.findPreference(pref2.getKey())).isSameAs(pref2);
+    assertThat(group.findPreference(pref1.getKey())).isSameInstanceAs(pref1);
+    assertThat(group.findPreference(pref2.getKey())).isSameInstanceAs(pref2);
   }
 
   @Test
@@ -145,7 +145,7 @@
     group.addPreference(pref1);
     group.addPreference(group2);
 
-    assertThat(group.findPreference(pref2.getKey())).isSameAs(pref2);
+    assertThat(group.findPreference(pref2.getKey())).isSameInstanceAs(pref2);
   }
 
   @Test
diff --git a/robolectric/src/test/java/org/robolectric/shadows/ShadowRatingBarTest.java b/robolectric/src/test/java/org/robolectric/shadows/ShadowRatingBarTest.java
index 75313c7..f50d4a9 100644
--- a/robolectric/src/test/java/org/robolectric/shadows/ShadowRatingBarTest.java
+++ b/robolectric/src/test/java/org/robolectric/shadows/ShadowRatingBarTest.java
@@ -28,7 +28,7 @@
 
   @Test
   public void testOnSeekBarChangedListener() {
-    assertThat(ratingBar.getOnRatingBarChangeListener()).isSameAs(listener);
+    assertThat(ratingBar.getOnRatingBarChangeListener()).isSameInstanceAs(listener);
     ratingBar.setOnRatingBarChangeListener(null);
     assertThat(ratingBar.getOnRatingBarChangeListener()).isNull();
   }
diff --git a/robolectric/src/test/java/org/robolectric/shadows/ShadowRemoteCallbackListTest.java b/robolectric/src/test/java/org/robolectric/shadows/ShadowRemoteCallbackListTest.java
index d75330c..ad68b02 100644
--- a/robolectric/src/test/java/org/robolectric/shadows/ShadowRemoteCallbackListTest.java
+++ b/robolectric/src/test/java/org/robolectric/shadows/ShadowRemoteCallbackListTest.java
@@ -20,7 +20,7 @@
 
     fooRemoteCallbackList.beginBroadcast();
 
-    assertThat(fooRemoteCallbackList.getBroadcastItem(0)).isSameAs(callback);
+    assertThat(fooRemoteCallbackList.getBroadcastItem(0)).isSameInstanceAs(callback);
   }
 
   public static class Foo implements IInterface {
diff --git a/robolectric/src/test/java/org/robolectric/shadows/ShadowSQLiteConnectionTest.java b/robolectric/src/test/java/org/robolectric/shadows/ShadowSQLiteConnectionTest.java
index a1206a9..e7fc1ed 100644
--- a/robolectric/src/test/java/org/robolectric/shadows/ShadowSQLiteConnectionTest.java
+++ b/robolectric/src/test/java/org/robolectric/shadows/ShadowSQLiteConnectionTest.java
@@ -2,6 +2,7 @@
 
 import static android.os.Build.VERSION_CODES.LOLLIPOP;
 import static com.google.common.truth.Truth.assertThat;
+import static com.google.common.truth.Truth.assertWithMessage;
 import static org.junit.Assert.fail;
 import static org.robolectric.shadows.ShadowSQLiteConnection.convertSQLWithLocalizedUnicodeCollator;
 
@@ -94,39 +95,39 @@
   @Test
   public void nativeOpen_addsConnectionToPool() {
     assertThat(conn).isNotNull();
-    assertThat(conn.isOpen()).named("open").isTrue();
+    assertWithMessage("open").that(conn.isOpen()).isTrue();
   }
     
   @Test
   public void nativeClose_closesConnection() {
     ShadowSQLiteConnection.nativeClose(ptr);
-    assertThat(conn.isOpen()).named("open").isFalse();
+    assertWithMessage("open").that(conn.isOpen()).isFalse();
   }
     
   @Test
   public void reset_closesConnection() {
     ShadowSQLiteConnection.reset();
-    assertThat(conn.isOpen()).named("open").isFalse();
+    assertWithMessage("open").that(conn.isOpen()).isFalse();
   }
 
   @Test
   public void reset_clearsConnectionCache() {
     final Map<Long, SQLiteConnection> connectionsMap = ReflectionHelpers.getField(CONNECTIONS, "connectionsMap");
 
-    assertThat(connectionsMap).named("connections before").isNotEmpty();
+    assertWithMessage("connections before").that(connectionsMap).isNotEmpty();
     ShadowSQLiteConnection.reset();
 
-    assertThat(connectionsMap).named("connections after").isEmpty();
+    assertWithMessage("connections after").that(connectionsMap).isEmpty();
   }
   
   @Test
   public void reset_clearsStatementCache() {
     final Map<Long, SQLiteStatement> statementsMap = ReflectionHelpers.getField(CONNECTIONS, "statementsMap");
 
-    assertThat(statementsMap).named("statements before").isNotEmpty();
+    assertWithMessage("statements before").that(statementsMap).isNotEmpty();
     ShadowSQLiteConnection.reset();
 
-    assertThat(statementsMap).named("statements after").isEmpty();
+    assertWithMessage("statements after").that(statementsMap).isEmpty();
   }
 
   @Test
diff --git a/robolectric/src/test/java/org/robolectric/shadows/ShadowSeekBarTest.java b/robolectric/src/test/java/org/robolectric/shadows/ShadowSeekBarTest.java
index c462c60..2ef14a7 100644
--- a/robolectric/src/test/java/org/robolectric/shadows/ShadowSeekBarTest.java
+++ b/robolectric/src/test/java/org/robolectric/shadows/ShadowSeekBarTest.java
@@ -31,7 +31,7 @@
 
   @Test
   public void testOnSeekBarChangedListener() {
-    assertThat(shadow.getOnSeekBarChangeListener()).isSameAs(listener);
+    assertThat(shadow.getOnSeekBarChangeListener()).isSameInstanceAs(listener);
     seekBar.setOnSeekBarChangeListener(null);
     assertThat(shadow.getOnSeekBarChangeListener()).isNull();
   }
diff --git a/robolectric/src/test/java/org/robolectric/shadows/ShadowSensorManagerTest.java b/robolectric/src/test/java/org/robolectric/shadows/ShadowSensorManagerTest.java
index 29484cc..7e65ddb 100644
--- a/robolectric/src/test/java/org/robolectric/shadows/ShadowSensorManagerTest.java
+++ b/robolectric/src/test/java/org/robolectric/shadows/ShadowSensorManagerTest.java
@@ -155,7 +155,7 @@
   public void getSensor_shouldBeConfigurable() {
     Sensor sensor = ShadowSensor.newInstance(Sensor.TYPE_ACCELEROMETER);
     shadowOf(sensorManager).addSensor(sensor);
-    assertThat(sensor).isSameAs(sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER));
+    assertThat(sensor).isSameInstanceAs(sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER));
   }
 
   @Test
diff --git a/robolectric/src/test/java/org/robolectric/shadows/ShadowServiceTest.java b/robolectric/src/test/java/org/robolectric/shadows/ShadowServiceTest.java
index 9493d8a..0deb481 100644
--- a/robolectric/src/test/java/org/robolectric/shadows/ShadowServiceTest.java
+++ b/robolectric/src/test/java/org/robolectric/shadows/ShadowServiceTest.java
@@ -74,9 +74,9 @@
   public void startForeground() {
     Notification n = notBuilder.build();
     service.startForeground(23, n);
-    assertThat(shadowOf(service).getLastForegroundNotification()).isSameAs(n);
+    assertThat(shadowOf(service).getLastForegroundNotification()).isSameInstanceAs(n);
     assertThat(shadowOf(service).getLastForegroundNotificationId()).isEqualTo(23);
-    assertThat(shadowOf(nm2).getNotification(23)).isSameAs(n);
+    assertThat(shadowOf(nm2).getNotification(23)).isSameInstanceAs(n);
     assertThat(n.flags & Notification.FLAG_FOREGROUND_SERVICE).isNotEqualTo(0);
   }
 
@@ -103,7 +103,7 @@
     Notification n = notBuilder.build();
     service.startForeground(21, n);
     service.stopForeground(false);
-    assertThat(shadowOf(nm2).getNotification(21)).isSameAs(n);
+    assertThat(shadowOf(nm2).getNotification(21)).isSameInstanceAs(n);
   }
 
   /**
diff --git a/robolectric/src/test/java/org/robolectric/shadows/ShadowShapeDrawableTest.java b/robolectric/src/test/java/org/robolectric/shadows/ShadowShapeDrawableTest.java
index ca02d62..25fd954 100644
--- a/robolectric/src/test/java/org/robolectric/shadows/ShadowShapeDrawableTest.java
+++ b/robolectric/src/test/java/org/robolectric/shadows/ShadowShapeDrawableTest.java
@@ -16,6 +16,6 @@
     ShapeDrawable shapeDrawable = new ShapeDrawable();
     Paint paint = shapeDrawable.getPaint();
     assertNotNull(paint);
-    assertThat(shapeDrawable.getPaint()).isSameAs(paint);
+    assertThat(shapeDrawable.getPaint()).isSameInstanceAs(paint);
   }
 }
diff --git a/robolectric/src/test/java/org/robolectric/shadows/ShadowSimpleCursorAdapterTest.java b/robolectric/src/test/java/org/robolectric/shadows/ShadowSimpleCursorAdapterTest.java
index eb3cb74..115d57b 100644
--- a/robolectric/src/test/java/org/robolectric/shadows/ShadowSimpleCursorAdapterTest.java
+++ b/robolectric/src/test/java/org/robolectric/shadows/ShadowSimpleCursorAdapterTest.java
@@ -31,7 +31,7 @@
 
     adapter.changeCursor(cursor);
 
-    assertThat(adapter.getCursor()).isSameAs(cursor);
+    assertThat(adapter.getCursor()).isSameInstanceAs(cursor);
   }
 
   @Test
@@ -43,7 +43,7 @@
 
     adapter.swapCursor(cursor);
 
-    assertThat(adapter.getCursor()).isSameAs(cursor);
+    assertThat(adapter.getCursor()).isSameInstanceAs(cursor);
   }
 
   @Test
diff --git a/robolectric/src/test/java/org/robolectric/shadows/ShadowSmsManagerTest.java b/robolectric/src/test/java/org/robolectric/shadows/ShadowSmsManagerTest.java
index 1ee2455..a6b59fb 100644
--- a/robolectric/src/test/java/org/robolectric/shadows/ShadowSmsManagerTest.java
+++ b/robolectric/src/test/java/org/robolectric/shadows/ShadowSmsManagerTest.java
@@ -90,8 +90,8 @@
     assertThat(params.getScAddress()).isEqualTo(scAddress);
     assertThat(params.getDestinationPort()).isEqualTo(destPort);
     assertThat(params.getData()).isEqualTo(data);
-    assertThat(params.getSentIntent()).isSameAs(sentIntent);
-    assertThat(params.getDeliveryIntent()).isSameAs(deliveryIntent);
+    assertThat(params.getSentIntent()).isSameInstanceAs(sentIntent);
+    assertThat(params.getDeliveryIntent()).isSameInstanceAs(deliveryIntent);
   }
 
   @Test(expected = IllegalArgumentException.class)
diff --git a/robolectric/src/test/java/org/robolectric/shadows/ShadowSpannableStringTest.java b/robolectric/src/test/java/org/robolectric/shadows/ShadowSpannableStringTest.java
index 31443c1..0d93e7e 100644
--- a/robolectric/src/test/java/org/robolectric/shadows/ShadowSpannableStringTest.java
+++ b/robolectric/src/test/java/org/robolectric/shadows/ShadowSpannableStringTest.java
@@ -23,7 +23,7 @@
 
   @Test
   public void testToString() {
-    assertThat(spanStr.toString()).isSameAs(TEST_STRING);
+    assertThat(spanStr.toString()).isSameInstanceAs(TEST_STRING);
   }
 
   @Test
@@ -47,7 +47,7 @@
     Object[] spans = spanStr.getSpans(0, TEST_STRING.length(), Object.class);
     assertThat(spans).isNotNull();
     assertThat(spans.length).isEqualTo(1);
-    assertThat((UnderlineSpan) spans[0]).isSameAs(s2);
+    assertThat((UnderlineSpan) spans[0]).isSameInstanceAs(s2);
   }
 
   @Test
@@ -65,35 +65,35 @@
     spans = spanStr.getSpans(0, TEST_STRING.length(), URLSpan.class);
     assertThat(spans).isNotNull();
     assertThat(spans.length).isEqualTo(1);
-    assertThat((URLSpan) spans[0]).isSameAs(s1);
+    assertThat((URLSpan) spans[0]).isSameInstanceAs(s1);
 
     spans = spanStr.getSpans(11, 35, Object.class);
     assertThat(spans).isNotNull();
     assertThat(spans.length).isEqualTo(1);
-    assertThat((UnderlineSpan) spans[0]).isSameAs(s2);
+    assertThat((UnderlineSpan) spans[0]).isSameInstanceAs(s2);
 
     spans = spanStr.getSpans(21, 35, Object.class);
     assertThat(spans).isNotNull();
     assertThat(spans.length).isEqualTo(1);
-    assertThat((UnderlineSpan) spans[0]).isSameAs(s2);
+    assertThat((UnderlineSpan) spans[0]).isSameInstanceAs(s2);
 
     spans = spanStr.getSpans(5, 15, Object.class);
     assertThat(spans).isNotNull();
     assertThat(spans.length).isEqualTo(1);
-    assertThat((URLSpan) spans[0]).isSameAs(s1);
+    assertThat((URLSpan) spans[0]).isSameInstanceAs(s1);
   }
 
   private void assertBothSpans(URLSpan s1, UnderlineSpan s2) {
     Object[] spans = spanStr.getSpans(0, TEST_STRING.length(), Object.class);
     if (spans[0] instanceof URLSpan) {
-      assertThat((URLSpan) spans[0]).isSameAs(s1);
+      assertThat((URLSpan) spans[0]).isSameInstanceAs(s1);
     } else {
-      assertThat((UnderlineSpan) spans[0]).isSameAs(s2);
+      assertThat((UnderlineSpan) spans[0]).isSameInstanceAs(s2);
     }
     if (spans[1] instanceof UnderlineSpan) {
-      assertThat((UnderlineSpan) spans[1]).isSameAs(s2);
+      assertThat((UnderlineSpan) spans[1]).isSameInstanceAs(s2);
     } else {
-      assertThat((URLSpan) spans[1]).isSameAs(s1);
+      assertThat((URLSpan) spans[1]).isSameInstanceAs(s1);
     }
   }
 
diff --git a/robolectric/src/test/java/org/robolectric/shadows/ShadowSubscriptionManagerTest.java b/robolectric/src/test/java/org/robolectric/shadows/ShadowSubscriptionManagerTest.java
index fef53ef..5bd2f24 100644
--- a/robolectric/src/test/java/org/robolectric/shadows/ShadowSubscriptionManagerTest.java
+++ b/robolectric/src/test/java/org/robolectric/shadows/ShadowSubscriptionManagerTest.java
@@ -91,7 +91,7 @@
     shadowSubscriptionManager.setActiveSubscriptionInfos(expectedSubscriptionInfo);
 
     assertThat(shadowSubscriptionManager.getActiveSubscriptionInfo(123))
-        .isSameAs(expectedSubscriptionInfo);
+        .isSameInstanceAs(expectedSubscriptionInfo);
   }
 
   @Test
@@ -101,7 +101,7 @@
     shadowSubscriptionManager.setActiveSubscriptionInfos(expectedSubscriptionInfo);
 
     assertThat(shadowSubscriptionManager.getActiveSubscriptionInfoForSimSlotIndex(123))
-        .isSameAs(expectedSubscriptionInfo);
+        .isSameInstanceAs(expectedSubscriptionInfo);
   }
 
   @Test
diff --git a/robolectric/src/test/java/org/robolectric/shadows/ShadowTabHostTest.java b/robolectric/src/test/java/org/robolectric/shadows/ShadowTabHostTest.java
index 95eccbe..557ab19 100644
--- a/robolectric/src/test/java/org/robolectric/shadows/ShadowTabHostTest.java
+++ b/robolectric/src/test/java/org/robolectric/shadows/ShadowTabHostTest.java
@@ -49,8 +49,8 @@
     tabHost.addTab(foo);
     tabHost.addTab(bar);
 
-    assertThat(tabHost.getChildAt(0)).isSameAs(fooView);
-    assertThat(tabHost.getChildAt(1)).isSameAs(barView);
+    assertThat(tabHost.getChildAt(0)).isSameInstanceAs(fooView);
+    assertThat(tabHost.getChildAt(1)).isSameInstanceAs(barView);
   }
 
   @Test
@@ -64,8 +64,8 @@
     tabHost.addTab(bar);
     tabHost.addTab(baz);
 
-    assertThat(shadowOf(tabHost).getSpecByTag("Bar")).isSameAs(bar);
-    assertThat(shadowOf(tabHost).getSpecByTag("Baz")).isSameAs(baz);
+    assertThat(shadowOf(tabHost).getSpecByTag("Bar")).isSameInstanceAs(bar);
+    assertThat(shadowOf(tabHost).getSpecByTag("Baz")).isSameInstanceAs(baz);
     assertNull(shadowOf(tabHost).getSpecByTag("Whammie"));
   }
 
diff --git a/robolectric/src/test/java/org/robolectric/shadows/ShadowTabSpecTest.java b/robolectric/src/test/java/org/robolectric/shadows/ShadowTabSpecTest.java
index 702e079..ef917e1 100644
--- a/robolectric/src/test/java/org/robolectric/shadows/ShadowTabSpecTest.java
+++ b/robolectric/src/test/java/org/robolectric/shadows/ShadowTabSpecTest.java
@@ -34,8 +34,8 @@
     TabHost.TabSpec spec = new TabHost(context).newTabSpec("foo");
     View view = new View(context);
     TabHost.TabSpec self = spec.setIndicator(view);
-    assertThat(self).isSameAs(spec);
-    assertThat(shadowOf(spec).getIndicatorAsView()).isSameAs(view);
+    assertThat(self).isSameInstanceAs(spec);
+    assertThat(shadowOf(spec).getIndicatorAsView()).isSameInstanceAs(view);
   }
 
   @Test
@@ -43,8 +43,8 @@
     TabHost.TabSpec spec = new TabHost(context).newTabSpec("foo");
     Intent intent = new Intent();
     TabHost.TabSpec self = spec.setContent(intent);
-    assertThat(self).isSameAs(spec);
-    assertThat(shadowOf(spec).getContentAsIntent()).isSameAs(intent);
+    assertThat(self).isSameInstanceAs(spec);
+    assertThat(shadowOf(spec).getContentAsIntent()).isSameInstanceAs(intent);
   }
 
   @Test
@@ -66,7 +66,7 @@
 
     assertThat(shadowOf(spec).getIndicatorLabel()).isEqualTo("labelText");
     assertThat(shadowOf(spec).getText()).isEqualTo("labelText");
-    assertThat(shadowOf(spec).getIndicatorIcon()).isSameAs(icon1);
+    assertThat(shadowOf(spec).getIndicatorIcon()).isSameInstanceAs(icon1);
   }
 
   @Test
diff --git a/robolectric/src/test/java/org/robolectric/shadows/ShadowTest.java b/robolectric/src/test/java/org/robolectric/shadows/ShadowTest.java
index 8646217..59ef9b9 100644
--- a/robolectric/src/test/java/org/robolectric/shadows/ShadowTest.java
+++ b/robolectric/src/test/java/org/robolectric/shadows/ShadowTest.java
@@ -23,18 +23,18 @@
   @Test
   public void newInstanceOf() throws Exception {
     assertThat(Shadow.newInstanceOf(Activity.class.getName()).getClass().getClassLoader())
-        .isSameAs(myClassLoader);
+        .isSameInstanceAs(myClassLoader);
   }
 
   @Test
   public void extractor() throws Exception {
     Activity activity = new Activity();
-    assertThat((ShadowActivity) Shadow.extract(activity)).isSameAs(shadowOf(activity));
+    assertThat((ShadowActivity) Shadow.extract(activity)).isSameInstanceAs(shadowOf(activity));
   }
 
   @Test
   public void otherDeprecated_extractor() throws Exception {
     Activity activity = new Activity();
-    assertThat(Shadow.<Object>extract(activity)).isSameAs(shadowOf(activity));
+    assertThat(Shadow.<Object>extract(activity)).isSameInstanceAs(shadowOf(activity));
   }
 }
diff --git a/robolectric/src/test/java/org/robolectric/shadows/ShadowTextViewTest.java b/robolectric/src/test/java/org/robolectric/shadows/ShadowTextViewTest.java
index 7a4381b..cf95730 100644
--- a/robolectric/src/test/java/org/robolectric/shadows/ShadowTextViewTest.java
+++ b/robolectric/src/test/java/org/robolectric/shadows/ShadowTextViewTest.java
@@ -73,7 +73,7 @@
 
     textView.onEditorAction(EditorInfo.IME_ACTION_GO);
 
-    assertThat(actionListener.textView).isSameAs(textView);
+    assertThat(actionListener.textView).isSameInstanceAs(textView);
     assertThat(actionListener.sentImeId).isEqualTo(EditorInfo.IME_ACTION_GO);
   }
 
@@ -83,7 +83,7 @@
 
     textView.setOnEditorActionListener(actionListener);
 
-    assertThat(shadowOf(textView).getOnEditorActionListener()).isSameAs(actionListener);
+    assertThat(shadowOf(textView).getOnEditorActionListener()).isSameInstanceAs(actionListener);
   }
 
   @Test
@@ -111,7 +111,7 @@
 
     assertNull(textView.getMovementMethod());
     textView.setMovementMethod(movement);
-    assertThat(textView.getMovementMethod()).isSameAs(movement);
+    assertThat(textView.getMovementMethod()).isSameInstanceAs(movement);
   }
 
   @Test
@@ -398,7 +398,7 @@
   public void canSetAndGetInputFilters() throws Exception {
     final InputFilter[] expectedFilters = new InputFilter[]{new InputFilter.LengthFilter(1)};
     textView.setFilters(expectedFilters);
-    assertThat(textView.getFilters()).isSameAs(expectedFilters);
+    assertThat(textView.getFilters()).isSameInstanceAs(expectedFilters);
   }
 
   @Test
diff --git a/robolectric/src/test/java/org/robolectric/shadows/ShadowTimeZoneFinderQTest.java b/robolectric/src/test/java/org/robolectric/shadows/ShadowTimeZoneFinderQTest.java
index c204512..231eace 100644
--- a/robolectric/src/test/java/org/robolectric/shadows/ShadowTimeZoneFinderQTest.java
+++ b/robolectric/src/test/java/org/robolectric/shadows/ShadowTimeZoneFinderQTest.java
@@ -33,7 +33,7 @@
                     ClassParameter.from(String.class, "us"));
 
     assertThat(timezones.stream().map(TimeZone::getID).collect(Collectors.toList()))
-            .containsAllOf("America/Los_Angeles", "America/New_York", "Pacific/Honolulu");
+            .containsAtLeast("America/Los_Angeles", "America/New_York", "Pacific/Honolulu");
   }
 }
 // END-INTERNAL
diff --git a/robolectric/src/test/java/org/robolectric/shadows/ShadowTimeZoneFinderSTest.java b/robolectric/src/test/java/org/robolectric/shadows/ShadowTimeZoneFinderSTest.java
new file mode 100644
index 0000000..64ed056
--- /dev/null
+++ b/robolectric/src/test/java/org/robolectric/shadows/ShadowTimeZoneFinderSTest.java
@@ -0,0 +1,55 @@
+/*
+ * Copyright (C) 2020 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.
+ */
+
+// BEGIN-INTERNAL
+package org.robolectric.shadows;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static android.os.Build.VERSION_CODES.S;
+import static com.google.common.truth.Truth.assertThat;
+
+import android.icu.util.TimeZone;
+import androidx.test.ext.junit.runners.AndroidJUnit4;
+import java.util.List;
+import java.util.stream.Collectors;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.robolectric.annotation.Config;
+import org.robolectric.util.ReflectionHelpers;
+import org.robolectric.util.ReflectionHelpers.ClassParameter;
+
+/** Unit tests for {@link ShadowTimeZoneFinderS}. */
+@RunWith(AndroidJUnit4.class)
+public class ShadowTimeZoneFinderSTest {
+
+  @Test
+  @Config(minSdk = S)
+  public void lookupTimeZonesByCountry_shouldReturnExpectedTimeZones() throws Exception {
+    Class<?> cls = Class.forName("com.android.i18n.timezone.TimeZoneFinder");
+    Object timeZoneFinder = ReflectionHelpers.callStaticMethod(cls, "getInstance");
+    List<TimeZone> timezones =
+            ReflectionHelpers.callInstanceMethod(
+                    cls,
+                    timeZoneFinder,
+                    "lookupTimeZonesByCountry",
+                    ClassParameter.from(String.class, "us"));
+
+    assertThat(timezones.stream().map(TimeZone::getID).collect(Collectors.toList()))
+            .containsAtLeast("America/Los_Angeles", "America/New_York", "Pacific/Honolulu");
+  }
+}
+// END-INTERNAL
diff --git a/robolectric/src/test/java/org/robolectric/shadows/ShadowTimeZoneFinderTest.java b/robolectric/src/test/java/org/robolectric/shadows/ShadowTimeZoneFinderTest.java
index 433c139..962eaff 100644
--- a/robolectric/src/test/java/org/robolectric/shadows/ShadowTimeZoneFinderTest.java
+++ b/robolectric/src/test/java/org/robolectric/shadows/ShadowTimeZoneFinderTest.java
@@ -31,6 +31,6 @@
             ClassParameter.from(String.class, "us"));
 
     assertThat(timezones.stream().map(TimeZone::getID).collect(Collectors.toList()))
-        .containsAllOf("America/Los_Angeles", "America/New_York", "Pacific/Honolulu");
+        .containsAtLeast("America/Los_Angeles", "America/New_York", "Pacific/Honolulu");
   }
 }
diff --git a/robolectric/src/test/java/org/robolectric/shadows/ShadowToastTest.java b/robolectric/src/test/java/org/robolectric/shadows/ShadowToastTest.java
index 8f5e1e6..9682483 100644
--- a/robolectric/src/test/java/org/robolectric/shadows/ShadowToastTest.java
+++ b/robolectric/src/test/java/org/robolectric/shadows/ShadowToastTest.java
@@ -45,7 +45,7 @@
     assertThat(toast).isNotNull();
     assertThat(toast.getDuration()).isEqualTo(Toast.LENGTH_SHORT);
     toast.show();
-    assertThat(ShadowToast.getLatestToast()).isSameAs(toast);
+    assertThat(ShadowToast.getLatestToast()).isSameInstanceAs(toast);
     assertThat(ShadowToast.getTextOfLatestToast()).isEqualTo("short toast");
     assertThat(ShadowToast.showedToast("short toast")).isTrue();
   }
@@ -55,7 +55,7 @@
     Toast toast = Toast.makeText(context, "short toast", Toast.LENGTH_SHORT);
     toast.setText("other toast");
     toast.show();
-    assertThat(ShadowToast.getLatestToast()).isSameAs(toast);
+    assertThat(ShadowToast.getLatestToast()).isSameInstanceAs(toast);
     assertThat(ShadowToast.getTextOfLatestToast()).isEqualTo("other toast");
     assertThat(ShadowToast.showedToast("other toast")).isTrue();
   }
@@ -65,7 +65,7 @@
     Toast toast = Toast.makeText(context, "short toast", Toast.LENGTH_SHORT);
     toast.setText(R.string.hello);
     toast.show();
-    assertThat(ShadowToast.getLatestToast()).isSameAs(toast);
+    assertThat(ShadowToast.getLatestToast()).isSameInstanceAs(toast);
     assertThat(ShadowToast.getTextOfLatestToast()).isEqualTo("Hello");
     assertThat(ShadowToast.showedToast("Hello")).isTrue();
   }
@@ -76,7 +76,7 @@
     toast.setDuration(Toast.LENGTH_SHORT);
     final View view = new TextView(context);
     toast.setView(view);
-    assertThat(toast.getView()).isSameAs(view);
+    assertThat(toast.getView()).isSameInstanceAs(view);
   }
 
   @Test
diff --git a/robolectric/src/test/java/org/robolectric/shadows/ShadowUserManagerTest.java b/robolectric/src/test/java/org/robolectric/shadows/ShadowUserManagerTest.java
index e05b8f8..367452d 100644
--- a/robolectric/src/test/java/org/robolectric/shadows/ShadowUserManagerTest.java
+++ b/robolectric/src/test/java/org/robolectric/shadows/ShadowUserManagerTest.java
@@ -83,6 +83,12 @@
   }
 
   @Test
+  @Config(minSdk = JELLY_BEAN_MR2)
+  public void verifyNoUserRestrictions() {
+    assertThat(userManager.getUserRestrictions().size()).isEqualTo(0);
+  }
+
+  @Test
   @Config(minSdk = LOLLIPOP)
   public void hasUserRestriction() {
     assertThat(userManager.hasUserRestriction(UserManager.ENSURE_VERIFY_APPS)).isFalse();
@@ -96,8 +102,6 @@
   @Test
   @Config(minSdk = JELLY_BEAN_MR2)
   public void getUserRestrictions() {
-    assertThat(userManager.getUserRestrictions().size()).isEqualTo(0);
-
     UserHandle userHandle = Process.myUserHandle();
     shadowOf(userManager).setUserRestriction(userHandle, UserManager.ENSURE_VERIFY_APPS, true);
 
@@ -117,8 +121,17 @@
 
   @Test
   @Config(minSdk = JELLY_BEAN_MR2)
+  public void setUserRestrictions() {
+    userManager.setUserRestriction(UserManager.ENSURE_VERIFY_APPS, true);
+
+    Bundle restrictions = userManager.getUserRestrictions();
+    assertThat(restrictions.size()).isEqualTo(1);
+    assertThat(restrictions.getBoolean(UserManager.ENSURE_VERIFY_APPS)).isTrue();
+  }
+
+  @Test
+  @Config(minSdk = JELLY_BEAN_MR2)
   public void clearUserRestrictions() {
-    assertThat(userManager.getUserRestrictions().size()).isEqualTo(0);
     shadowOf(userManager)
         .setUserRestriction(Process.myUserHandle(), UserManager.ENSURE_VERIFY_APPS, true);
     assertThat(userManager.getUserRestrictions().size()).isEqualTo(1);
diff --git a/robolectric/src/test/java/org/robolectric/shadows/ShadowValueAnimatorTest.java b/robolectric/src/test/java/org/robolectric/shadows/ShadowValueAnimatorTest.java
index 84157ee..49da69b 100644
--- a/robolectric/src/test/java/org/robolectric/shadows/ShadowValueAnimatorTest.java
+++ b/robolectric/src/test/java/org/robolectric/shadows/ShadowValueAnimatorTest.java
@@ -33,7 +33,7 @@
     });
     animator.start();
 
-    assertThat(values).isOrdered(Ordering.natural());
+    assertThat(values).isInOrder(Ordering.natural());
   }
 
   @Test
diff --git a/robolectric/src/test/java/org/robolectric/shadows/ShadowVibratorTest.java b/robolectric/src/test/java/org/robolectric/shadows/ShadowVibratorTest.java
index b51713a..630c1e5 100644
--- a/robolectric/src/test/java/org/robolectric/shadows/ShadowVibratorTest.java
+++ b/robolectric/src/test/java/org/robolectric/shadows/ShadowVibratorTest.java
@@ -5,6 +5,7 @@
 import static org.robolectric.Shadows.shadowOf;
 
 import android.content.Context;
+import android.os.VibrationEffect;
 import android.os.Vibrator;
 import androidx.test.core.app.ApplicationProvider;
 import androidx.test.ext.junit.runners.AndroidJUnit4;
@@ -51,14 +52,15 @@
     assertThat(shadowOf(vibrator).isVibrating()).isTrue();
     assertThat(shadowOf(vibrator).getMilliseconds()).isEqualTo(5000L);
 
+    // Wait for vibrator to stop.
     Robolectric.getForegroundThreadScheduler().advanceToNextPostedRunnable();
     assertThat(shadowOf(vibrator).isVibrating()).isFalse();
   }
 
   @Test
   public void vibratePattern() {
-    long[] pattern = new long[] { 0, 200 };
-    vibrator.vibrate(pattern, 1);
+    long[] pattern = new long[]{0, 200};
+    vibrator.vibrate(pattern, 1 /* repeat */);
 
     assertThat(shadowOf(vibrator).isVibrating()).isTrue();
     assertThat(shadowOf(vibrator).getPattern()).isEqualTo(pattern);
@@ -66,6 +68,46 @@
   }
 
   @Test
+  public void vibrateWaveformEffect() {
+    long[] pattern = new long[]{0, 200};
+    vibrator.vibrate(VibrationEffect.createWaveform(pattern, 0 /* repeat */));
+
+    assertThat(shadowOf(vibrator).isVibrating()).isTrue();
+    assertThat(shadowOf(vibrator).getPattern()).isEqualTo(pattern);
+    assertThat(shadowOf(vibrator).getRepeat()).isEqualTo(0);
+  }
+
+  @Test
+  public void vibrateOneShotEffect() {
+    vibrator.vibrate(VibrationEffect.createOneShot(100, VibrationEffect.DEFAULT_AMPLITUDE));
+
+    assertThat(shadowOf(vibrator).isVibrating()).isTrue();
+    assertThat(shadowOf(vibrator).getMilliseconds()).isEqualTo(100L);
+
+    // Wait for vibrator to stop.
+    Robolectric.getForegroundThreadScheduler().advanceToNextPostedRunnable();
+    assertThat(shadowOf(vibrator).isVibrating()).isFalse();
+  }
+
+  @Test
+  public void vibratePredefinedEffect() {
+    vibrator.vibrate(VibrationEffect.get(VibrationEffect.EFFECT_CLICK));
+
+    assertThat(shadowOf(vibrator).isVibrating()).isFalse();
+    assertThat(shadowOf(vibrator).getMilliseconds()).isEqualTo(-1L);
+  }
+
+  @Test
+  public void vibrateComposedEffect() {
+    vibrator.vibrate(VibrationEffect.startComposition()
+            .addPrimitive(VibrationEffect.Composition.PRIMITIVE_CLICK)
+            .compose());
+
+    assertThat(shadowOf(vibrator).isVibrating()).isFalse();
+    assertThat(shadowOf(vibrator).getMilliseconds()).isEqualTo(-1L);
+  }
+
+  @Test
   public void cancelled() {
     vibrator.vibrate(5000);
     assertThat(shadowOf(vibrator).isVibrating()).isTrue();
diff --git a/robolectric/src/test/java/org/robolectric/shadows/ShadowVideoViewTest.java b/robolectric/src/test/java/org/robolectric/shadows/ShadowVideoViewTest.java
index 223af66..4720249 100644
--- a/robolectric/src/test/java/org/robolectric/shadows/ShadowVideoViewTest.java
+++ b/robolectric/src/test/java/org/robolectric/shadows/ShadowVideoViewTest.java
@@ -26,7 +26,7 @@
     TestPreparedListener l = new TestPreparedListener();
     view.setOnPreparedListener(l);
     ShadowVideoView shadowVideoView = shadowOf(view);
-    assertThat(shadowVideoView.getOnPreparedListener()).isSameAs(l);
+    assertThat(shadowVideoView.getOnPreparedListener()).isSameInstanceAs(l);
   }
 
   @Test
@@ -34,7 +34,7 @@
     TestErrorListener l = new TestErrorListener();
     view.setOnErrorListener(l);
     ShadowVideoView shadowVideoView = shadowOf(view);
-    assertThat(shadowVideoView.getOnErrorListener()).isSameAs(l);
+    assertThat(shadowVideoView.getOnErrorListener()).isSameInstanceAs(l);
   }
 
   @Test
@@ -42,7 +42,7 @@
     TestCompletionListener l = new TestCompletionListener();
     view.setOnCompletionListener(l);
     ShadowVideoView shadowVideoView = shadowOf(view);
-    assertThat(shadowVideoView.getOnCompletionListener()).isSameAs(l);
+    assertThat(shadowVideoView.getOnCompletionListener()).isSameInstanceAs(l);
   }
 
   @Test
diff --git a/robolectric/src/test/java/org/robolectric/shadows/ShadowViewGroupTest.java b/robolectric/src/test/java/org/robolectric/shadows/ShadowViewGroupTest.java
index 8e6d1dd..0376b92 100644
--- a/robolectric/src/test/java/org/robolectric/shadows/ShadowViewGroupTest.java
+++ b/robolectric/src/test/java/org/robolectric/shadows/ShadowViewGroupTest.java
@@ -92,7 +92,7 @@
     };
     root.setLayoutAnimationListener(animationListener);
 
-    assertThat(root.getLayoutAnimationListener()).isSameAs(animationListener);
+    assertThat(root.getLayoutAnimationListener()).isSameInstanceAs(animationListener);
   }
 
   @Test
@@ -100,7 +100,7 @@
     assertThat(root.getLayoutAnimation()).isNull();
     LayoutAnimationController layoutAnim = new LayoutAnimationController(context, null);
     root.setLayoutAnimation(layoutAnim);
-    assertThat(root.getLayoutAnimation()).isSameAs(layoutAnim);
+    assertThat(root.getLayoutAnimation()).isSameInstanceAs(layoutAnim);
   }
 
   @Test
@@ -108,8 +108,8 @@
     root.removeViewAt(1);
 
     assertThat(root.getChildCount()).isEqualTo(2);
-    assertThat(root.getChildAt(0)).isSameAs(child1);
-    assertThat(root.getChildAt(1)).isSameAs((View) child3);
+    assertThat(root.getChildAt(0)).isSameInstanceAs(child1);
+    assertThat(root.getChildAt(1)).isSameInstanceAs((View) child3);
 
     assertThat(child2.getParent()).isNull();
   }
@@ -120,9 +120,9 @@
     root.addView(child1);
     root.addView(child2);
     root.addView(child3, 1);
-    assertThat(root.getChildAt(0)).isSameAs(child1);
-    assertThat(root.getChildAt(1)).isSameAs((View) child3);
-    assertThat(root.getChildAt(2)).isSameAs(child2);
+    assertThat(root.getChildAt(0)).isSameInstanceAs(child1);
+    assertThat(root.getChildAt(1)).isSameInstanceAs((View) child3);
+    assertThat(root.getChildAt(2)).isSameInstanceAs(child2);
   }
 
   @Test
@@ -134,9 +134,9 @@
     root.addView(child1);
     root.addView(child2);
     root.addView(child3, 1);
-    assertThat((View) root.findViewWithTag("tag1")).isSameAs(child1);
-    assertThat((View) root.findViewWithTag("tag2")).isSameAs((View) child2);
-    assertThat((ViewGroup) root.findViewWithTag("tag3")).isSameAs(child3);
+    assertThat((View) root.findViewWithTag("tag1")).isSameInstanceAs(child1);
+    assertThat((View) root.findViewWithTag("tag2")).isSameInstanceAs((View) child2);
+    assertThat((ViewGroup) root.findViewWithTag("tag3")).isSameInstanceAs(child3);
   }
 
   @Test
@@ -166,13 +166,13 @@
     child3b.setTag("tag2");
 
     //can find views by tag from root
-    assertThat((View) root.findViewWithTag("tag1")).isSameAs(child1);
-    assertThat((View) root.findViewWithTag("tag2")).isSameAs((View) child2);
-    assertThat((ViewGroup) root.findViewWithTag("tag3")).isSameAs(child3);
+    assertThat((View) root.findViewWithTag("tag1")).isSameInstanceAs(child1);
+    assertThat((View) root.findViewWithTag("tag2")).isSameInstanceAs((View) child2);
+    assertThat((ViewGroup) root.findViewWithTag("tag3")).isSameInstanceAs(child3);
 
     //can find views by tag from child3
-    assertThat((View) child3.findViewWithTag("tag1")).isSameAs(child3a);
-    assertThat((View) child3.findViewWithTag("tag2")).isSameAs(child3b);
+    assertThat((View) child3.findViewWithTag("tag1")).isSameInstanceAs(child3a);
+    assertThat((View) child3.findViewWithTag("tag2")).isSameInstanceAs(child3b);
   }
 
   @Test
@@ -285,8 +285,8 @@
     assertThat(root.getChildCount()).isEqualTo(3);
     root.removeView(child1);
     assertThat(root.getChildCount()).isEqualTo(2);
-    assertThat(root.getChildAt(0)).isSameAs(child2);
-    assertThat(root.getChildAt(1)).isSameAs((View) child3);
+    assertThat(root.getChildAt(0)).isSameInstanceAs(child2);
+    assertThat(root.getChildAt(1)).isSameInstanceAs((View) child3);
     assertThat(child1.getParent()).isNull();
   }
 
@@ -296,7 +296,7 @@
     assertNotSame(child3a.getParent(), root);
     root.removeView(child3a);
     assertThat(root.getChildCount()).isEqualTo(3);
-    assertThat(child3a.getParent()).isSameAs((ViewParent) child3);
+    assertThat(child3a.getParent()).isSameInstanceAs((ViewParent) child3);
   }
 
   @Test
diff --git a/robolectric/src/test/java/org/robolectric/shadows/ShadowViewTest.java b/robolectric/src/test/java/org/robolectric/shadows/ShadowViewTest.java
index 0380aae..28b8f6e 100644
--- a/robolectric/src/test/java/org/robolectric/shadows/ShadowViewTest.java
+++ b/robolectric/src/test/java/org/robolectric/shadows/ShadowViewTest.java
@@ -3,6 +3,7 @@
 import static android.os.Build.VERSION_CODES.JELLY_BEAN_MR2;
 import static android.os.Build.VERSION_CODES.LOLLIPOP;
 import static com.google.common.truth.Truth.assertThat;
+import static com.google.common.truth.Truth.assertWithMessage;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertNotNull;
@@ -167,7 +168,7 @@
 
   @Test
   public void shouldKnowIfThisOrAncestorsAreVisible() throws Exception {
-    assertThat(view.isShown()).named("view isn't considered shown unless it has a view root").isFalse();
+    assertWithMessage("view isn't considered shown unless it has a view root").that(view.isShown()).isFalse();
     shadowOf(view).setMyParent(ReflectionHelpers.createNullProxy(ViewParent.class));
     assertThat(view.isShown()).isTrue();
     shadowOf(view).setMyParent(null);
@@ -283,7 +284,7 @@
   public void shouldRecordBackgroundDrawable() {
     Drawable drawable = new BitmapDrawable(BitmapFactory.decodeFile("some/fake/file"));
     view.setBackgroundDrawable(drawable);
-    assertThat(view.getBackground()).isSameAs(drawable);
+    assertThat(view.getBackground()).isSameInstanceAs(drawable);
     assertThat(ShadowView.visualize(view)).isEqualTo("background:\nBitmap for file:some/fake/file");
   }
 
@@ -389,13 +390,13 @@
   public void shouldSetAnimation() throws Exception {
     Animation anim = new TestAnimation();
     view.setAnimation(anim);
-    assertThat(view.getAnimation()).isSameAs(anim);
+    assertThat(view.getAnimation()).isSameInstanceAs(anim);
   }
 
   @Test
   public void shouldFindViewWithTag() {
     view.setTag("tagged");
-    assertThat((View) view.findViewWithTag("tagged")).isSameAs(view);
+    assertThat((View) view.findViewWithTag("tagged")).isSameInstanceAs(view);
   }
 
   @Test
@@ -432,7 +433,7 @@
   public void getViewTreeObserver_shouldReturnTheSameObserverFromMultipleCalls() throws Exception {
     ViewTreeObserver observer = view.getViewTreeObserver();
     assertThat(observer).isInstanceOf(ViewTreeObserver.class);
-    assertThat(view.getViewTreeObserver()).isSameAs(observer);
+    assertThat(view.getViewTreeObserver()).isSameInstanceAs(observer);
   }
 
   @Test
@@ -440,9 +441,9 @@
     TouchableView touchableView = new TouchableView(context);
     MotionEvent event = MotionEvent.obtain(0L, 0L, MotionEvent.ACTION_DOWN, 12f, 34f, 0);
     touchableView.dispatchTouchEvent(event);
-    assertThat(touchableView.event).isSameAs(event);
+    assertThat(touchableView.event).isSameInstanceAs(event);
     view.dispatchTouchEvent(event);
-    assertThat(shadowOf(view).getLastTouchEvent()).isSameAs(event);
+    assertThat(shadowOf(view).getLastTouchEvent()).isSameInstanceAs(event);
   }
 
   @Test
@@ -456,7 +457,7 @@
     });
     MotionEvent event = MotionEvent.obtain(0L, 0L, MotionEvent.ACTION_DOWN, 12f, 34f, 0);
     view.dispatchTouchEvent(event);
-    assertThat(shadowOf(view).getLastTouchEvent()).isSameAs(event);
+    assertThat(shadowOf(view).getLastTouchEvent()).isSameInstanceAs(event);
     assertThat(called.get()).isTrue();
   }
 
@@ -850,7 +851,7 @@
 
     WindowId windowId = parent.getWindowId();
     assertThat(windowId).isNotNull();
-    assertThat(child.getWindowId()).isSameAs(windowId);
+    assertThat(child.getWindowId()).isSameInstanceAs(windowId);
     assertThat(child.getWindowId()).isEqualTo(windowId); // equals must work!
 
     MyView anotherChild = new MyView("another child", transcript);
diff --git a/robolectric/src/test/java/org/robolectric/shadows/ShadowWebViewTest.java b/robolectric/src/test/java/org/robolectric/shadows/ShadowWebViewTest.java
index 0f57428..259f9d3 100644
--- a/robolectric/src/test/java/org/robolectric/shadows/ShadowWebViewTest.java
+++ b/robolectric/src/test/java/org/robolectric/shadows/ShadowWebViewTest.java
@@ -84,7 +84,7 @@
 
     assertThat(shadowOf(webView).getWebViewClient()).isNull();
     webView.setWebViewClient(webViewClient);
-    assertThat(shadowOf(webView).getWebViewClient()).isSameAs(webViewClient);
+    assertThat(shadowOf(webView).getWebViewClient()).isSameInstanceAs(webViewClient);
   }
 
   @Test
@@ -92,7 +92,7 @@
     WebChromeClient webChromeClient = new WebChromeClient();
     assertThat(shadowOf(webView).getWebChromeClient()).isNull();
     webView.setWebChromeClient(webChromeClient);
-    assertThat(shadowOf(webView).getWebChromeClient()).isSameAs(webChromeClient);
+    assertThat(shadowOf(webView).getWebChromeClient()).isSameInstanceAs(webChromeClient);
   }
 
   @Test
@@ -102,7 +102,7 @@
       Object obj = new Object();
       assertThat(shadowOf(webView).getJavascriptInterface(name)).isNull();
       webView.addJavascriptInterface(obj, name);
-      assertThat(shadowOf(webView).getJavascriptInterface(name)).isSameAs(obj);
+      assertThat(shadowOf(webView).getJavascriptInterface(name)).isSameInstanceAs(obj);
     }
   }
 
@@ -242,7 +242,7 @@
     assertThat(webView.getLayoutParams()).isNull();
     LayoutParams params = new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT);
     webView.setLayoutParams(params);
-    assertThat(webView.getLayoutParams()).isSameAs(params);
+    assertThat(webView.getLayoutParams()).isSameInstanceAs(params);
   }
 
   @Test
diff --git a/robolectric/src/test/java/org/robolectric/shadows/ShadowWifiManagerTest.java b/robolectric/src/test/java/org/robolectric/shadows/ShadowWifiManagerTest.java
index 5b03f59..05ad99c 100644
--- a/robolectric/src/test/java/org/robolectric/shadows/ShadowWifiManagerTest.java
+++ b/robolectric/src/test/java/org/robolectric/shadows/ShadowWifiManagerTest.java
@@ -46,7 +46,7 @@
   public void setWifiInfo_shouldUpdateWifiInfo() {
     WifiInfo wifiInfo = new WifiInfo();
     shadowOf(wifiManager).setConnectionInfo(wifiInfo);
-    assertThat(wifiManager.getConnectionInfo()).isSameAs(wifiInfo);
+    assertThat(wifiManager.getConnectionInfo()).isSameInstanceAs(wifiInfo);
   }
 
   @Test
@@ -144,14 +144,14 @@
   public void shouldReturnSetScanResults() throws Exception {
     List<ScanResult> scanResults = new ArrayList<>();
     shadowOf(wifiManager).setScanResults(scanResults);
-    assertThat(wifiManager.getScanResults()).isSameAs(scanResults);
+    assertThat(wifiManager.getScanResults()).isSameInstanceAs(scanResults);
   }
 
   @Test
   public void shouldReturnDhcpInfo() {
     DhcpInfo dhcpInfo = new DhcpInfo();
     shadowOf(wifiManager).setDhcpInfo(dhcpInfo);
-    assertThat(wifiManager.getDhcpInfo()).isSameAs(dhcpInfo);
+    assertThat(wifiManager.getDhcpInfo()).isSameInstanceAs(dhcpInfo);
   }
 
   @Test
@@ -160,7 +160,7 @@
     wifiConfiguration.networkId = -1;
     int networkId = wifiManager.addNetwork(wifiConfiguration);
     assertThat(networkId).isEqualTo(0);
-    assertThat(wifiManager.getConfiguredNetworks().get(0)).isNotSameAs(wifiConfiguration);
+    assertThat(wifiManager.getConfiguredNetworks().get(0)).isNotSameInstanceAs(wifiConfiguration);
     assertThat(wifiConfiguration.networkId).isEqualTo(-1);
     assertThat(wifiManager.getConfiguredNetworks().get(0).networkId).isEqualTo(0);
 
diff --git a/robolectric/src/test/java/org/robolectric/shadows/ShadowWindowManagerImplTest.java b/robolectric/src/test/java/org/robolectric/shadows/ShadowWindowManagerImplTest.java
index bf9dcbd..46ddef7 100644
--- a/robolectric/src/test/java/org/robolectric/shadows/ShadowWindowManagerImplTest.java
+++ b/robolectric/src/test/java/org/robolectric/shadows/ShadowWindowManagerImplTest.java
@@ -55,7 +55,7 @@
     List<View> views = ((ShadowWindowManagerImpl) shadowOf(windowManager)).getViews();
 
     assertThat(views).hasSize(1);
-    assertThat(views.get(0)).isSameAs(view);
+    assertThat(views.get(0)).isSameInstanceAs(view);
   }
 
   @Test
diff --git a/run_robolectric_module_tests.mk b/run_robolectric_module_tests.mk
index 8bb5edf..6cb0a24 100644
--- a/run_robolectric_module_tests.mk
+++ b/run_robolectric_module_tests.mk
@@ -35,7 +35,7 @@
 endif
 
 # Define rules that copy android-all jars to the intermediates folder.
-local_android_all_source_jar := $(call intermediates-dir-for, JAVA_LIBRARIES, robolectric_android-all-stub, , COMMON)/classes.jar
+local_android_all_source_jar := $(call java-lib-files,robolectric-host-android_all,HOST)
 android_all_source_dir := prebuilts/misc/common/robolectric/android-all
 android_all_target_dir := $(intermediates)/android-all
 copy_android_all_jar_pairs := \
@@ -52,7 +52,8 @@
   $(android_all_source_dir)/android-all-8.1.0-robolectric-4611349.jar:$(android_all_target_dir)/android-all-8.1.0-robolectric-4611349.jar \
   $(android_all_source_dir)/android-all-9-robolectric-4913185-2.jar:$(android_all_target_dir)/android-all-9-robolectric-4913185-2.jar \
   $(android_all_source_dir)/android-all-9plus-robolectric-5616371.jar:$(android_all_target_dir)/android-all-9plus-robolectric-5616371.jar \
-  $(local_android_all_source_jar):$(android_all_target_dir)/android-all-R-robolectric-r0.jar
+  $(android_all_source_dir)/android-all-R-beta2-robolectric-6625208.jar:$(android_all_target_dir)/android-all-R-beta2-robolectric-6625208.jar \
+  $(local_android_all_source_jar):$(android_all_target_dir)/android-all-S-robolectric-r0.jar
 copy_android_all_jars := $(call copy-many-files, $(copy_android_all_jar_pairs))
 
 # If debugging the tests was requested, set up the JVM parameters to enable it.
diff --git a/run_robotests.mk b/run_robotests.mk
index 8e70760..e69eb1c 100644
--- a/run_robotests.mk
+++ b/run_robotests.mk
@@ -105,6 +105,7 @@
     # The jars needed to run the tests.
     my_jars := \
         $(my_robolectric_jars) \
+        $(call java-lib-files,robolectric-host-android_all,HOST) \
         $(call java-lib-files,junitxml) \
         $(my_srcs_jars)
 
@@ -116,7 +117,7 @@
     my_filename_stem := test
 
     # Define rules that copy android-all jars to the intermediates folder.
-    local_android_all_source_jar := $(call intermediates-dir-for, JAVA_LIBRARIES, robolectric_android-all-stub,,COMMON)/classes.jar
+    local_android_all_source_jar := $(call java-lib-files,robolectric-host-android_all,HOST)
     android_all_lib_path := prebuilts/misc/common/robolectric/android-all
     my_robolectric_path := $(intermediates.COMMON)/android-all
     copy_android_all_jar_pairs := \
@@ -133,7 +134,8 @@
       $(android_all_lib_path)/android-all-8.1.0-robolectric-4611349.jar:$(my_robolectric_path)/android-all-8.1.0-robolectric-4611349.jar \
       $(android_all_lib_path)/android-all-9-robolectric-4913185-2.jar:$(my_robolectric_path)/android-all-9-robolectric-4913185-2.jar \
       $(android_all_lib_path)/android-all-10-robolectric-5803371.jar:$(my_robolectric_path)/android-all-10-robolectric-5803371.jar \
-      $(local_android_all_source_jar):$(my_robolectric_path)/android-all-R-robolectric-r0.jar
+      $(android_all_lib_path)/android-all-R-beta2-robolectric-6625208.jar:$(my_robolectric_path)/android-all-R-beta2-robolectric-6625208.jar \
+      $(local_android_all_source_jar):$(my_robolectric_path)/android-all-S-robolectric-r0.jar
     copy_android_all_jars := $(call copy-many-files, $(copy_android_all_jar_pairs))
 
     $(my_target): $(copy_android_all_jars)
diff --git a/sandbox/Android.bp b/sandbox/Android.bp
index 8664c45..cad5fd5 100644
--- a/sandbox/Android.bp
+++ b/sandbox/Android.bp
@@ -2,6 +2,15 @@
 // Compile Robolectric sandbox
 //#############################################
 
+package {
+    // See: http://go/android-license-faq
+    // A large-scale-change added 'default_applicable_licenses' to import
+    // all of the 'license_kinds' from "external_robolectric-shadows_license"
+    // to get the below license kinds:
+    //   SPDX-license-identifier-Apache-2.0
+    default_applicable_licenses: ["external_robolectric-shadows_license"],
+}
+
 java_library_host {
     name: "Robolectric_sandbox",
     srcs: ["src/main/java/**/*.java"],
diff --git a/sandbox/Android.mk b/sandbox/Android.mk
index 41c1d13..360672c 100644
--- a/sandbox/Android.mk
+++ b/sandbox/Android.mk
@@ -6,6 +6,9 @@
 include $(CLEAR_VARS)
 
 LOCAL_MODULE := Run_robolectric_sandbox_tests
+LOCAL_LICENSE_KINDS := SPDX-license-identifier-Apache-2.0
+LOCAL_LICENSE_CONDITIONS := notice
+LOCAL_NOTICE_FILE := $(LOCAL_PATH)/../LICENSE
 
 test_source_directory := $(LOCAL_PATH)/src/test/java
 
diff --git a/sandbox/src/test/java/org/robolectric/ShadowingTest.java b/sandbox/src/test/java/org/robolectric/ShadowingTest.java
index 2760f5f..6d22100 100644
--- a/sandbox/src/test/java/org/robolectric/ShadowingTest.java
+++ b/sandbox/src/test/java/org/robolectric/ShadowingTest.java
@@ -30,7 +30,7 @@
     Object arg = mock(Object.class);
     AccountManager.get(arg);
     assertThat(ShadowAccountManagerForTests.wasCalled).isTrue();
-    assertThat(ShadowAccountManagerForTests.arg).isSameAs(arg);
+    assertThat(ShadowAccountManagerForTests.arg).isSameInstanceAs(arg);
   }
 
   @Implements(AccountManager.class)
diff --git a/sandbox/src/test/java/org/robolectric/ThreadSafetyTest.java b/sandbox/src/test/java/org/robolectric/ThreadSafetyTest.java
index eb20d40..d09b308 100644
--- a/sandbox/src/test/java/org/robolectric/ThreadSafetyTest.java
+++ b/sandbox/src/test/java/org/robolectric/ThreadSafetyTest.java
@@ -28,7 +28,7 @@
 
       instrumentedThread.join();
       Object shadowFromOtherThread = field.get(instrumentedThread);
-      assertThat(shadowFromThisThread).isSameAs(shadowFromOtherThread);
+      assertThat(shadowFromThisThread).isSameInstanceAs(shadowFromOtherThread);
     }
   }
 
diff --git a/sandbox/src/test/java/org/robolectric/internal/bytecode/ProxyMakerTest.java b/sandbox/src/test/java/org/robolectric/internal/bytecode/ProxyMakerTest.java
index 1408f1b..ee74506 100644
--- a/sandbox/src/test/java/org/robolectric/internal/bytecode/ProxyMakerTest.java
+++ b/sandbox/src/test/java/org/robolectric/internal/bytecode/ProxyMakerTest.java
@@ -23,7 +23,7 @@
 
     Thing mock = mock(Thing.class);
     Thing proxy = maker.createProxyFactory(Thing.class).createProxy(Thing.class, mock);
-    assertThat(proxy.getClass()).isNotSameAs(Thing.class);
+    assertThat(proxy.getClass()).isNotSameInstanceAs(Thing.class);
 
     proxy.returnNothing();
     verify(mock).returnNothing();
@@ -45,7 +45,7 @@
     Thing proxy1 = maker.createProxy(Thing.class, thing1);
     Thing proxy2 = maker.createProxy(Thing.class, thing2);
 
-    assertThat(proxy1.getClass()).isSameAs(proxy2.getClass());
+    assertThat(proxy1.getClass()).isSameInstanceAs(proxy2.getClass());
   }
 
   public static class Thing {
diff --git a/shadowapi/Android.bp b/shadowapi/Android.bp
index c918180..ad3841e 100644
--- a/shadowapi/Android.bp
+++ b/shadowapi/Android.bp
@@ -2,6 +2,15 @@
 // Compile Robolectric shadowapi
 //#############################################
 
+package {
+    // See: http://go/android-license-faq
+    // A large-scale-change added 'default_applicable_licenses' to import
+    // all of the 'license_kinds' from "external_robolectric-shadows_license"
+    // to get the below license kinds:
+    //   SPDX-license-identifier-Apache-2.0
+    default_applicable_licenses: ["external_robolectric-shadows_license"],
+}
+
 java_library_host {
     name: "Robolectric_shadowapi",
     libs: ["jsr305"],
diff --git a/shadowapi/Android.mk b/shadowapi/Android.mk
index fd9d746..97baf69 100644
--- a/shadowapi/Android.mk
+++ b/shadowapi/Android.mk
@@ -6,6 +6,9 @@
 include $(CLEAR_VARS)
 
 LOCAL_MODULE := Run_robolectric_shadowapi_tests
+LOCAL_LICENSE_KINDS := SPDX-license-identifier-Apache-2.0
+LOCAL_LICENSE_CONDITIONS := notice
+LOCAL_NOTICE_FILE := $(LOCAL_PATH)/../LICENSE
 
 test_source_directory := $(LOCAL_PATH)/src/test/java
 
diff --git a/shadowapi/src/test/java/org/robolectric/util/ReflectionHelpersTest.java b/shadowapi/src/test/java/org/robolectric/util/ReflectionHelpersTest.java
index 9c3afc4..40c007f 100644
--- a/shadowapi/src/test/java/org/robolectric/util/ReflectionHelpersTest.java
+++ b/shadowapi/src/test/java/org/robolectric/util/ReflectionHelpersTest.java
@@ -1,6 +1,7 @@
 package org.robolectric.util;
 
 import static com.google.common.truth.Truth.assertThat;
+import static com.google.common.truth.Truth.assertWithMessage;
 import static org.junit.Assert.fail;
 
 import java.lang.reflect.Field;
@@ -88,8 +89,8 @@
     int startingValue = ReflectionHelpers.getStaticField(field);
 
     ReflectionHelpers.setStaticField(field, 7);
-    assertThat(startingValue).named("startingValue").isEqualTo(6);
-    assertThat(ExampleDescendant.DESCENDANT).named("DESCENDENT").isEqualTo(7);
+    assertWithMessage("startingValue").that(startingValue).isEqualTo(6);
+    assertWithMessage("DESCENDENT").that(ExampleDescendant.DESCENDANT).isEqualTo(7);
 
     /// Reset the value to avoid test pollution
     ReflectionHelpers.setStaticField(field, startingValue);
@@ -100,8 +101,8 @@
     int startingValue = ReflectionHelpers.getStaticField(ExampleDescendant.class, "DESCENDANT");
 
     ReflectionHelpers.setStaticField(ExampleDescendant.class, "DESCENDANT", 7);
-    assertThat(startingValue).named("startingValue").isEqualTo(6);
-    assertThat(ExampleDescendant.DESCENDANT).named("DESCENDENT").isEqualTo(7);
+    assertWithMessage("startingValue").that(startingValue).isEqualTo(6);
+    assertWithMessage("DESCENDENT").that(ExampleDescendant.DESCENDANT).isEqualTo(7);
 
     // Reset the value to avoid test pollution
     ReflectionHelpers.setStaticField(ExampleDescendant.class, "DESCENDANT", startingValue);
@@ -257,8 +258,8 @@
   @Test
   public void callConstructorReflectively_whenMultipleSignaturesExistForTheConstructor_callsConstructorWithCorrectSignature() {
     ExampleClass ec = ReflectionHelpers.callConstructor(ExampleClass.class, ClassParameter.from(int.class, 16));
-    assertThat(ec.index).named("index").isEqualTo(16);
-    assertThat(ec.name).named("name").isNull();
+    assertWithMessage("index").that(ec.index).isEqualTo(16);
+    assertWithMessage("name").that(ec.name).isNull();
   }
 
   @SuppressWarnings("serial")
diff --git a/shadows/androidx/fragment/Android.bp b/shadows/androidx/fragment/Android.bp
index 160cbe8..fccd672 100644
--- a/shadows/androidx/fragment/Android.bp
+++ b/shadows/androidx/fragment/Android.bp
@@ -2,6 +2,15 @@
 // Compile Robolectric shadows androidx fragment                #
 //###############################################################
 
+package {
+    // See: http://go/android-license-faq
+    // A large-scale-change added 'default_applicable_licenses' to import
+    // all of the 'license_kinds' from "external_robolectric-shadows_license"
+    // to get the below license kinds:
+    //   SPDX-license-identifier-MIT
+    default_applicable_licenses: ["external_robolectric-shadows_license"],
+}
+
 java_library_host {
     name: "Robolectric_shadows_androidx_fragment",
     static_libs: [
diff --git a/shadows/androidx/fragment/Android.mk b/shadows/androidx/fragment/Android.mk
index 6de68e9..6b538e3 100644
--- a/shadows/androidx/fragment/Android.mk
+++ b/shadows/androidx/fragment/Android.mk
@@ -22,6 +22,9 @@
 
 LOCAL_PROGUARD_ENABLED := disabled
 
+LOCAL_LICENSE_KINDS := SPDX-license-identifier-MIT
+LOCAL_LICENSE_CONDITIONS := notice
+LOCAL_NOTICE_FILE := $(LOCAL_PATH)/../../../LICENSE
 include $(BUILD_PACKAGE)
 
 ################################################################
@@ -30,6 +33,9 @@
 include $(CLEAR_VARS)
 
 LOCAL_MODULE := Robolectric_shadows_androidx_fragment_tests
+LOCAL_LICENSE_KINDS := SPDX-license-identifier-MIT
+LOCAL_LICENSE_CONDITIONS := notice
+LOCAL_NOTICE_FILE := $(LOCAL_PATH)/../../../LICENSE
 LOCAL_MODULE_CLASS := JAVA_LIBRARIES
 
 LOCAL_SRC_FILES := $(call all-java-files-under, src/test/java)
@@ -58,6 +64,9 @@
 include $(CLEAR_VARS)
 
 LOCAL_MODULE := Run_robolectric_shadows_androidx_fragment_tests
+LOCAL_LICENSE_KINDS := SPDX-license-identifier-MIT
+LOCAL_LICENSE_CONDITIONS := notice
+LOCAL_NOTICE_FILE := $(LOCAL_PATH)/../../../LICENSE
 
 LOCAL_JAVA_LIBRARIES := \
     Robolectric_shadows_androidx_fragment_tests \
diff --git a/shadows/framework/Android.bp b/shadows/framework/Android.bp
index 55ebfe1..28a7108 100644
--- a/shadows/framework/Android.bp
+++ b/shadows/framework/Android.bp
@@ -2,6 +2,15 @@
 // Compile Robolectric shadows framework
 //#############################################
 
+package {
+    // See: http://go/android-license-faq
+    // A large-scale-change added 'default_applicable_licenses' to import
+    // all of the 'license_kinds' from "external_robolectric-shadows_license"
+    // to get the below license kinds:
+    //   SPDX-license-identifier-Apache-2.0
+    default_applicable_licenses: ["external_robolectric-shadows_license"],
+}
+
 java_library_host {
     name: "Robolectric_shadows_framework",
     libs: [
diff --git a/shadows/framework/src/main/java/org/robolectric/shadows/ShadowActivity.java b/shadows/framework/src/main/java/org/robolectric/shadows/ShadowActivity.java
index 64ac51e..4a81b00 100644
--- a/shadows/framework/src/main/java/org/robolectric/shadows/ShadowActivity.java
+++ b/shadows/framework/src/main/java/org/robolectric/shadows/ShadowActivity.java
@@ -210,7 +210,7 @@
           ReflectionHelpers.ClassParameter.from(
               ViewRootImpl.ActivityConfigCallback.class, null) // ADDED
           );
-    } else if (apiLevel >= Build.VERSION_CODES.Q) {
+    } else if (apiLevel <= Build.VERSION_CODES.R) {
       ReflectionHelpers.callInstanceMethod(
           Activity.class,
           realActivity,
@@ -237,6 +237,34 @@
                   ViewRootImpl.ActivityConfigCallback.class, null),
           ReflectionHelpers.ClassParameter.from(IBinder.class, null) // ADDED
       );
+    } else if (apiLevel >= Build.VERSION_CODES.S) {
+      ReflectionHelpers.callInstanceMethod(
+              Activity.class,
+              realActivity,
+              "attach",
+              ReflectionHelpers.ClassParameter.from(Context.class, baseContext),
+              ReflectionHelpers.ClassParameter.from(
+                      ActivityThread.class, RuntimeEnvironment.getActivityThread()),
+              ReflectionHelpers.ClassParameter.from(Instrumentation.class, instrumentation),
+              ReflectionHelpers.ClassParameter.from(IBinder.class, null),
+              ReflectionHelpers.ClassParameter.from(int.class, 0),
+              ReflectionHelpers.ClassParameter.from(Application.class, application),
+              ReflectionHelpers.ClassParameter.from(Intent.class, intent),
+              ReflectionHelpers.ClassParameter.from(ActivityInfo.class, activityInfo),
+              ReflectionHelpers.ClassParameter.from(CharSequence.class, activityTitle),
+              ReflectionHelpers.ClassParameter.from(Activity.class, null),
+              ReflectionHelpers.ClassParameter.from(String.class, "id"),
+              ReflectionHelpers.ClassParameter.from(nonConfigurationInstancesClass, null),
+              ReflectionHelpers.ClassParameter.from(
+                      Configuration.class, application.getResources().getConfiguration()),
+              ReflectionHelpers.ClassParameter.from(String.class, "referrer"),
+              ReflectionHelpers.ClassParameter.from(IVoiceInteractor.class, null),
+              ReflectionHelpers.ClassParameter.from(Window.class, null),
+              ReflectionHelpers.ClassParameter.from(
+                      ViewRootImpl.ActivityConfigCallback.class, null),
+              ReflectionHelpers.ClassParameter.from(IBinder.class, null), // ADDED
+              ReflectionHelpers.ClassParameter.from(IBinder.class, null) // ADDED
+      );
     } else {
       throw new RuntimeException("Could not find AndroidRuntimeAdapter for API level: " + apiLevel);
     }
diff --git a/shadows/framework/src/main/java/org/robolectric/shadows/ShadowActivityClient.java b/shadows/framework/src/main/java/org/robolectric/shadows/ShadowActivityClient.java
new file mode 100644
index 0000000..02684bb
--- /dev/null
+++ b/shadows/framework/src/main/java/org/robolectric/shadows/ShadowActivityClient.java
@@ -0,0 +1,21 @@
+// BEGIN-INTERNAL
+
+package org.robolectric.shadows;
+
+import static android.os.Build.VERSION_CODES.S;
+
+import android.app.ActivityClient;
+import android.app.IActivityClientController;
+import org.robolectric.annotation.Implementation;
+import org.robolectric.annotation.Implements;
+import org.robolectric.util.ReflectionHelpers;
+
+@Implements(value = ActivityClient.class, minSdk = S, isInAndroidSdk = false)
+public class ShadowActivityClient {
+  @Implementation
+  protected static IActivityClientController getActivityClientController() {
+    return (IActivityClientController) ReflectionHelpers.createNullProxy(
+      IActivityClientController.class);
+  }
+}
+// END-INTERNAL
diff --git a/shadows/framework/src/main/java/org/robolectric/shadows/ShadowAppOpsManager.java b/shadows/framework/src/main/java/org/robolectric/shadows/ShadowAppOpsManager.java
index 04a2f79..42ccbfb 100644
--- a/shadows/framework/src/main/java/org/robolectric/shadows/ShadowAppOpsManager.java
+++ b/shadows/framework/src/main/java/org/robolectric/shadows/ShadowAppOpsManager.java
@@ -142,7 +142,12 @@
     return unsafeCheckOpRawNoThrow(AppOpsManager.strOpToOp(op), uid, packageName);
   }
 
-  private int unsafeCheckOpRawNoThrow(int op, int uid, String packageName) {
+  /**
+   * Returns the <em>raw</em> mode associated with the op.
+   * Does not throw a security exception, does not translate {@link AppOpsManager#MODE_FOREGROUND}.
+   */
+  @Implementation(minSdk = Q)
+  protected int unsafeCheckOpRawNoThrow(int op, int uid, String packageName) {
     Integer mode = appModeMap.get(getOpMapKey(uid, packageName, op));
     if (mode == null) {
       return AppOpsManager.MODE_ALLOWED;
diff --git a/shadows/framework/src/main/java/org/robolectric/shadows/ShadowApplicationPackageManager.java b/shadows/framework/src/main/java/org/robolectric/shadows/ShadowApplicationPackageManager.java
index 118d2f6..82cc3ff 100644
--- a/shadows/framework/src/main/java/org/robolectric/shadows/ShadowApplicationPackageManager.java
+++ b/shadows/framework/src/main/java/org/robolectric/shadows/ShadowApplicationPackageManager.java
@@ -118,7 +118,7 @@
 
   private Context context;
 
-  @Implementation(maxSdk = Q)
+  @Implementation
   protected void __constructor__(Object contextImpl, Object pm) {
     try {
       invokeConstructor(
@@ -133,7 +133,7 @@
   }
 
   // BEGIN-INTERNAL
-  @Implementation(minSdk = R)
+  @Implementation(minSdk = R, maxSdk = R)
   protected void __constructor__(
           Object contextImpl, Object packageManager, Object permissionManager) {
     try {
diff --git a/shadows/framework/src/main/java/org/robolectric/shadows/ShadowArscApkAssets9.java b/shadows/framework/src/main/java/org/robolectric/shadows/ShadowArscApkAssets9.java
index 2b9be09..80a8439 100644
--- a/shadows/framework/src/main/java/org/robolectric/shadows/ShadowArscApkAssets9.java
+++ b/shadows/framework/src/main/java/org/robolectric/shadows/ShadowArscApkAssets9.java
@@ -120,6 +120,13 @@
     ApkAssets call();
   }
 
+  // BEGIN-INTERNAL
+  // Overwrite ApkAssets.java to prevent clearing out the apk assets
+  @Implementation(minSdk = Build.VERSION_CODES.S)
+  protected void close() {
+  }
+  // END-INTERNAL
+
   private static ApkAssets getFromCacheOrLoad(Key key, ApkAssetMaker callable) {
     synchronized (cachedApkAssets) {
       WeakReference<ApkAssets> cachedRef = cachedApkAssets.get(key);
diff --git a/shadows/framework/src/main/java/org/robolectric/shadows/ShadowBitmapFactory.java b/shadows/framework/src/main/java/org/robolectric/shadows/ShadowBitmapFactory.java
index 6b164b8..0f0106a 100644
--- a/shadows/framework/src/main/java/org/robolectric/shadows/ShadowBitmapFactory.java
+++ b/shadows/framework/src/main/java/org/robolectric/shadows/ShadowBitmapFactory.java
@@ -125,7 +125,8 @@
         : null;
     Point imageSize = (is instanceof NamedStream) ? null : getImageSizeFromStream(is);
     Bitmap bitmap = create(name, opts, imageSize);
-    bitmap.setNinePatchChunk(ninePatchChunk);
+    ReflectionHelpers.callInstanceMethod(bitmap, "setNinePatchChunk",
+            ClassParameter.from(byte[].class, ninePatchChunk));
     ShadowBitmap shadowBitmap = Shadow.extract(bitmap);
     shadowBitmap.createdFromStream = is;
     return bitmap;
diff --git a/shadows/framework/src/main/java/org/robolectric/shadows/ShadowCompatibility.java b/shadows/framework/src/main/java/org/robolectric/shadows/ShadowCompatibility.java
new file mode 100644
index 0000000..00f2180
--- /dev/null
+++ b/shadows/framework/src/main/java/org/robolectric/shadows/ShadowCompatibility.java
@@ -0,0 +1,17 @@
+package org.robolectric.shadows;
+
+import static android.os.Build.VERSION_CODES.S;
+
+import android.compat.Compatibility;
+
+import org.robolectric.annotation.Implementation;
+import org.robolectric.annotation.Implements;
+
+@Implements(value = Compatibility.class, minSdk = S)
+public class ShadowCompatibility {
+  // override to avoid calling to System.logW in the uninstrumented interface default method
+  @Implementation
+  public static boolean isChangeEnabled(long changeId) {
+    return true;
+  }
+}
diff --git a/shadows/framework/src/main/java/org/robolectric/shadows/ShadowDevicePolicyManager.java b/shadows/framework/src/main/java/org/robolectric/shadows/ShadowDevicePolicyManager.java
index b5c6755..0009bd1 100644
--- a/shadows/framework/src/main/java/org/robolectric/shadows/ShadowDevicePolicyManager.java
+++ b/shadows/framework/src/main/java/org/robolectric/shadows/ShadowDevicePolicyManager.java
@@ -657,6 +657,11 @@
     wipeCalled++;
   }
 
+  @Implementation
+  protected void wipeData(int flags, CharSequence reason) {
+    wipeData(flags);
+  }
+
   public long getWipeCalledTimes() {
     return wipeCalled;
   }
diff --git a/shadows/framework/src/main/java/org/robolectric/shadows/ShadowLocaleData.java b/shadows/framework/src/main/java/org/robolectric/shadows/ShadowLocaleData.java
index b8d0da7..50f58f1 100644
--- a/shadows/framework/src/main/java/org/robolectric/shadows/ShadowLocaleData.java
+++ b/shadows/framework/src/main/java/org/robolectric/shadows/ShadowLocaleData.java
@@ -5,6 +5,7 @@
 import static android.os.Build.VERSION_CODES.LOLLIPOP;
 import static android.os.Build.VERSION_CODES.LOLLIPOP_MR1;
 import static android.os.Build.VERSION_CODES.M;
+import static android.os.Build.VERSION_CODES.Q;
 import static org.robolectric.RuntimeEnvironment.getApiLevel;
 
 import java.util.Locale;
@@ -47,7 +48,6 @@
       localeData.tinyWeekdayNames = new String[]{"", "S", "M", "T", "W", "T", "F", "S"};
       localeData.tinyStandAloneWeekdayNames = localeData.tinyWeekdayNames;
 
-      localeData.yesterday = "Yesterday";
       localeData.today = "Today";
       localeData.tomorrow = "Tomorrow";
     }
@@ -114,8 +114,12 @@
     localeData.infinity = "\u221E";
     localeData.NaN = "NaN";
 
-    localeData.currencySymbol = "$";
-    localeData.internationalCurrencySymbol = "USD";
+    // These fields are removed in Android R or later
+    if (getApiLevel() <= Q) {
+      ReflectionHelpers.setField(localeData, "currencySymbol", "$");
+      ReflectionHelpers.setField(localeData, "internationalCurrencySymbol", "USD");
+      ReflectionHelpers.setField(localeData, "yesterday", "Yesterday");
+    }
 
     localeData.numberPattern = "\u0023,\u0023\u00230.\u0023\u0023\u0023";
     localeData.integerPattern = "\u0023,\u0023\u00230";
diff --git a/shadows/framework/src/main/java/org/robolectric/shadows/ShadowPermissionChecker.java b/shadows/framework/src/main/java/org/robolectric/shadows/ShadowPermissionChecker.java
new file mode 100644
index 0000000..b778651
--- /dev/null
+++ b/shadows/framework/src/main/java/org/robolectric/shadows/ShadowPermissionChecker.java
@@ -0,0 +1,93 @@
+/*
+ * Copyright (C) 2021 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 org.robolectric.shadows;
+
+import android.annotation.NonNull;
+import android.annotation.Nullable;
+import android.content.AttributionSource;
+import android.content.Context;
+import android.content.PermissionChecker;
+
+import org.robolectric.annotation.Implementation;
+import org.robolectric.annotation.Implements;
+
+import java.util.HashMap;
+import java.util.Map;
+
+/** Shadow class of {@link PermissionChecker}. */
+@Implements(PermissionChecker.class)
+public class ShadowPermissionChecker {
+
+    private static final Map<String, Map<String, Integer>> RESULTS = new HashMap<>();
+
+    /** Set the result of permission check for a specific permission. */
+    public static void setResult(String packageName, String permission, int result) {
+        if (!RESULTS.containsKey(packageName)) {
+            RESULTS.put(packageName, new HashMap<>());
+        }
+        RESULTS.get(packageName).put(permission, result);
+    }
+
+    /** Check the permission of calling package. */
+    @Implementation
+    public static int checkCallingPermissionForDataDelivery(
+            Context context,
+            String permission,
+            String packageName,
+            String attributionTag,
+            String message) {
+        return RESULTS.containsKey(packageName) && RESULTS.get(packageName).containsKey(permission)
+                ? RESULTS.get(packageName).get(permission)
+                : PermissionChecker.checkCallingPermissionForDataDelivery(
+                        context, permission, packageName, attributionTag, message);
+    }
+
+    /** Check general permission. */
+    @Implementation
+    public static int checkPermissionForDataDelivery(
+            Context context,
+            String permission,
+            int pid,
+            int uid,
+            String packageName,
+            String attributionTag,
+            String message) {
+        return RESULTS.containsKey(packageName) && RESULTS.get(packageName).containsKey(permission)
+                ? RESULTS.get(packageName).get(permission)
+                : PermissionChecker.checkPermissionForDataDelivery(
+                        context, permission, pid, uid, packageName, attributionTag, message);
+    }
+
+    /** Check general permission. */
+    @Implementation
+    public static int checkPermissionForPreflight(@NonNull Context context,
+            @NonNull String permission, int pid, int uid, @Nullable String packageName) {
+        return checkPermissionForPreflight(context, permission, new AttributionSource(
+                uid, packageName, null /*attributionTag*/));
+    }
+
+    /** Check general permission. */
+    @Implementation
+    public static int checkPermissionForPreflight(@NonNull Context context,
+            @NonNull String permission, @NonNull AttributionSource attributionSource) {
+        final String packageName = attributionSource.getPackageName();
+        return RESULTS.containsKey(packageName) && RESULTS.get(packageName).containsKey(permission)
+                ? RESULTS.get(packageName).get(permission)
+                : PermissionChecker.checkPermissionForPreflight(
+                        context, permission, attributionSource);
+    }
+}
diff --git a/shadows/framework/src/main/java/org/robolectric/shadows/ShadowPermissionManager.java b/shadows/framework/src/main/java/org/robolectric/shadows/ShadowPermissionManager.java
new file mode 100644
index 0000000..948965f
--- /dev/null
+++ b/shadows/framework/src/main/java/org/robolectric/shadows/ShadowPermissionManager.java
@@ -0,0 +1,22 @@
+// BEGIN-INTERNAL
+
+package org.robolectric.shadows;
+
+import static android.os.Build.VERSION_CODES.S;
+
+import android.permission.PermissionManager;
+
+import org.robolectric.annotation.Implementation;
+import org.robolectric.annotation.Implements;
+
+import java.util.Collections;
+import java.util.List;
+
+@Implements(value = PermissionManager.class, minSdk = S, isInAndroidSdk = false)
+public class ShadowPermissionManager {
+  @Implementation
+  public List<PermissionManager.SplitPermissionInfo> getSplitPermissions() {
+    return Collections.emptyList();
+  }
+}
+// END-INTERNAL
diff --git a/shadows/framework/src/main/java/org/robolectric/shadows/ShadowServiceManager.java b/shadows/framework/src/main/java/org/robolectric/shadows/ShadowServiceManager.java
index d7dae9b..3c4afda 100644
--- a/shadows/framework/src/main/java/org/robolectric/shadows/ShadowServiceManager.java
+++ b/shadows/framework/src/main/java/org/robolectric/shadows/ShadowServiceManager.java
@@ -10,6 +10,7 @@
 import static android.os.Build.VERSION_CODES.P;
 import static android.os.Build.VERSION_CODES.Q;
 import static android.os.Build.VERSION_CODES.R;
+import static android.os.Build.VERSION_CODES.S;
 
 import android.accounts.IAccountManager;
 import android.app.IAlarmManager;
@@ -17,7 +18,6 @@
 import android.app.ISearchManager;
 import android.app.admin.IDevicePolicyManager;
 import android.app.job.IJobScheduler;
-import android.app.role.IRoleManager;
 import android.app.slice.ISliceManager;
 import android.app.trust.ITrustManager;
 import android.app.usage.IUsageStatsManager;
@@ -38,6 +38,7 @@
 import android.net.IConnectivityManager;
 import android.net.INetworkScoreService;
 import android.net.ITetheringConnector;
+import android.net.IVpnManager;
 import android.net.nsd.INsdManager;
 import android.net.wifi.IWifiManager;
 import android.net.wifi.p2p.IWifiP2pManager;
@@ -52,6 +53,7 @@
 import android.os.RemoteException;
 import android.os.ServiceManager;
 import android.os.storage.IStorageManager;
+import android.permission.IPermissionManager;
 import android.service.persistentdata.IPersistentDataBlockService;
 
 import com.android.internal.app.IAppOpsService;
@@ -205,8 +207,6 @@
           createBinder(INotificationManager.class, "android.app.INotificationManager"));
       map.put(Context.COLOR_DISPLAY_SERVICE, createBinder(IColorDisplayManager.class,
           "android.hardware.display.ColorDisplayManager"));
-      map.put(Context.ROLE_SERVICE,
-              createBinder(IRoleManager.class, "android.app.role.IRoleManager"));
     }
     if (RuntimeEnvironment.getApiLevel() >= R) {
       map.put(Context.TETHERING_SERVICE,
@@ -214,6 +214,12 @@
       map.put(Context.THERMAL_SERVICE,
               createBinder(IThermalService.class, "android.os.IThermalService"));
     }
+    if (RuntimeEnvironment.getApiLevel() >= S) {
+      map.put("permissionmgr",
+              createBinder(IPermissionManager.class, "android.permission.IPermissionManager"));
+      map.put(Context.VPN_MANAGEMENT_SERVICE,
+              createBinder(IVpnManager.class, "android.net.IVpnManager"));
+    }
     // END-INTERNAL
     SERVICES = Collections.unmodifiableMap(map);
   }
diff --git a/shadows/framework/src/main/java/org/robolectric/shadows/ShadowSystemVibrator.java b/shadows/framework/src/main/java/org/robolectric/shadows/ShadowSystemVibrator.java
index 15002b4..b704501 100644
--- a/shadows/framework/src/main/java/org/robolectric/shadows/ShadowSystemVibrator.java
+++ b/shadows/framework/src/main/java/org/robolectric/shadows/ShadowSystemVibrator.java
@@ -7,6 +7,7 @@
 import static android.os.Build.VERSION_CODES.N_MR1;
 import static android.os.Build.VERSION_CODES.O;
 import static android.os.Build.VERSION_CODES.P;
+import static android.os.Build.VERSION_CODES.S;
 
 import android.media.AudioAttributes;
 import android.os.Build.VERSION_CODES;
@@ -14,11 +15,15 @@
 import android.os.Looper;
 import android.os.SystemVibrator;
 import android.os.VibrationEffect;
+import android.os.vibrator.VibrationEffectSegment;
+
 import org.robolectric.RuntimeEnvironment;
 import org.robolectric.annotation.Implementation;
 import org.robolectric.annotation.Implements;
 import org.robolectric.util.ReflectionHelpers;
 
+import java.util.Arrays;
+
 @Implements(value = SystemVibrator.class, isInAndroidSdk = false)
 public class ShadowSystemVibrator extends ShadowVibrator {
 
@@ -72,24 +77,36 @@
 
   @Implementation(minSdk = VERSION_CODES.CUR_DEVELOPMENT)
   protected void vibrate(int uid, String opPkg, VibrationEffect effect,
-      String reason, AudioAttributes attributes) {
-    if (effect instanceof VibrationEffect.Waveform) {
-      VibrationEffect.Waveform waveform = (VibrationEffect.Waveform) effect;
-      recordVibratePattern(waveform.getTimings(), waveform.getRepeatIndex());
-
+          String reason, AudioAttributes attributes) {
+    long duration;
+    if (RuntimeEnvironment.getApiLevel() >= P) {
+      duration = effect.getDuration();
     } else {
-      VibrationEffect.OneShot oneShot = (VibrationEffect.OneShot) effect;
-
-      long timing;
-
-      if (RuntimeEnvironment.getApiLevel() >= P) {
-        timing = oneShot.getDuration();
-      } else {
-        timing = ReflectionHelpers.callInstanceMethod(oneShot, "getTiming");
-      }
-
-      recordVibrate(timing);
+      duration = ReflectionHelpers.callInstanceMethod(effect, "getTiming");
     }
+
+    if (RuntimeEnvironment.getApiLevel() >= S) {
+      long[] pattern = ((VibrationEffect.Composed) effect).getSegments().stream()
+              .mapToLong(VibrationEffectSegment::getDuration)
+              .toArray();
+      int repeatIndex = ((VibrationEffect.Composed) effect).getRepeatIndex();
+      recordVibratePattern(duration, pattern, repeatIndex);
+      return;
+    }
+
+    if (RuntimeEnvironment.getApiLevel() >= O) {
+      try {
+        // Try to extract fields from VibrationEffect.Waveform.
+        long[] pattern = ReflectionHelpers.callInstanceMethod(effect, "getTimings");
+        int repeatIndex = ReflectionHelpers.callInstanceMethod(effect, "getRepeatIndex");
+        recordVibratePattern(pattern, repeatIndex);
+        return;
+      } catch (RuntimeException e) {
+        // Not a VibrationEffect.Waveform, fallback to generic effect.
+      }
+    }
+
+    recordVibrate(duration);
   }
 
   private void recordVibrate(long milliseconds) {
@@ -100,16 +117,18 @@
   }
 
   private void recordVibratePattern(long[] pattern, int repeat) {
+    long duration = repeat < 0 ? Arrays.stream(pattern).sum() : Long.MAX_VALUE;
+    recordVibratePattern(duration, pattern, repeat);
+  }
+
+  private void recordVibratePattern(long milliseconds, long[] pattern, int repeat) {
     vibrating = true;
+    this.milliseconds = milliseconds;
     this.pattern = pattern;
     this.repeat = repeat;
     handler.removeCallbacks(stopVibratingRunnable);
-    if (repeat < 0) {
-      long endDelayMillis = 0;
-      for (long t : pattern) {
-        endDelayMillis += t;
-      }
-      handler.postDelayed(stopVibratingRunnable, endDelayMillis);
+    if (milliseconds < Long.MAX_VALUE) {
+      handler.postDelayed(stopVibratingRunnable, milliseconds);
     }
   }
 
diff --git a/shadows/framework/src/main/java/org/robolectric/shadows/ShadowTimeZoneFinderQ.java b/shadows/framework/src/main/java/org/robolectric/shadows/ShadowTimeZoneFinderQ.java
index 761a39b..94c20c3 100644
--- a/shadows/framework/src/main/java/org/robolectric/shadows/ShadowTimeZoneFinderQ.java
+++ b/shadows/framework/src/main/java/org/robolectric/shadows/ShadowTimeZoneFinderQ.java
@@ -2,30 +2,40 @@
 package org.robolectric.shadows;
 
 import static android.os.Build.VERSION_CODES.Q;
+import static android.os.Build.VERSION_CODES.R;
 import static java.nio.charset.StandardCharsets.UTF_8;
 
 import java.io.BufferedReader;
 import java.io.IOException;
 import java.io.InputStream;
 import java.io.InputStreamReader;
-import libcore.timezone.TimeZoneFinder;
 import org.robolectric.annotation.Implementation;
 import org.robolectric.annotation.Implements;
+import org.robolectric.util.ReflectionHelpers;
+import org.robolectric.util.ReflectionHelpers.ClassParameter;
 
-/** Shadow for TimeZoneFinder on Q or above. */
+/** Shadow for TimeZoneFinder on Q,R. */
 @Implements(
-    value = TimeZoneFinder.class,
+    className = "libcore.timezone.TimeZoneFinder",
     minSdk = Q,
+    maxSdk = R,
     isInAndroidSdk = false,
     looseSignatures = true)
 public class ShadowTimeZoneFinderQ {
 
   private static final String TZLOOKUP_PATH = "/usr/share/zoneinfo/tzlookup.xml";
 
-  @Implementation
-  protected static Object getInstance() {
-    return TimeZoneFinder.createInstanceForTests(readTzlookup());
-  }
+    @Implementation
+    protected static Object getInstance() {
+      try {
+        return ReflectionHelpers.callStaticMethod(
+            Class.forName("libcore.timezone.TimeZoneFinder"),
+            "createInstanceForTests",
+            ClassParameter.from(String.class, readTzlookup()));
+      } catch (ClassNotFoundException e) {
+        throw new RuntimeException(e);
+      }
+    }
 
   /**
    * Reads tzlookup.xml from the files bundled inside android-all JARs. We need to read the file
diff --git a/shadows/framework/src/main/java/org/robolectric/shadows/ShadowTimeZoneFinderS.java b/shadows/framework/src/main/java/org/robolectric/shadows/ShadowTimeZoneFinderS.java
new file mode 100644
index 0000000..4a6e680
--- /dev/null
+++ b/shadows/framework/src/main/java/org/robolectric/shadows/ShadowTimeZoneFinderS.java
@@ -0,0 +1,73 @@
+/*
+ * Copyright (C) 2020 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.
+ */
+
+// BEGIN-INTERNAL
+package org.robolectric.shadows;
+
+import static android.os.Build.VERSION_CODES.S;
+import static java.nio.charset.StandardCharsets.UTF_8;
+
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import com.android.i18n.timezone.TimeZoneFinder;
+import org.robolectric.annotation.Implementation;
+import org.robolectric.annotation.Implements;
+
+/** Shadow for TimeZoneFinder on S or above. */
+@Implements(
+    value = TimeZoneFinder.class,
+    minSdk = S,
+    isInAndroidSdk = false,
+    looseSignatures = true)
+public class ShadowTimeZoneFinderS {
+
+  private static final String TZLOOKUP_PATH = "/usr/share/zoneinfo/tzlookup.xml";
+
+  @Implementation
+  protected static Object getInstance() {
+    return TimeZoneFinder.createInstanceForTests(readTzlookup());
+  }
+
+  /**
+   * Reads tzlookup.xml from the files bundled inside android-all JARs. We need to read the file
+   * instead of passing in the path because the real implementation uses {@link java.nio.file.Paths}
+   * which doesn't support reading from JARs.
+   */
+  private static String readTzlookup() {
+    StringBuilder stringBuilder = new StringBuilder();
+    InputStream is = null;
+    try {
+      try {
+        is = ShadowTimeZoneFinder.class.getResourceAsStream(TZLOOKUP_PATH);
+        BufferedReader reader = new BufferedReader(new InputStreamReader(is, UTF_8));
+        for (String line; (line = reader.readLine()) != null; ) {
+          stringBuilder.append(line);
+        }
+      } finally {
+        if (is != null) {
+          is.close();
+        }
+      }
+    } catch (IOException e) {
+      // ignore
+    }
+
+    return stringBuilder.toString();
+  }
+}
+// END-INTERNAL
diff --git a/shadows/framework/src/main/java/org/robolectric/shadows/ShadowToast.java b/shadows/framework/src/main/java/org/robolectric/shadows/ShadowToast.java
index f560eb9..d31408f 100644
--- a/shadows/framework/src/main/java/org/robolectric/shadows/ShadowToast.java
+++ b/shadows/framework/src/main/java/org/robolectric/shadows/ShadowToast.java
@@ -1,9 +1,11 @@
 package org.robolectric.shadows;
 
 import android.content.Context;
+import android.os.Looper;
 import android.view.View;
 import android.widget.TextView;
 import android.widget.Toast;
+
 import java.util.List;
 import org.robolectric.RuntimeEnvironment;
 import org.robolectric.annotation.Implementation;
@@ -27,6 +29,11 @@
   @Implementation
   protected void __constructor__(Context context) {}
 
+  // BEGIN-INTERNAL
+  @Implementation
+  protected void __constructor__(Context context, Looper looper) {}
+  // END-INTERNAL
+
   @Implementation
   protected static Toast makeText(Context context, int resId, int duration) {
     return makeText(context, context.getResources().getString(resId), duration);
diff --git a/shadows/framework/src/main/java/org/robolectric/shadows/ShadowTypeface.java b/shadows/framework/src/main/java/org/robolectric/shadows/ShadowTypeface.java
index 343f030..e344b5b 100644
--- a/shadows/framework/src/main/java/org/robolectric/shadows/ShadowTypeface.java
+++ b/shadows/framework/src/main/java/org/robolectric/shadows/ShadowTypeface.java
@@ -5,6 +5,7 @@
 import static android.os.Build.VERSION_CODES.O;
 import static android.os.Build.VERSION_CODES.O_MR1;
 import static android.os.Build.VERSION_CODES.P;
+import static android.os.Build.VERSION_CODES.S;
 import static org.robolectric.RuntimeEnvironment.getApiLevel;
 
 import android.annotation.SuppressLint;
@@ -131,6 +132,13 @@
   }
 
   // BEGIN-INTERNAL
+  @Implementation(minSdk = S)
+  public static Typeface defaultFromStyle(int style) {
+    return createUnderlyingTypeface(/* familyName= */ null, style);
+  }
+  // END-INTERNAL
+
+  // BEGIN-INTERNAL
   @HiddenApi
   @Implementation(minSdk = android.os.Build.VERSION_CODES.Q)
   public static void initSystemDefaultTypefaces(Object systemFontMap,
diff --git a/shadows/framework/src/main/java/org/robolectric/shadows/ShadowUserManager.java b/shadows/framework/src/main/java/org/robolectric/shadows/ShadowUserManager.java
index 3223c3c..44996fa 100644
--- a/shadows/framework/src/main/java/org/robolectric/shadows/ShadowUserManager.java
+++ b/shadows/framework/src/main/java/org/robolectric/shadows/ShadowUserManager.java
@@ -119,6 +119,11 @@
     return ImmutableList.copyOf(userProfiles.keySet());
   }
 
+  @Implementation
+  public List<UserHandle> getAllProfiles() {
+    return getUserProfiles();
+  }
+
   /**
    * If any profiles have been added using {@link #addProfile}, return those profiles.
    *
@@ -260,6 +265,12 @@
     bundle.putBoolean(restrictionKey, value);
   }
 
+  @Implementation(minSdk = JELLY_BEAN_MR2)
+  protected void setUserRestriction(String key, boolean value) {
+    Bundle bundle = getUserRestrictionsForUser(Process.myUserHandle());
+    bundle.putBoolean(key, value);
+  }
+
   /**
    * Removes all user restrictions set of a user identified by {@code userHandle}.
    */
@@ -619,4 +630,4 @@
       userPidMap.put(UserHandle.USER_SYSTEM, Process.myUid());
     }
   }
-}
\ No newline at end of file
+}
diff --git a/shadows/framework/src/main/java/org/robolectric/shadows/ShadowViewRootImpl.java b/shadows/framework/src/main/java/org/robolectric/shadows/ShadowViewRootImpl.java
index 964cdda..c42e507 100644
--- a/shadows/framework/src/main/java/org/robolectric/shadows/ShadowViewRootImpl.java
+++ b/shadows/framework/src/main/java/org/robolectric/shadows/ShadowViewRootImpl.java
@@ -13,6 +13,7 @@
 import android.view.IWindowSession;
 import android.view.ViewRootImpl;
 import android.view.WindowManager;
+import android.window.ClientWindowFrames;
 import java.util.ArrayList;
 import org.robolectric.RuntimeEnvironment;
 import org.robolectric.annotation.Implementation;
@@ -41,6 +42,7 @@
     Rect frame = new Rect();
     display.getRectSize(frame);
     Rect zeroSizedRect = new Rect(0, 0, 0, 0);
+    ClientWindowFrames clientWindowFrame = new ClientWindowFrames();
 
     int apiLevel = RuntimeEnvironment.getApiLevel();
     ViewRootImpl component = realObject;
@@ -116,7 +118,7 @@
           ClassParameter.from(boolean.class, false),
           ClassParameter.from(boolean.class, false),
           ClassParameter.from(int.class, 0));
-    } else if (apiLevel <= Build.VERSION_CODES.P) {
+    } else if (apiLevel <= Build.VERSION_CODES.Q) {
       ReflectionHelpers.callInstanceMethod(ViewRootImpl.class, component, "dispatchResized",
           ClassParameter.from(Rect.class, frame),
           ClassParameter.from(Rect.class, zeroSizedRect),
@@ -132,7 +134,7 @@
           ClassParameter.from(int.class, 0),
           ClassParameter.from(android.view.DisplayCutout.ParcelableWrapper.class,
               new android.view.DisplayCutout.ParcelableWrapper()));
-    } else if (apiLevel >= Build.VERSION_CODES.R) {
+    } else if (apiLevel <= Build.VERSION_CODES.R) {
       // BEGIN-INTERNAL
       ReflectionHelpers.callInstanceMethod(ViewRootImpl.class, component, "dispatchResized",
               ClassParameter.from(Rect.class, frame),
@@ -148,6 +150,16 @@
               ClassParameter.from(android.view.DisplayCutout.ParcelableWrapper.class,
                       new android.view.DisplayCutout.ParcelableWrapper()));
       // END-INTERNAL
+    } else if (apiLevel >= Build.VERSION_CODES.S) {
+      // BEGIN-INTERNAL
+      ReflectionHelpers.callInstanceMethod(ViewRootImpl.class, component, "dispatchResized",
+              ClassParameter.from(ClientWindowFrames.class, clientWindowFrame),
+              ClassParameter.from(boolean.class, true),
+              ClassParameter.from(MergedConfiguration.class, new MergedConfiguration()),
+              ClassParameter.from(boolean.class, false),
+              ClassParameter.from(boolean.class, false),
+              ClassParameter.from(int.class, 0));
+      // END-INTERNAL
     } else {
       throw new RuntimeException("Could not find AndroidRuntimeAdapter for API level: " + apiLevel);
     }
diff --git a/shadows/httpclient/Android.bp b/shadows/httpclient/Android.bp
index 7c8bf9a..613f852 100644
--- a/shadows/httpclient/Android.bp
+++ b/shadows/httpclient/Android.bp
@@ -2,6 +2,15 @@
 // Compile Robolectric shadows httpclient
 //#############################################
 
+package {
+    // See: http://go/android-license-faq
+    // A large-scale-change added 'default_applicable_licenses' to import
+    // all of the 'license_kinds' from "external_robolectric-shadows_license"
+    // to get the below license kinds:
+    //   SPDX-license-identifier-Apache-2.0
+    default_applicable_licenses: ["external_robolectric-shadows_license"],
+}
+
 java_library_host {
     name: "Robolectric_shadows_httpclient",
     libs: [
diff --git a/shadows/httpclient/Android.mk b/shadows/httpclient/Android.mk
index b4c9810..bdb7cfd 100644
--- a/shadows/httpclient/Android.mk
+++ b/shadows/httpclient/Android.mk
@@ -6,6 +6,9 @@
 include $(CLEAR_VARS)
 
 LOCAL_MODULE := Run_robolectric_shadows_httpclient_tests
+LOCAL_LICENSE_KINDS := SPDX-license-identifier-Apache-2.0
+LOCAL_LICENSE_CONDITIONS := notice
+LOCAL_NOTICE_FILE := $(LOCAL_PATH)/../../LICENSE
 
 test_source_directory := $(LOCAL_PATH)/src/test/java
 
diff --git a/shadows/multidex/Android.bp b/shadows/multidex/Android.bp
index fe51793..ba313f8 100644
--- a/shadows/multidex/Android.bp
+++ b/shadows/multidex/Android.bp
@@ -2,6 +2,15 @@
 // Compile Robolectric shadows multidex
 //#############################################
 
+package {
+    // See: http://go/android-license-faq
+    // A large-scale-change added 'default_applicable_licenses' to import
+    // all of the 'license_kinds' from "external_robolectric-shadows_license"
+    // to get the below license kinds:
+    //   SPDX-license-identifier-MIT
+    default_applicable_licenses: ["external_robolectric-shadows_license"],
+}
+
 java_library_host {
     name: "Robolectric_shadows_multidex",
     libs: [
diff --git a/shadows/supportv4/Android.bp b/shadows/supportv4/Android.bp
index 4a79b4f..a1d30f8 100644
--- a/shadows/supportv4/Android.bp
+++ b/shadows/supportv4/Android.bp
@@ -2,6 +2,15 @@
 // Compile Robolectric shadows supportv4
 //#############################################
 
+package {
+    // See: http://go/android-license-faq
+    // A large-scale-change added 'default_applicable_licenses' to import
+    // all of the 'license_kinds' from "external_robolectric-shadows_license"
+    // to get the below license kinds:
+    //   SPDX-license-identifier-MIT
+    default_applicable_licenses: ["external_robolectric-shadows_license"],
+}
+
 java_library_host {
     name: "Robolectric_shadows_supportv4",
     libs: [
@@ -55,4 +64,8 @@
         "jsr305",
     ],
     libs: ["robolectric-host-android_all"],
+    // Robolectric tests do not work well with unit tests setup yet
+    test_options: {
+        unit_test: false,
+    },
 }
diff --git a/shadows/supportv4/Android.mk b/shadows/supportv4/Android.mk
index 648a82a..a222218 100644
--- a/shadows/supportv4/Android.mk
+++ b/shadows/supportv4/Android.mk
@@ -6,6 +6,9 @@
 include $(CLEAR_VARS)
 
 LOCAL_MODULE := Run_robolectric_shadows_supportv4_tests
+LOCAL_LICENSE_KINDS := SPDX-license-identifier-MIT
+LOCAL_LICENSE_CONDITIONS := notice
+LOCAL_NOTICE_FILE := $(LOCAL_PATH)/../../LICENSE
 
 test_source_directory := $(LOCAL_PATH)/src/test/java
 
diff --git a/shadows/supportv4/src/test/java/org/robolectric/shadows/support/v4/ShadowDrawerLayoutTest.java b/shadows/supportv4/src/test/java/org/robolectric/shadows/support/v4/ShadowDrawerLayoutTest.java
index 218abf5..cad128e 100644
--- a/shadows/supportv4/src/test/java/org/robolectric/shadows/support/v4/ShadowDrawerLayoutTest.java
+++ b/shadows/supportv4/src/test/java/org/robolectric/shadows/support/v4/ShadowDrawerLayoutTest.java
@@ -19,7 +19,7 @@
     DrawerLayout drawerLayout = new DrawerLayout(Robolectric.buildActivity(Activity.class).create().get());
     DrawerLayout.DrawerListener mockDrawerListener = mock(DrawerLayout.DrawerListener.class);
     drawerLayout.setDrawerListener(mockDrawerListener);
-    assertThat(shadowOf(drawerLayout).getDrawerListener()).isSameAs(mockDrawerListener);
+    assertThat(shadowOf(drawerLayout).getDrawerListener()).isSameInstanceAs(mockDrawerListener);
   }
 
   private ShadowDrawerLayout shadowOf(DrawerLayout drawerLayout) {
diff --git a/shadows/supportv4/src/test/java/org/robolectric/shadows/support/v4/ShadowSwipeRefreshLayoutTest.java b/shadows/supportv4/src/test/java/org/robolectric/shadows/support/v4/ShadowSwipeRefreshLayoutTest.java
index 7b545d7..c567cd1 100644
--- a/shadows/supportv4/src/test/java/org/robolectric/shadows/support/v4/ShadowSwipeRefreshLayoutTest.java
+++ b/shadows/supportv4/src/test/java/org/robolectric/shadows/support/v4/ShadowSwipeRefreshLayoutTest.java
@@ -21,6 +21,6 @@
     final SwipeRefreshLayout layout = new SwipeRefreshLayout(RuntimeEnvironment.application);
     layout.setOnRefreshListener(listener);
 
-    assertThat(shadowOf(layout).getOnRefreshListener()).isSameAs(listener);
+    assertThat(shadowOf(layout).getOnRefreshListener()).isSameInstanceAs(listener);
   }
 }
diff --git a/soong/Android.bp b/soong/Android.bp
index 816cc28..954cf15 100644
--- a/soong/Android.bp
+++ b/soong/Android.bp
@@ -12,6 +12,15 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
+package {
+    // See: http://go/android-license-faq
+    // A large-scale-change added 'default_applicable_licenses' to import
+    // all of the 'license_kinds' from "external_robolectric-shadows_license"
+    // to get the below license kinds:
+    //   SPDX-license-identifier-Apache-2.0
+    default_applicable_licenses: ["external_robolectric-shadows_license"],
+}
+
 bootstrap_go_package {
     name: "soong-robolectric",
     pkgPath: "android/soong/robolectric",
diff --git a/soong/robolectric.go b/soong/robolectric.go
index 0ef5bd2..cadeb0f 100644
--- a/soong/robolectric.go
+++ b/soong/robolectric.go
@@ -58,7 +58,7 @@
 		"ro.product.model=robolectric",
 		"ro.hardware=robolectric",
 		"ro.build.version.security_patch=" + ctx.Config().PlatformSecurityPatch(),
-		"ro.build.version.sdk=" + ctx.Config().PlatformSdkVersion(),
+		"ro.build.version.sdk=" + ctx.Config().PlatformSdkVersion().String(),
 		"ro.build.version.release=" + ctx.Config().PlatformVersionName(),
 		"ro.build.version.preview_sdk=" + ctx.Config().PlatformPreviewSdkVersion(),
 		// We don't have the API fingerprint available, just use the preview SDK version.
@@ -84,14 +84,14 @@
 
 	b.output = android.PathForModuleGen(ctx, "build.prop")
 
-	rule := android.NewRuleBuilder()
+	rule := android.NewRuleBuilder(pctx, ctx)
 
 	rule.Command().Text("rm").Flag("-f").Output(b.output)
 	for _, l := range lines {
 		rule.Command().Text("echo").Text("'" + l + "'").Text(">>").Output(b.output)
 	}
 
-	rule.Build(pctx, ctx, "build_prop", "robolectric build.prop")
+	rule.Build("build_prop", "robolectric build.prop")
 }
 
 func buildPropsFactory() android.Module {
diff --git a/utils/Android.bp b/utils/Android.bp
index dda4824..aee5d77 100644
--- a/utils/Android.bp
+++ b/utils/Android.bp
@@ -2,6 +2,15 @@
 // Compile Robolectric utils
 //#############################################
 
+package {
+    // See: http://go/android-license-faq
+    // A large-scale-change added 'default_applicable_licenses' to import
+    // all of the 'license_kinds' from "external_robolectric-shadows_license"
+    // to get the below license kinds:
+    //   SPDX-license-identifier-Apache-2.0
+    default_applicable_licenses: ["external_robolectric-shadows_license"],
+}
+
 java_library_host {
     name: "Robolectric_utils",
     srcs: ["src/main/java/**/*.java"],
diff --git a/utils/Android.mk b/utils/Android.mk
index 74f0111..04cd591 100644
--- a/utils/Android.mk
+++ b/utils/Android.mk
@@ -6,6 +6,9 @@
 include $(CLEAR_VARS)
 
 LOCAL_MODULE := Run_robolectric_utils_tests
+LOCAL_LICENSE_KINDS := SPDX-license-identifier-Apache-2.0
+LOCAL_LICENSE_CONDITIONS := notice
+LOCAL_NOTICE_FILE := $(LOCAL_PATH)/../LICENSE
 
 test_source_directory := $(LOCAL_PATH)/src/test/java
 
diff --git a/utils/src/test/java/org/robolectric/util/PerfStatsCollectorTest.java b/utils/src/test/java/org/robolectric/util/PerfStatsCollectorTest.java
index a58d0f4..253cae1 100644
--- a/utils/src/test/java/org/robolectric/util/PerfStatsCollectorTest.java
+++ b/utils/src/test/java/org/robolectric/util/PerfStatsCollectorTest.java
@@ -85,7 +85,7 @@
     }
 
     Collection<Metric> metrics = collector.getMetrics();
-    assertThat(metrics).containsAllOf(
+    assertThat(metrics).containsAtLeast(
         new Metric("event", 1, 10, true),
         new Metric("event", 1, 5, false));
   }
diff --git a/utils/src/test/java/org/robolectric/util/SchedulerTest.java b/utils/src/test/java/org/robolectric/util/SchedulerTest.java
index df3e583..172fc69 100644
--- a/utils/src/test/java/org/robolectric/util/SchedulerTest.java
+++ b/utils/src/test/java/org/robolectric/util/SchedulerTest.java
@@ -1,6 +1,7 @@
 package org.robolectric.util;
 
 import static com.google.common.truth.Truth.assertThat;
+import static com.google.common.truth.Truth.assertWithMessage;
 import static org.robolectric.util.Scheduler.IdleState.CONSTANT_IDLE;
 import static org.robolectric.util.Scheduler.IdleState.PAUSED;
 import static org.robolectric.util.Scheduler.IdleState.UNPAUSED;
@@ -53,7 +54,7 @@
   public void pause_setsIdleState() {
     scheduler.setIdleState(UNPAUSED);
     scheduler.pause();
-    assertThat(scheduler.getIdleState()).isSameAs(PAUSED);
+    assertThat(scheduler.getIdleState()).isSameInstanceAs(PAUSED);
   }
 
   @Test
@@ -61,16 +62,16 @@
   public void idleConstantly_setsIdleState() {
     scheduler.setIdleState(UNPAUSED);
     scheduler.idleConstantly(true);
-    assertThat(scheduler.getIdleState()).isSameAs(CONSTANT_IDLE);
+    assertThat(scheduler.getIdleState()).isSameInstanceAs(CONSTANT_IDLE);
     scheduler.idleConstantly(false);
-    assertThat(scheduler.getIdleState()).isSameAs(UNPAUSED);
+    assertThat(scheduler.getIdleState()).isSameInstanceAs(UNPAUSED);
   }
 
   @Test
   public void unPause_setsIdleState() {
     scheduler.setIdleState(PAUSED);
     scheduler.unPause();
-    assertThat(scheduler.getIdleState()).isSameAs(UNPAUSED);
+    assertThat(scheduler.getIdleState()).isSameInstanceAs(UNPAUSED);
   }
 
   @Test
@@ -82,7 +83,7 @@
     final long time = scheduler.getCurrentTime();
     scheduler.setIdleState(UNPAUSED);
     assertThat(transcript).containsExactly("one", "two");
-    assertThat(scheduler.getCurrentTime()).named("time").isEqualTo(time);
+    assertWithMessage("time").that(scheduler.getCurrentTime()).isEqualTo(time);
   }
 
   @Test
@@ -94,7 +95,7 @@
     final long time = scheduler.getCurrentTime();
     scheduler.setIdleState(CONSTANT_IDLE);
     assertThat(transcript).containsExactly("one", "two", "three");
-    assertThat(scheduler.getCurrentTime()).named("time").isEqualTo(time + 1000);
+    assertWithMessage("time").that(scheduler.getCurrentTime()).isEqualTo(time + 1000);
   }
 
   @Test
@@ -106,7 +107,7 @@
     final long time = scheduler.getCurrentTime();
     scheduler.unPause();
     assertThat(transcript).containsExactly("one", "two");
-    assertThat(scheduler.getCurrentTime()).named("time").isEqualTo(time);
+    assertWithMessage("time").that(scheduler.getCurrentTime()).isEqualTo(time);
   }
 
   @Test
@@ -119,7 +120,7 @@
     final long time = scheduler.getCurrentTime();
     scheduler.idleConstantly(true);
     assertThat(transcript).containsExactly("one", "two", "three");
-    assertThat(scheduler.getCurrentTime()).named("time").isEqualTo(time + 1000);
+    assertWithMessage("time").that(scheduler.getCurrentTime()).isEqualTo(time + 1000);
   }
 
   @Test
@@ -307,14 +308,14 @@
     }, 0);
     scheduler.runOneTask();
     
-    assertThat(order).named("order:first run").containsExactly(1, 2);
-    assertThat(scheduler.size()).named("size:first run").isEqualTo(2);
+    assertWithMessage("order:first run").that(order).containsExactly(1, 2);
+    assertWithMessage("size:first run").that(scheduler.size()).isEqualTo(2);
     scheduler.runOneTask();
-    assertThat(order).named("order:second run").containsExactly(1, 2, 3);
-    assertThat(scheduler.size()).named("size:second run").isEqualTo(1);
+    assertWithMessage("order:second run").that(order).containsExactly(1, 2, 3);
+    assertWithMessage("size:second run").that(scheduler.size()).isEqualTo(1);
     scheduler.runOneTask();
-    assertThat(order).named("order:third run").containsExactly(1, 2, 3, 4);
-    assertThat(scheduler.size()).named("size:second run").isEqualTo(0);
+    assertWithMessage("order:third run").that(order).containsExactly(1, 2, 3, 4);
+    assertWithMessage("size:second run").that(scheduler.size()).isEqualTo(0);
   }
 
   @Test
@@ -335,8 +336,8 @@
       }
     }, 0);
     
-    assertThat(order).named("order").containsExactly(1, 2, 3);
-    assertThat(scheduler.size()).named("size").isEqualTo(0);
+    assertWithMessage("order").that(order).containsExactly(1, 2, 3);
+    assertWithMessage("size").that(scheduler.size()).isEqualTo(0);
   }
 
   @Test
@@ -362,8 +363,8 @@
       }
     }, 0);
     scheduler.advanceToLastPostedRunnable();
-    assertThat(order).named("order").containsExactly(1, 2, 3, 4);
-    assertThat(scheduler.size()).named("size").isEqualTo(0);
+    assertWithMessage("order").that(order).containsExactly(1, 2, 3, 4);
+    assertWithMessage("size").that(scheduler.size()).isEqualTo(0);
   }
 
   @Test
@@ -383,8 +384,8 @@
         order.add(2);
       }
     }, 0);
-    assertThat(order).named("order").containsExactly(1, 2, 3);
-    assertThat(scheduler.size()).named("size").isEqualTo(0);
+    assertWithMessage("order").that(order).containsExactly(1, 2, 3);
+    assertWithMessage("size").that(scheduler.size()).isEqualTo(0);
   }
 
   @Test
@@ -405,12 +406,12 @@
       }
     }, 0);
     
-    assertThat(order).named("order:before").containsExactly(1, 2);
-    assertThat(scheduler.size()).named("size:before").isEqualTo(1);
+    assertWithMessage("order:before").that(order).containsExactly(1, 2);
+    assertWithMessage("size:before").that(scheduler.size()).isEqualTo(1);
     scheduler.advanceToLastPostedRunnable();
-    assertThat(order).named("order:after").containsExactly(1, 2, 3);
-    assertThat(scheduler.size()).named("size:after").isEqualTo(0);
-    assertThat(scheduler.getCurrentTime()).named("time:after").isEqualTo(1 + startTime);
+    assertWithMessage("order:after").that(order).containsExactly(1, 2, 3);
+    assertWithMessage("size:after").that(scheduler.size()).isEqualTo(0);
+    assertWithMessage("time:after").that(scheduler.getCurrentTime()).isEqualTo(1 + startTime);
   }
 
   @Test
@@ -431,9 +432,9 @@
       }
     }, 0);
 
-    assertThat(order).named("order").containsExactly(1, 2, 3);
-    assertThat(scheduler.size()).named("size").isEqualTo(0);
-    assertThat(scheduler.getCurrentTime()).named("time").isEqualTo(1 + startTime);
+    assertWithMessage("order").that(order).containsExactly(1, 2, 3);
+    assertWithMessage("size").that(scheduler.size()).isEqualTo(0);
+    assertWithMessage("time").that(scheduler.getCurrentTime()).isEqualTo(1 + startTime);
   }
 
   @Test